Autor Tema: problema basico con timer0  (Leído 2218 veces)

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

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
problema basico con timer0
« en: 10 de Junio de 2006, 16:58:00 »
Hola, estoy dando mis primeros pasos con el timer0 (PIC16F84A) y necesito ayuda pues no logro programarlo.
Lo que quiero hacer es muy sencillo. Se trata de hacer la prueba más sencilla para comprobar que salta la rutina del timer0. Tan sólo quiero que cuando salte el timer0 me ponga a 1 el bit 0 del PORTA. O sea que el programa debería arrancar, lanzar el timer0 e inmediatamente debería saltar la interrupción ya que estaría inicializado a un valor muy bajo, sin contador ni nada. Eso sería todo ya que las proximas veces que saltase el timer0 volvería a poner el bit 0 del PORTA a 1 pero ya estaría de antes, así que eso sería lo único. Para ver el valor del PORTA utilizo un led (que está bien pues lo compruebo con el bit1 del PORTA que lo pongo a 1). El caso es que el bit 0 del PORTA se mantiene a 0 y nunca cambia a 1. Bueno ya me he extendido demasiado para explicar lo que viene a ser una chorrada. A continuación pongo el código fuente para ver si me podeis ayudar.  Muchas gracias y un saludo.    :-)




#include "p16f84a.inc"



bank0   udata
   W_save      res   1
   Status_save   res   1   
   PCLATH_save   res   1
   FSR_save   res   1
   contador    res 1


STARTUP   code
   pagesel   main
   goto   main
   nop


InterruptServiceVector
   bcf INTCON,GIE     ;enmascarar int general
   banksel W_save
   movwf   W_save   
   movf   STATUS,W
   clrf   STATUS      
   movwf   Status_save   
   movf   PCLATH,w
   movwf   PCLATH_save   
   movf   FSR,w
   movwf   FSR_save

Process_ISR


   clrwdt
   btfsc   INTCON,T0IF   ; Timer 0
   call timer0         ;llamar rutina del t0 (recargar y borrar flag)
   


EndISR
   clrf   STATUS      ; select bank 0
   movf   FSR_save,w   ; restore the FSR
   movwf   FSR
   movf   PCLATH_save,w   ; restore PCLATH
   movwf   PCLATH
   movf   Status_save,w   ; restore Status
   movwf   STATUS
   swapf   W_save,f   ; restore W without corrupting STATUS
   swapf   W_save,w
    bsf INTCON,GIE      ; habilitar int general   
   retfie
   
code

timer0               ;rutina del timer0  (salta cada 50ms)
     
   bsf PORTA,0
   movlw 0x3c         ;regargar t0
   movwf TMR0
   bcf INTCON,T0IF      ;borrar flag
   return

main   
   clrf   STATUS
   clrf   PORTA
   bsf      STATUS,5
   movlw   0x00
   movwf   TRISA
   bcf      STATUS,5


   bsf INTCON,GIE      ;habilitar int general   
   bsf INTCON,T0IE      ;habilitar int t0
   clrwdt              ;borrar wdt antes de reasignar prescaler
   bsf OPTION_REG,T0CS   ;habilitar t0 por overflow
   bcf OPTION_REG,PSA   ;asignar prescaler a t0
   bsf OPTION_REG,PS0   ;configurar prescaler para incrementarse cada 255 ciclos
   bsf OPTION_REG,PS1
   bsf   OPTION_REG,PS2
   bcf PORTA,0
   bsf PORTA,1
   movlw 0x3c         ;primera carga del timer0
   movwf TMR0                     ;aquí debería lanzarse la temporización


loop   
goto   loop

   end

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: problema basico con timer0
« Respuesta #1 en: 10 de Junio de 2006, 22:32:21 »
Hola black_flowers, no tienes reguistrado las direcciones de RAM que as unsado para variables, y tampoco tienes definidos los vectores de reset y de interrupcion, por lo tanto ese programa nunca funcionara.

Incluso con el compilador da varios errores y mensajes de advertencia.

Un saludo.

Atte. CARLOS.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: problema basico con timer0
« Respuesta #2 en: 12 de Junio de 2006, 19:43:46 »
es que estoy utilizando otro tipo de compilación. El vector de interrupcion y todos los datos de la memoria (equ ... org...) van en otro archivo que se compila junto con este, que es el archivo principal. No se si conoces esa forma de compilar, me imagino que sí. El programa compila perfectamente, el fallo debe de estar en la configuración del timer0. Lo que son las variables, el vector de interrupción y todo eso doy por hecho que está bien (aunque si no encuentro el fallo en la configuración del timer0 tendré que mirar más a fondo para comprobar si está bien el vector de interrupción.

un saludo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: problema basico con timer0
« Respuesta #3 en: 13 de Junio de 2006, 07:06:42 »
HOla. Aca te corrijo el programa:

Cambia esto:

main   
   clrf   STATUS
   clrf   PORTA
   bsf      STATUS,5
   movlw   0x00
   movwf   TRISA
   bcf      STATUS,5


   bsf INTCON,GIE      ;habilitar int general   
   bsf INTCON,T0IE      ;habilitar int t0
   clrwdt              ;borrar wdt antes de reasignar prescaler
   bsf OPTION_REG,T0CS   ;habilitar t0 por overflow
   bcf OPTION_REG,PSA   ;asignar prescaler a t0
   bsf OPTION_REG,PS0   ;configurar prescaler para incrementarse cada 255 ciclos
   bsf OPTION_REG,PS1
   bsf   OPTION_REG,PS2
   bcf PORTA,0
   bsf PORTA,1
   movlw 0x3c         ;primera carga del timer0
   movwf TMR0                     ;aquí debería lanzarse la temporización


loop   
goto   loop


Por esto:

Código: ASM
  1. main
  2.         bsf     STATUS,5
  3.         clrf    TRISA
  4.         bcf     STATUS,5
  5.         clrf    PORTA
  6.  
  7.         bsf     STATUS,5
  8.         movlw   b'11010111'
  9.         movwf   OPTION_REG
  10.         bcf     STATUS,5
  11.  
  12.         bsf     INTCON,T0IE      ;habilitar int t0
  13.         bsf     INTCON,GIE      ;habilitar int general  
  14.  
  15.         bsf     PORTA,1
  16.  
  17.         movlw   0x3c         ;primera carga del timer0
  18.         movwf   TMR0         ;aquí debería lanzarse la temporización
  19.  
  20.  
  21. loop  
  22.         ;clrwdt
  23.         goto    loop

Me tome el privilegio de sacar un par de lineas que estaban de mas, pero que no afectaban al comportamiento del programa en si :mrgreen:

En cuanto a tu error, 2 cosas: no estabas en el banco correcto de memoria para configurar el OPTION_REG y segundo:el bit T0CS(OPTION_REG<5>) debe estar a cero para funcionar como Timer. Vos lo tenias configurado como Counter, y en ese modo, el Timer se incrementa en cada flanco bajo o alto(segun como lo configures) del pin RA4/T0CKI.
Ahora deberia funcionarte.
Exitos
"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 black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: problema basico con timer0
« Respuesta #4 en: 17 de Junio de 2006, 19:25:13 »
efectivamente era eso. MUCHAS GRACIAS!     :)


 

anything