TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: guancho2002 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
-
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.
-
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.
-
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.
-
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:
-
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. :)