Autor Tema: Problema con Compare y Branch  (Leído 2364 veces)

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

Desconectado anton

  • PIC10
  • *
  • Mensajes: 11
Problema con Compare y Branch
« 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.