TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: aitorsp en 14 de Septiembre de 2011, 17:27:54

Título: Que significa esta expresion?
Publicado por: aitorsp 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

Título: Re: Que significa esta expresion?
Publicado por: BrunoF 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.
Título: Re: Que significa esta expresion?
Publicado por: aitorsp 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?
Título: Re: Que significa esta expresion?
Publicado por: BrunoF 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.
Título: Re: Que significa esta expresion?
Publicado por: aitorsp 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.  :-/   :-/