Hola D@rkbytes, con tu permiso yo también he modificado tu programa, gracias por compartirlo, muy levemente para intentar algo simple pero tengo alguna pega.
Necesito realizar temporizaciones distintas dependiendo del estado de RA0 y deben ser lo más precisas posible, sobre todo las más largas, para no ganar o perder mucho tiempo al menos durante las 24H que se usará el circuito.
Las temporizaciones necesarias son las siguientes:
27 segundos led apagado y 3 segundos led activo y vuelta a empezar.
60 segundos led apagado y activo el led 1,1 segundos y vuelta a empezar.
El caso es que los tiempos no me cuadran mucho, sobre todo el de 60/1,1 y me he dado cuenta que el reinicio de la variable seg despues de hacer el delay no sirve para lo que yo busco, el timer1 sigue contando independientemente de los delay que ponga por lo que tendría que añadirle ese 0,1 segundos de más en este segundo caso. Creo que la manera de hacer esto puede ser más sencilla de lo que yo pienso, parar y reiniciar el timer1??, pero me he quedado en blanco y pienso que la voy a liar...
El estado de RA0 solo sería necesario comprobarlo una vez, en el arranque del programa, y dependiendo de ello funcionar 24H y ya. Veo innecesario comprobarlo cada segundo, como lo hago? el tener la interupción por medio hace que me pierda en el programa... jejeje:
Código:
/*******************************************************************************
* Compilador: CCS PCM C Compiler, Versión 4.140
* Programa: Timer_1Seg.C
* Versión: 1.0
* Autor: D@rkbytes
* Compañia: Digitek
* Notas:
* Timer de un segundo con TMR1 (16 Bits)
* Se usará el oscilador interno a 4 MHz.
* El externo en RB6 y RB7, con un cristal de 32768 Hz.
*******************************************************************************/
#include <16f628a.h>
int seg=0;
#use delay(internal=4mhz)
#byte PORTA = getenv("SFR:PORTA") // Referencia del registro PORTA
#byte PORTB = getenv("SFR:PORTB") // Referencia del registro PORTB
#bit RB0 = PORTB.0 // Definir RB0
#bit RB1 = PORTB.1 // Definir RB1
#bit RA0 = PORTA.0 // Definir RA0
// Controlador de la interrupción por desborde del TMR1
#int_timer1
void tmr1_int(void)
{
clear_interrupt(int_timer1); // Limpiar flag por desborde del TMR1
set_timer1(0x8000); // Recargar el TMR1 con 32768
RB1 = ~RB1; // Toggle en RB1 (Otra forma de hacer toggle)
seg++; // Esto se hará cada 1 segundo.
}
void main(void)
{
set_tris_a(0x1F); // Puerto A como entradas.
set_tris_b(0x00); // Puerto B como salidas.
setup_timer_1(t1_external_sync|t1_div_by_1|t1_clk_out);
enable_interrupts(int_timer1); // Habilitar interrupción del Timer 1
enable_interrupts(global); // Habilitar interrupciones globales
set_timer1(0x8000); // Cargar el TMR1 con 32768
while(true)
{ // Hacer un bucle infinito del programa.
If (input (pin_A0)==0)
{
if(seg<27)
RB0 = 0;
else
{
RB0 = 1;
delay_ms (3000);
RB0 = 0;
seg=0;
}
}
else
{
if(seg<60)
RB0 = 0;
else
{
RB0 = 1;
delay_ms (1100);
RB0 = 0;
seg=0;
}
}
}
}