Autor Tema: ayuda timer1 con interupciones en 16f876  (Leído 5322 veces)

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

Desconectado asd12

  • PIC10
  • *
  • Mensajes: 48
ayuda timer1 con interupciones en 16f876
« 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.

Desconectado asd12

  • PIC10
  • *
  • Mensajes: 48
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #1 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
 

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #2 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 .

Desconectado asd12

  • PIC10
  • *
  • Mensajes: 48
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #3 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.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #4 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

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #5 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 .





Desconectado asd12

  • PIC10
  • *
  • Mensajes: 48
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #6 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?


Desconectado asd12

  • PIC10
  • *
  • Mensajes: 48
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #7 en: 31 de Julio de 2003, 15:05:00 »
Por casualidad alguien puede decirme donde esta el VTERM en proteus 6?

Desconectado asd12

  • PIC10
  • *
  • Mensajes: 48
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #8 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.

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #9 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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #10 en: 01 de Agosto de 2003, 00:38:00 »
El VTERM está en:

Icono Virtual Instruments - Virtual Terminal

Desconectado asd12

  • PIC10
  • *
  • Mensajes: 48
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #11 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.

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #12 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 .






Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #13 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  .


Desconectado asd12

  • PIC10
  • *
  • Mensajes: 48
RE: ayuda timer1 con interupciones en 16f876
« Respuesta #14 en: 02 de Agosto de 2003, 07:18:00 »
lo probaré


 

anything