TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: asd12 en 28 de Julio de 2003, 12:15:00

Título: ayuda timer1 con interupciones en 16f876
Publicado por: asd12 en 28 de Julio de 2003, 12:15:00
Necesito una rutina de ejemplo del timer1 usando interupciones. Lo he programado y solo funciona cuando no huso interupciones y no se que hago mal. Pondría el programa pero es muy largo.
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: asd12 en 28 de Julio de 2003, 15:45:00
Pongo parte del codigo a ver si veis que me he olvidado.

 ORG  0X00
 goto INICIO
 ORG  0X04
 GOTO  INTER
 ORG  0X05
INICIO bsf STATUS,RP0 ;BANCO1
................
 bsf  PIE1,0  ;activada la peticion de interupcion al desbordarse HL
 bcf STATUS,RP0 ;BANCO0
................
 movlw b"00110001" ;configura el tmr1
 movwf T1CON
 BSF  INTCON,GIE
 BSF  INTCON,PEIE
..............
BUCLE clrwdt
................
goto BUCLE
INTER
  btfss PIR1,0  ;comprueba si hay interupcion
  retfie
  movwf   SALVAW               ;Salva W
       swapf   STATUS,W             ;Invierte STATUS --> W
     movwf   SALVASTATUS          ;Salva STATU
................
   bcf PIR1,0  ;borra el señalizador de interupcion del tmr1
   swapf   SALVASTATUS,W        ;Invierte STATUS --> W
      movwf   STATUS               ;Restaura STATUS
      swapf   SALVAW,F             ;Invierte --> F
      swapf   SALVAW,W             ;Restaura W    
 RETFIE
END
 
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: Sispic en 29 de Julio de 2003, 12:38:00
Prueva asi .

Codigo:


Inter

 movwf   w_temporal         ; Guardas W
 swapf   STATUS, W
 movwf   s_temporal         ; Guardas STATUS
 movf    PCLATH, W  
 movwf   p_temporal        ;Guardas PCLATH
 
 ; * Inhibir interrupciones

 ;   Tu rutina de interrupcion
 ;   Comprobar lo que quieras
 ;   bla ,bla , bla

 ; * Activar interrupciones

 movf   p_temporal,w      
 movwf   PCLATH              ;Restauras PCLATH
 swapf   s_temporal,w
 movwf   STATUS              ;Restauras  STATUS
 swapf   w_temporal,f
 swapf   w_temporal,w       ;Restauras  W
 retfie




Saludos .
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: asd12 en 31 de Julio de 2003, 12:35:00
Me sigue sin funcionar. Pongo el ASM HEX y la simulación en proteus, por si alguien quiere echarle un vistazo. Es para mostrar el tiempo en pc.
Cada vez que pasa un segundo se envia por rs232 el nº de segundos y el simbolo f, en una cuenta regresiva hasta cero. Pero solo me envia los primeros 5 o 6 segundos, despues se para. Eso es lo que hace en proteus. Si lo grabo en el pic no me envia nada.
Pero si en cualquier parte del programa testeo el PIR1,0  para ver si se ha producido la interupcion y hago un goto a INTER funciona.
Pero si lo hago así no consigo presicion en el tiempo y me va retrasando.
Funciona a 16Mhz.
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: pocher en 31 de Julio de 2003, 13:37:00
Hola asd12.

No puedo revisar el programa pero sí comentarte que:

¡ Cuidado con el PROTEUS, simulando interrupciones !, he perdido muchas horas pensando que el programa tenía un fallo y resulta que el que fallaba era el PROTEUS. He realizado la comprobación de programas con interrupciones que fallaban en PROTEUS y tanto en MPLAB como físicamente sobre placa sí que funcionaban.

Prueba el tuyo si puedes en MPLAB o físicamente

Un saludo
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: Sispic en 31 de Julio de 2003, 14:44:00
te as fijado que lo tienes asi al entrar y salir de la interrupcion ?

;BSF   INTCON,GIE
;BSF   INTCON,PEIE

No se activara otra vez al salir de ella .¡¡¡

Ten encuenta que mandar por rs232 tarda y es posible que la interr se llame asi misma .



En el vector de interrupcion , prueba a encender y apagar un led por ejemplo cada segundo sin mandar nada por rs232 , asi sabras si se ejecuta correctamente .

Tampoco es necesario que comprueves PIR1 si solo utilizas esta interrupcion .




Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: asd12 en 31 de Julio de 2003, 15:03:00
Lo de esas 2 lineas es porque el pic desactiva las interupciones cuando salta una, para no atender otras. Y cuando sale de la interupción las vuelve a activar. Puse esas lineas para desactivarlas yo al entrar en la interupcion y volver a activarlas despues, por si era eso, pero tampoco funciona. Te todas formas eso ya no lo estaba usando, si te fijas tiene un ; delante.
Puede que el proteus falle pero lo he probado en un pic y no va, solo va si no uso las interupciones.
No me vale probar con un led porque si lo que falla es la transmision tendré que solucionarlo.
Lo he probado a simular con MPLAB pero se queda comprobando que se ha enviado el primer dato. Como el MPLAB no simula transmision se queda en ese bucle. Sabe alguien como podria simular la transmision en MPLAB?

Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: asd12 en 31 de Julio de 2003, 15:05:00
Por casualidad alguien puede decirme donde esta el VTERM en proteus 6?
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: asd12 en 31 de Julio de 2003, 15:23:00
Se me olvidaba decir que el timer esta configurado para saltar y probocar la interupción cada 100ms y la transmisión es a 9600, por lo que cada dato tardará unos 10ms. Creo que tiene suficiente tiempo para mandar los 2 datos antes de producirse la proxima interupcion.
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: Sispic en 31 de Julio de 2003, 23:53:00
Entonces parece que se pierde al producirse la interrupcion .

Creo que es esto mirandolo por encima .

Codigo:

   ORG    0X00
   goto   INICIO
   ORG      0X04
   GOTO    INTER
   ORG      0X05
INICIO   bsf   STATUS,RP0   ;BANCO1



Fijate que pones ORG 0x4 ,, aqui tendrias que dejar un espacio de dos bytes ya y solo dejas el espacio de uno al poner ORG 0x5 .  cambia ORG 0x5 por ORG 0x8 por ejemplo , o simplemente borra ORG 0x5
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: pocher en 01 de Agosto de 2003, 00:38:00
El VTERM está en:

Icono Virtual Instruments - Virtual Terminal
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: asd12 en 01 de Agosto de 2003, 13:46:00
Tampoco elominando el org 0x05. Ni poniendo org 0x08. Ni quitando el goto INTER y pegando ahi la subrutina INTER.
Sigue igual. Ya no se que hacer.
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: Sispic en 01 de Agosto de 2003, 15:38:00

prueva a eliminar la llamada
GOTO   ENVIA_SEG

y haz otra cosa visual simple con un led como te he dicho antes para asegurarse que entra y sale correctamente de la interrupcion , y   por eliminaciones hasta encontrar el fallo .

haver si das con ello .





Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: Sispic en 02 de Agosto de 2003, 06:13:00
Este ejemplo  funciona bien

Codigo:

INTERR
;interrupcode follows here

         movwf   wsave           ; Save the W register
         swapf   STATUS, W
         clrf    STATUS          ; Point to bank 0
         movwf   ssave           ; Save the STATUS register
         movf    PCLATH, W       ; Save PCLATH
         movwf   psave


   movlw   0x16         ;restart timer from (256 + 12 + 4) - 250 => 4000 Hz (could need adjustment)
   movwf   TMR0

   decfsz    _i_tic_temp1,f
   goto    slutint
   movlw   40         ;40 = 100Hz if using 4MHz
    movwf   _i_tic_temp1

   decfsz    _i_tic_temp2,f
   goto    slutint
   movlw   10         ;10 = 10Hz if using 4MHz
    movwf   _i_tic_temp2
   bsf   _i_bits,0      ;sets bit0 of reg i_bits each 100ms

   decfsz    _i_tic,f
   goto    slutint
   incf   segundos,f
   movlw   10         ;10 = 1Hz if using 4MHz (change to 20 for 8MHz and so on)
    movwf   _i_tic

   movf   segundos,w
   sublw   60
   btfss   STATUS,Z      ;check for 60 sec
   goto    slutint         ;no
   clrf   segundos      ;yes
   incf   minutos,f

   movf   minutos,w
   sublw   60
   btfss   STATUS,Z      ;check for 60 minutes
   goto    slutint         ;no
   clrf   minutos         ;yes
   incf   horas,f

   movf   horas,w
   sublw   24
   btfss   STATUS,Z      ;check for 24 hours
   goto    slutint         ;no
   clrf   horas         ;yes

slutint
   bcf   INTCON,2      ;zero tmr0 interrupt flag

; restorecode follows here

   movf   psave,w         ;restore
   movwf   PCLATH
   swapf   ssave,w
   movwf   STATUS
   swapf   wsave,f
   swapf   wsave,w
   retfie





y para activarla :

Codigo:

           movlw   low (32)
           movwf   INTCON      ;"all interrupts off, enable tmr0int
           bsf     STATUS, RP0
           movlw   low (223)
           movwf   OPTION_REG  ;"reset bit4 = internal clock to timer0
           bcf     STATUS, RP0
           movlw   low (250)
           movwf   TMR0
           clrf    horas
           clrf    minutos
           clrf    segundos
           movlw   low (10)
           movwf   _i_tic
           movlw   low (10)
           movwf   _i_tic_temp2
           movlw   low (40)
           movwf   _i_tic_temp1
           movlw   low (160)
           movwf   INTCON        ;   "interrupts on




con oscilador de 4Mhz  .

Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: asd12 en 02 de Agosto de 2003, 07:18:00
lo probaré
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: solid84 en 03 de Agosto de 2003, 20:04:00
que tal asd12 cheque tu programa y quizas el por que no funciona correctamente puede ser debido a que toda la rutina de la inter. del tmr1 esta en la pagina 1 de la memoria de programa ahi algo importante acerca de las interrupciones cuando ejecutas varias interrupciones debes cuidar la pagina que respaldas ó dejas al entrar a la interrupcion y la pagina en la que tu rutina de interrupcion se encuentra tu rutina se encuentra hasta lo ultimo yo lo compile en mplab y pude ver que esta rutina esta en la pagina 1 si tu no cambias de pagina primero entonces respaldaste la pagina anterior que es la 0 pero la pagina actual en tu programa sigue siendo la 0 durante la interrupcion y tu rutina inter esta en la pagina 1 asi que prueba de esta forma

inter
         movlw     0x01
         movwf    PCLATH
        bla,bla,bla

y eso es todo si funciona que eso espero ya que es un punto importante yo modifique tu programa para que esta rutina quede asi como uso mplab tuve que poner la palabra de conf. etc. etc. pero corrijelo a como estaba y pruebalo saludos
       
 
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: asd12 en 04 de Agosto de 2003, 14:37:00
Soy yo el del mensaje anterior.
Puede ser que el pic este mal o que uso un bootloader?
Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: Sispic en 05 de Agosto de 2003, 13:52:00
Si has solucionando los fallos del asm , entonces has hecho buena pregunta ya que a mi me paso una vez , programando con icprog por ejemplo el rs232 funcionaba sin embargo no con Bootloader .

En mi caso era problema de configuracion .
Asi es como rulo con 16f876 a 20 mhz .

Bootloader :
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF

ASM:
 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF

Título: RE: ayuda timer1 con interupciones en 16f876
Publicado por: solid84 en 10 de Agosto de 2003, 15:36:00
si tienes razon un pequeño detalle je,je
pregunta el tiempo que envias a la computadora lo checas con el hiper terminal y otra cosa para que utilizas el wachtdog