Autor Tema: Ayuda con las interrupciones del 16F877!!!  (Leído 4343 veces)

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

Desconectado guancho2002

  • PIC16
  • ***
  • Mensajes: 113
Ayuda con las interrupciones del 16F877!!!
« en: 24 de Octubre de 2007, 11:53:29 »
Buenas a todos,
os escribo esta carta de desesperación ya que desde hace un par de días que creo haberme vuelto loco, os cuento:
Estoy haciendo un programita en el que simplemente manda un led a parpadear a través del desbordamiento del TMR0 y no sé que es lo que está ocurriendo porque el programa que he generado con Protón me funciona perfectamente en Proteus pero cuando lo paso a desarrollo real, este no funciona. He revisado todo lo posible por revisar en todos los foros e internet y no consigo dar con el problema, ¿me pueden ayudar? gracias de antemano.

Os pongo el programita:

DEVICE 16F877
       Declare XTAL 4

ON_INTERRUPT GOTO Interrupcion

       SYMBOL T0IE INTCON.5       ' TMR0 Overflow Interrupt Enable
       SYMBOL T0IF INTCON.2       ' TMR0 Overflow Interrupt Flag
       SYMBOL GIE INTCON.7          ' Global Interrupt Enable
       SYMBOL PS0 OPTION_REG.0       ' Prescaler ratio bit-0
       SYMBOL PS1 OPTION_REG.1       ' Prescaler ratio bit-1
       SYMBOL PS2 OPTION_REG.2       ' Prescaler ratio bit-2    
       SYMBOL PSA OPTION_REG.3       ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator)    
       SYMBOL T0CS OPTION_REG.5   ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)
       
       ALL_DIGITAL=True
       TRISB=0
       PORTB=0
   

Marcha:
      GIE = 0          ' Turn off global interrupts
      PSA = 0          ' Assign the prescaler to external oscillator
      PS0 = 1          ' Set the prescaler
      PS1 = 1          ' to increment TMR0
      PS2 = 1          ' every 256th instruction cycle
      T0CS = 0       ' Assign TMR0 clock to internal source
      TMR0 = 0       ' Clear TMR0 initially
      T0IE = 1       ' Enable TMR0 overflow interrupt
      GIE = 1          ' Enable global interrupts

Marcha_2:

       GOTO MARCHA_2


Interrupcion:
       gie=0
       portb=portb ^1
      T0IF = 0
      gie=1
      CONTEXT RESTORE


END

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Ayuda con las interrupciones del 16F877!!!
« Respuesta #1 en: 24 de Octubre de 2007, 15:13:29 »
Interrupcion:
       gie=0
       portb=portb ^1
      T0IF = 0
      gie=1
      CONTEXT RESTORE
END


Una cosa..... ¿no deberías colocar una pausa para poder ver el parpadeo?

Otra cosa: tengo entendido que las interrupciones, al aplicar el RETFIE el GIE automáticamente se habilida (en hardware).


Veré esto más tarde.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado guancho2002

  • PIC16
  • ***
  • Mensajes: 113
Re: Ayuda con las interrupciones del 16F877!!!
« Respuesta #2 en: 24 de Octubre de 2007, 15:58:13 »
Gracias Mario por tu respuesta,
en cuanto a la pausa la he comprobado con el osciloscopio y no produce ningún pulso.
Lo de GIE en un momento dado lo único que hace es reforzar que se habilite pero no más. No tengo ni idea que puede estar ocurriendo...

Un saludo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Ayuda con las interrupciones del 16F877!!!
« Respuesta #3 en: 24 de Octubre de 2007, 20:40:19 »
No uso tu lenguaje pero la configuracion del timer0 la veo correcta
comparando con la que hago normalmente.

****
OPTION_REG.T0CS = 0  'selecciona reloj interno
OPTION_REG.PSA = 0  'asigna el prescales al timer0
OPTION_REG.PS0 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS1 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS2 = 0  'bits de la seleccion del factor de division,prescaler 16
Enable  'INTCON.GIE=1 habilita todas las interrupciones globales
INTCON.TMR0IF = 0  'borra el flag de desbordamiento del timer0
TMR0 = 130  'cargo el registro del tmr0 para que desborde cada 1mS
INTCON.TMR0IE = 1  'habilita las interrupciones del timer0
****

Te recomiendo que repaces la configuracion de los fuses del micro.
Saludos desde Granada, España.

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
Re: Ayuda con las interrupciones del 16F877!!!
« Respuesta #4 en: 25 de Octubre de 2007, 01:16:45 »
DEVICE 16F877
       Declare XTAL 4

ON_INTERRUPT GOTO Interrupcion

       SYMBOL T0IE =INTCON.5       ' TMR0 Overflow Interrupt Enable
       SYMBOL T0IF =INTCON.2       ' TMR0 Overflow Interrupt Flag
       SYMBOL GIE =INTCON.7          ' Global Interrupt Enable
       SYMBOL PS0 =OPTION_REG.0       ' Prescaler ratio bit-0
       SYMBOL PS1 =OPTION_REG.1       ' Prescaler ratio bit-1
       SYMBOL PS2 =OPTION_REG.2       ' Prescaler ratio bit-2   
       SYMBOL PSA =OPTION_REG.3       ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator)   
       SYMBOL T0CS =OPTION_REG.5   ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)
     goto marcha

        Interrupcion:
 
       toggle portb.0
      T0IF = 0
     
      CONTEXT RESTORE
      enable
     
       
     


 
Marcha:
ALL_DIGITAL=True
       TRISB=0
       PORTB=0
   

      GIE = 0          ' Turn off global interrupts
      PSA = 0          ' Assign the prescaler to external oscillator
      PS0 = 1          ' Set the prescaler
      PS1 = 1          ' to increment TMR0
      PS2 = 1          ' every 256th instruction cycle
      T0CS = 0       ' Assign TMR0 clock to internal source
      TMR0 = 0       ' Clear TMR0 initially
      T0IE = 1       ' Enable TMR0 overflow interrupt
      GIE = 1          ' Enable global interrupts

Marcha_2:
       @nop
       @nop
      @nop
       GOTO MARCHA_2




END

prueba con esas modificaciones  :mrgreen:

Desconectado guancho2002

  • PIC16
  • ***
  • Mensajes: 113
Re: Ayuda con las interrupciones del 16F877!!!
« Respuesta #5 en: 25 de Octubre de 2007, 11:19:22 »
gracias gracias gracias  :-/ :-/ :-/
Yo alucino, he probado lo que electronando ha puesto y efectivamente funciona!!! el caso es que con el simple hecho de cambiar en mi código la línea que pone: PORTB=PORTB^1 por TOGGLE PORTB ya funciona... según la propia ayuda de PROTON, cómo yo lo hice es correcto pero no funciona y eso era lo que me estaba liando...
Gracias a todos por vuestra ayuda y a este gran foro tan socorrido. :)