Si teneis un rato, probar este programa en PROTEUS, a ver si os pasa lo mismo que a mí.
Sucede que si en el while(get_timer1()<65517); pongo un número mayor que 65517 no va bien y no se genera la onda cuadrada.
¿Será culpa del PROTEUS? ... no lo sé
Lo ideal sería probarlo con un osciloscopio real.
Codigo:
#include <16F876.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay (clock=4000000)
#use fast_io(A)
#use fast_io(B)
main()
{
set_tris_b(0x00);
setup_timer_1(t1_internal | t1_div_by_1);
while (1)
{
output_bit(pin_b2,1);
set_timer1(0);
while(get_timer1()<65517);
output_bit(pin_b2,0);
set_timer1(0);
while(get_timer1()<65517);
}
}
Un saludo
Seguramente el Timer al desbordarse empieza la cuenta desde cero otra vez .
Con los ciclos que pierdes en el While se le escapa esta lectura del < ya que 65517 está muy cerca de 65535 .
Posible solucion .
Codigo:
output_bit(pin_b2,0);
set_timer1(0);
Borrar TMR1IF
while(get_timer1()<65517) & ( no TMR1IF );
Si este es el problema "calcula la precision que obtienes"
Lo probaré con el bit de desbordamiento, de todas formas y ójala me equivoque me dá mala espina.
Siguiendo con el TIMER1, otra construcción que támpoco funciona bien:
Codigo:
#include <16F876.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay (clock=4000000)
#use fast_io(A)
#use fast_io(B)
main()
{
set_tris_b(0x00);
setup_timer_1(t1_internal | t1_div_by_1);
while (1)
{
output_high(pin_b2);
set_timer1(0);
while(get_timer1()!=6500); //Esta construcción no va con ningún número
output_low(pin_b2);
set_timer1(0);
while(get_timer1()!=6500);
}
}
Vamos que se desea detectar la llegada del TMR1 a un número y no lo detecta ¿porqué? ... debe ser por lo que comenta Sispic!
Quizá poniendo un intervalo de números, le dé tiempo a coger algún número del intervalo ... pero a mí lo que me interesa es que detecte un número concreto !!