#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Resistor/Capacitor Osc with CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#use rs232(baud=1200,xmit=PIN_B2,rcv=PIN_B1)
#include "string.h"
#use RTOS(timer=1, minor_cycle=1ms)
#byte EECON1=0x9C
char cBuffer[6]; //Aqui guardamos el texto a enviar por el puerto serie
char comando[6];
int8 iBuffer; //Indice en el buffer para ir llenandolo
int8 semaforo;
int8 horas,minutos,segundos=0;//Variables de la Hora del Sistema
int8 mApago,hApago;
int8 mPrendo,hPrendo;
int8 hora,minuto;
int8 estado=0;
int const RTCCxS=134; // Número de RTCC's para 1 segundo con 4 Mhz / 1:256.
// VARIABLES GLOBALES
int nRTCC=0x00; // Contador de interrupciones RTCC completas
#int_RTCC // Interrupción por desbordamiento
void RTCC_isr() { // del TIMER0 RTCC
set_timer0(32);
if(++nRTCC==RTCCxS){
nRTCC=-1;
output_toggle(PIN_A0);
set_timer0(50);
if(++segundos>59){
segundos=0;
//nRTCC=0;
output_toggle(PIN_A2);
set_timer0(100);
if(++minutos>59){
minutos=0;
nRTCC=1;
output_toggle(PIN_A3);
set_timer0(0);
if(++horas>23){
horas=0;
nRTCC=2;
set_timer0(119);
}
}
}
}
}
#task (rate=20ms, max=1ms, queue = 5) //Creamos una cola con 4 bytes utiles
void Serial();
#task (rate=1s, max=1ms) //Creamos Tarea Comando
void timer();
#task (rate=1ms, max=1ms)
void disable_task();
#task (rate=10ms, max=1ms,queue=6)
void grabaEE();
#task (rate=40ms, max=1ms) //Creamos Tarea Ejecuta
void Ejecuta();
#task (rate=1s, max=1ms) //Creamos Tarea que Guarda Datos
void SaveRTC(); //Trabajando con una Cola de 6 Datos
//Comandos
void verHora();//Visualiza Hora
void ConHora();//Configura Hora
void ConApa();//Configura Apaga
void ConPre();//Configura Prende
void main()
{
//setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_counters(RTCC_INTERNAL,RTCC_DIV_32); // TIMER0: Clock Interno y Preescaler
//Este sera usado como Reloj.
//setup_timer_1(T1_DISABLED);
//setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);// Habilito Interrupción RTCC
enable_interrupts(INT_RDA);
nRTCC=-5;
set_timer0(68);
enable_interrupts(GLOBAL);
setup_oscillator(False);
output_a(0);
//Inicializo Reloj.
minutos=read_eeprom(2);
horas=read_eeprom(1);
//Prendo
mPrendo=read_eeprom(4);
hPrendo=read_eeprom(3);
//Leo Hora Apago
mApago=read_eeprom(6);
hApago=read_eeprom(5);
output_low(pin_A0);
EECON1=0;
iBuffer=0;
semaforo=1;
rtos_run();
}
//Guardara Datos hasta llegar auna cadena de 5
void Serial()
{
char cDato;
rtos_await(rtos_msg_poll()); //Esperamos hasta que haya algun dato en cola
while(rtos_msg_poll()) //Procesamos la cola completa
{
cDato = rtos_msg_read();
if (cDato==0x08){
if(iBuffer>0){
iBuffer--;
}
}
else{
if(iBuffer<5){
cBuffer[iBuffer] = cDato;
iBuffer++;
}
}
}
if(cDato == 0x0D) //Si esta toda la cadena la enviamos
{
cBuffer[iBuffer] =0 ;
iBuffer = 0;
rtos_enable(Ejecuta);
rtos_disable(Serial);
}
}
#INT_RDA
void fINT_RDA(void)
{
char tecla;
rtos_msg_send(Serial, tecla); //Tomamos el dato del buffer y lo ponemos en la cola
}
void disable_task(){
rtos_disable(Ejecuta);
//rtos_disable(SaveRTC);
rtos_disable(disable_task);
}
void Ejecuta(){
int8 len,i;
strlwr(comando);
for (i=0;i<len;i++){
if (comando[i]==0x0d) {
comando[i]=0x0;
}
}
semaforo=0;
if (len==1 && comando[0]=='v'){
verHora();
}
else{
if(len==2&&comando[0]=='e'){
estado=comando[1]&1;
}
if (len==5){
hora=(comando[1]& 0x0F)*10+comando[2]&0x0F;
minuto= (comando[3]& 0x0F)*10+comando[4]&0x0F;
switch(comando[0]){
case 'h': ConHora();
break;
case 'a': ConApa();
break;
case 'p': ConPre();
break;
default: //putc('\n');
semaforo=1;
break;
}
if (semaforo==0){
verHora();
}
}
}
rtos_enable(Serial);
rtos_disable(Ejecuta);
}
void VerHora(){
printf("\n\r Hora Actual %02d:%02d:%02d\n\r",horas
,minutos
,segundos
); printf(" Prende %02d:%02d y Apaga %02d:%02d\n\r",hPrendo
,mPrendo
,hApago
,mApago
); }
void ConHora(){
horas=hora;
minutos=minuto;
segundos=0;
}
void ConApa(){
mApago=minuto;
hApago=hora;
}
void ConPre(){
mPrendo=minuto;
hPrendo=hora;
}
void GrabaEE(){
int i;
int8 dato;
rtos_await( rtos_msg_poll()==6);
//if (rtos_msg_poll()==5){
for (i=1;i<7;){
if ((EECON1&2)==0){
dato=rtos_msg_read();
write_eeprom(i,dato);
i++;
}
rtos_yield(); }
//}
}
void SaveRTC(){
rtos_msg_send(GrabaEE,horas);
rtos_msg_send(GrabaEE,minutos);
rtos_msg_send(GrabaEE,hPrendo);
rtos_msg_send(GrabaEE,mPrendo);
rtos_msg_send(GrabaEE,hApago);
rtos_msg_send(GrabaEE,mApago);
}
void timer(){
int16 P,A,N;
A=hApago*60+mApago;
P=hPrendo*60+mPrendo;
N=horas*60+minutos;
if (A>P){
if(A>N && N>=P){
estado=1;}
else{
estado=0;}}
else{
if(P>N && N>=A){
estado=0;}
else{
estado=1;}}
output_bit(PIN_A1,estado);
}
#rom 0x2101={0,0,0,2,0,1}