Autor Tema: Que significa esta expresion?  (Leído 2132 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Que significa esta expresion?
« en: 14 de Septiembre de 2011, 17:27:54 »
Hola:

esta expresión:

movlw ~.9
movwf TMR0

Es equivalente a esta?

movlw .6
movwf TMR0

Es decir, hace el complemento a 1 de 9 por lo que TMR0 se carga con 6


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Que significa esta expresion?
« Respuesta #1 en: 14 de Septiembre de 2011, 18:12:03 »
Hola.

Hace la NOT del valor. En ese caso, por tratarse de un número de 8 bits, hace:

2^8 - 1 - valor = .255 - valor = .255 - .9 = .246 = 0xF6

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Que significa esta expresion?
« Respuesta #2 en: 14 de Septiembre de 2011, 18:51:42 »
Hola.

Hace la NOT del valor. En ese caso, por tratarse de un número de 8 bits, hace:

2^8 - 1 - valor = .255 - valor = .255 - .9 = .246 = 0xF6

Saludos.

veras, esa expresion esta en un libro sobre PICs. te pongo el codigo.




;Este ejemplo consiste en contar, mediante el TMR0, el número de pulsos que se
;aplican por GP2/T0CKI. Cuando se detecten 10 flancos ascendentes se
;produce un cambio de estado en GP0
      
      List   p=12F508      ;Tipo de procesador
      include   "P12F508.INC"   ;Definiciones de registros internos

;Ajusta los valores de la palabra de configuración durante el ensamblaje:
;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
;Estas u otras configuraciones se pueden seleccionar según las necesidades

   __config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC

         org   0x00         ;Vector de Reset

Inicio      movwf   OSCCAL      ;Almacena valor de calibración original
         clrf   GPIO      ;Borra salidas
         movlw   b'11101111'   ;Preescaler 1:1 asignado al TMR0 modo contador
         option            ;flanco ascendente. Pin GP2/TOCKI=T0CKI
         movlw   b'11111110'
         tris   GPIO      ;Configura GP0 como salida
         
Loop      movlw   b'000000001'
         xorwf   GPIO,F      ;GP0 cambia de estado

         movlw   ~.9
         movwf   TMR0      ;El TMR0 se carga con 10-1   
Cont_1      movf   TMR0,W      
         btfss   STATUS,Z   ;Desborda al llegar 10 pulsos
         goto   Cont_1   
         goto   Loop

         end

lo que no entiendo es por que dice que el TMR0 se carga con 10-1. en realidad hace la NOT como has comentado no?

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Que significa esta expresion?
« Respuesta #3 en: 14 de Septiembre de 2011, 19:59:45 »
Lo que pasa es el Timer incrementa su valor, nunca lo decrementa. Entonces, el Timer desborda al pasar de .255 a .0 por tener un contador de 8 bits. Entonces, y sabiendo que el timer se va a incrementar en cada pulso, tendrías que asignarle un valor inicial al timer para que justo desborde con la cantidad de pulsos deseados. En ese caso, se desea que desborde(TMR0 = 0) al contar 10 pulsos en GP2.

Como sabemos que el timer desborda al incrementarse una unidad valiendo 255, podemos entonces calcular que para un prescaler 1:1 el valor que debemos darle al timer para que desborde al incrementarse 10 vece es:
256 - 10 = 246 = 0xF6 = ~.9  en este caso.

Este ejemplo funcionaría de manera idéntica al tuyo, pero de manera más intuitiva pero tiene una posible desventaja que detallo luego:

Código: [Seleccionar]
Loop      movlw   b'000000001'
         xorwf   GPIO,F      ;GP0 cambia de estado

         clrf   TMR0      ;El TMR0 se carga con 0.  
Cont_1      movf   TMR0,W
         xorlw  .10              ;Comparo si llego a 10      
         btfss   STATUS,Z   ;si es 10, Z estara seteado, sino en bajo
         goto   Cont_1        ;falta
         goto   Loop            ;se han contado 10 pulsos.
 
         end

El inconveniente de no utilizar el desbordamiento del timer, es que si queremos luego utilizar esto mediante interrupciones, no vamos a poder hacerlo. el timer0 sólo interrumpe al desbordarse. Por eso la cuenta es como te la ha planteado ese ejemplo.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Que significa esta expresion?
« Respuesta #4 en: 15 de Septiembre de 2011, 12:46:24 »
Lo que pasa es el Timer incrementa su valor, nunca lo decrementa. Entonces, el Timer desborda al pasar de .255 a .0 por tener un contador de 8 bits. Entonces, y sabiendo que el timer se va a incrementar en cada pulso, tendrías que asignarle un valor inicial al timer para que justo desborde con la cantidad de pulsos deseados. En ese caso, se desea que desborde(TMR0 = 0) al contar 10 pulsos en GP2.

Como sabemos que el timer desborda al incrementarse una unidad valiendo 255, podemos entonces calcular que para un prescaler 1:1 el valor que debemos darle al timer para que desborde al incrementarse 10 vece es:
256 - 10 = 246 = 0xF6 = ~.9  en este caso.

Este ejemplo funcionaría de manera idéntica al tuyo, pero de manera más intuitiva pero tiene una posible desventaja que detallo luego:

Código: [Seleccionar]
Loop      movlw   b'000000001'
         xorwf   GPIO,F      ;GP0 cambia de estado

         clrf   TMR0      ;El TMR0 se carga con 0.  
Cont_1      movf   TMR0,W
         xorlw  .10              ;Comparo si llego a 10      
         btfss   STATUS,Z   ;si es 10, Z estara seteado, sino en bajo
         goto   Cont_1        ;falta
         goto   Loop            ;se han contado 10 pulsos.
 
         end

El inconveniente de no utilizar el desbordamiento del timer, es que si queremos luego utilizar esto mediante interrupciones, no vamos a poder hacerlo. el timer0 sólo interrumpe al desbordarse. Por eso la cuenta es como te la ha planteado ese ejemplo.

Saludos.

OK, muchas gracias Bruno. Ya me quedó claro.  :-/   :-/