TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado 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
-
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.
-
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?
-
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:
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.
-
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:
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. :-/ :-/