Hago esto pero si cambio el numero de set_timer no varia nada.
Los seteos de los timers del main que puse arriba estan bien?
#int_timer1
clockisr2()
{
set_timer1(0xFFFF);
if(Iluminacion == 1)
Iluminacion =0 ;
else
Iluminacion = 1;
output_bit(PIN_B0,Iluminacion);
}
Es demasiada alta la frecuencia de encendido y apado que generás poniendo 0xFFFF en el timer_1.
Además, la instrucción outout_bit(byte,bit) debería ir fuera del if. Así como está no va a apagar nunca.
Vamos a suponer que para que no se note el destello queremos unos 100hz de encendidos y apagados por segundo.
Supongamos un tiempo de trabajo(duty) del 50% para simplificar los cálculos. No creo que sea tan estricto aunque tal vez buscando un duty adecuado economices aún más energía y no se note el parpadeo.
Volviendo: 100 Hz. Entonces queremos que apague y encienda 200 veces en total por segundo...
Vamos a la matematica tan bonita(y que lo lamento, pero intentar programar sin utilizar cálculos matemáticos es como querer escribir un libro sin saber un idioma...). La matemática es la herramienta base de casi todas las ciencias formales.
Entonces: 1 seg / 200 = 5 ms(milisegundos)
Debemos hacer entonces que el pin PORTB,0 invierta su estado cada 5 ms.(Supongo que usas 8Mhz)
T1 = (65536 - precarga) * Preescaler * 4 / Fosc
Sabemos el T1 que deseamos. Es 5 milisegundos(o bien, 5000 us que es lo mísmo)
Has elegido en tu programa un preescaler de 1:1. Probemos a ver si logramos ese número...
Quedaría:
5000us= (65536 - precarga) * 1 * 4 / 8000000 us
5000us= (65536 - precarga) * 1 * 0.5 us
5000us= (65536 - precarga) * 0.5 us
2500= 65536 - precarga
precarga= 65536-2500
precarga=63036
Eso nos haría que el Timer1 desborde cada 5ms.
Entonces, el código quedaría:
#int_timer1
clockisr2()
{
set_timer1(63036);
PIN_B0=!PIN_B0;
}
Y debería encender y apagar 100 veces por segundo. 50% del tiempo encendido, 50% del tiempo apagado.
Si deseas cambiar el % de encendido/apagado, deberás cargar al timer1 con valores distintos. Se puede hacer con el mísmo tipo de cálculos.
Saludos.