#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use standard_io(b)
short ban_05seg=0;
///////////////////////////////////////
#int_timer1 //Interrupción Timer1
void temp1s(void) //Función
{
delay_cycles(2);
set_timer1(3041); //62.500 * 8 (prescaler) = 0,5 seg
ban_05seg = 1; //bandera que se activa cada 0,5 seg
}
///////////////////////////////////////
void main ()
{
setup_timer_1 (t1_internal | t1_div_by_8);
set_timer1 (3041); //recarga del tmr1
enable_interrupts(int_timer1); //habilita interrupcion timer1
enable_interrupts(global); //habilita interrupción general
output_b(0);
while(true)
{
if(ban_05seg)
{
}
}
}
///////////////////////////////////////
Hola amigo, prueba con esto
saludos.Código: [Seleccionar]#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use standard_io(b)
short ban_05seg=0;
///////////////////////////////////////
#int_timer1 //Interrupción Timer1
void temp1s(void) //Función
{
delay_cycles(2);
set_timer1(3041); //62.500 * 8 (prescaler) = 0,5 seg
ban_05seg = 1; //bandera que se activa cada 0,5 seg
}
///////////////////////////////////////
void main ()
{
setup_timer_1 (t1_internal | t1_div_by_8);
set_timer1 (3041); //recarga del tmr1
enable_interrupts(int_timer1); //habilita interrupcion timer1
enable_interrupts(global); //habilita interrupción general
output_b(0);
while(true)
{
if(ban_05seg)
{
}
}
}
///////////////////////////////////////
Hola black_flowers, te falta habilitar las interrupciones de los periféricosCódigo: C
PEIE = 1;
Además tenés que eliminar la líneaCódigo: C
T1OSCEN=1; //activar t1 oscilador
Porque eso activa un oscilador para uso exclusivo del timer1 y es conectando un cristal de hasta 200KHz entre los pines T1OSO y T1OSI
Yo simule el siguiente código en Proteus y funciona bienCódigo: C
#include <htc.h> void interrupt ISR() { //GIE = 0; if (TMR1IF == 1) { TMR1ON = 0; RB1 ^= 1; TMR1L = 0xEE; TMR1H = 0x85; TMR1IF = 0; TMR1ON = 1; } } void main (void) { TRISB1 = 0; RB1 = 0; PEIE = 1; GIE = 1; //habilitar int general TMR1IE = 1; //habilitar int t1 TMR1CS = 0; //Timer1 en modo Timer, incrementa con oscilador interno (fosc/4) T1CKPS1 = 1; //prescaler a 1/8 T1CKPS0 = 1; TMR1H = 0x85; TMR1L = 0xEE;//cargar t1 // T1OSCEN = 1; //activar t1 oscilador TMR1IF = 0; TMR1ON = 1; //para echar a andar el t1 while(1); }
Fijate que hasta se nota que fue copipasteado de tu primer mensaje. Sólo hice unas mínimas modificaciones.
Dentro de la rutina de interrupción, apago al inicio y enciendo al final el timer1 (no sé si será necesario, no lo probé sin ello). Y otra modificación es que al pin RB1 le hago una orexclusiva con 1 así el pin cambia de estado cada vez que se entra en la rutina de interrupción
Una pregunta ingenua, ¿El PIC está funcionando? Digo.... ¿encendés algún led de otra manera como para saber que el PIC inició bien?
Y sí, entiendo lo que decís respecto del Proteus
¡Qué loco!
Se me había ocurrido probar el código en un 16F876A que tengo y lo iba a hacer mañana y comentarte los resultados pero viendo que se solucionó, me quedo más tranquilo
Hola micro_pepe, simulándolo en el proteus 7.8 sp2 (utilizando un breakpoint dentro de la interrupción, justo cuando testeas el flag del timer1) veo que entra cada 8.0155ms.
Si es que no vez el el cambio en el pin (en modo play de simulación) seguramente es debido que estás manejando una frecuencia muy alta. Probá de cambiar los tiempos del timer, para que tarde mas en cambiar.
Hola micro_pepe, simulándolo en el proteus 7.8 sp2 (utilizando un breakpoint dentro de la interrupción, justo cuando testeas el flag del timer1) veo que entra cada 8.0155ms.
Si es que no vez el el cambio en el pin (en modo play de simulación) seguramente es debido que estás manejando una frecuencia muy alta. Probá de cambiar los tiempos del timer, para que tarde mas en cambiar.
Pues lo he probado en real y con tiempos mayores y nada :( no sé que puede estar pasando.