TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: anton en 07 de Septiembre de 2010, 04:10:50
-
Hola a todos, estoy programando un dsPIC30F4013, usando el Timer 1 en modo contador asincrono con señal externa, cada vez que cuenta una señal se genera una interrupcion y se atiende a una parte de codigo correspondiente a cada cuenta del timer, desde 1 hasta 58. Inicializo el timer a 0 y el Period a 1, y en cada cuenta incremento el Period de forma que en cada cuenta, se genere interrupcion.
Para identificar cada caso/cuenta uso esta secuencia:
TMR1_1:
MOV #1,W0 ;cargo el numero de cuenta
CP TMR1 ;comparo TMR1 - W0
BRA NZ,TMR1_2 ;si el resultado es diferente de cero, salta a comparar con #2
(codigo a ejecutar si el timer = 1)
TMR1_2:
MOV #2,W0 ;cargo el numero de cuenta
CP TMR1 ;comparo TMR1 - W0
BRA NZ,TMR1_2 ;si el resultado es diferente de cero, salta a comparar con #3
(codigo a ejecutar si el timer = 2)
etc.
...
...
...
El problema es que al utilizar las instrucciones Compare (CP) y Branch (BRA NZ,Etiqueta) el programa no entra al codigo para cada cuenta y
sigue comparando hasta llegar a la ultima cuenta, al #58. Segun yo, la logica para comparacion y salto es correcta, pues al restar dos numeros iguales
el resultado debe ser cero y por ende, se activara la bandera Z del Status Register, entonces no se ejecutara el Branch, y se ejecuta el codigo
correspondiente a esa cuenta.
En el manual advierte que al leer el Timer en modo asincrono con señal externa, la lectura puede generar resultados inesperados.
Alguien detecta algun error ? esta mal aplicada la logica de comparacion y salto ? el error sera producido por la cuenta del timer asincrono ?
este es el codigo de dos cuentas de la interrupcion:
__T1Interrupt:
;; services timer 1 interrupts
BCLR IFS0,#T1IF ;borra la bandera
INC PR1 ;Incrementa el Period 1
TMR1_1: ;TMR1 = 1
MOV #1,W0
CP TMR1
BRA GTU,TMR1_2 ;si TMR1 = 1, ejecuta codigo, si no, salta a TMR1_2
BSET PORTB,#RB9 ;Activa pulso
BTG PORTD,#RD2 ;Cambia el estado del bit de interfaz 3
CALL subDP
retfie
TMR1_2: ;TMR1 = 2
MOV #2,W0
CP TMR1
BRA GTU,TMR1_3 ;si TMR1 = 2, ejecuta codigo, si no, salta a TMR1_3
BTG PORTB,#RB4 ;Activa chispa 1-4
CALL subDP ;Manda llamar a subrutina que busca DP
retfie
TMR1_3: ;TMR1 = 3
....
....
Cualquier ayuda es muy apreciada, gracias.