/********************************************************/
/* Proyecto regulaDOr de luces dia noche */
/********************************************************/
#include <12F683.h>
#FUSES NOWDT, HS, NOCPD, NOPROTECT, MCLR, PUT, BROWNOUT, IESO, NOFCMEN
#use delay(clock=20000000)
#use fast_io(A)
#define MaximoLuz 12
#define MinimoLuz 93 // Absoluto
#byte port_a = 5
#bit TRIAC1 = port_a.0
#bit TRIAC2 = port_a.1
/******************************************************/
/* Declaración de variables */
/******************************************************/
// Variable auxiliar
int cuenta;
int disparo = 1;
// Va contando nivel de disparo
int nivel = 0;
int periodoDia = MinimoLuz; //Empieza apagado
int periodoNoche = MaximoLuz; // Empieza encendido
// Diferencia de periodo entre cada paso
int paso = 2;
// Cuenta los segundos que pasan
int segundos = 0;
// Segundos entre cambio de ciclo
int cambio = 35;
// Variable para contar el tiempo transcurrido - Se incrementa en cada INTerrupción externa: 1/100 segundos
int16 tiempo = 0;
#INT_TIMER0
void disparo() // El timer cuenta 1 cada 51.2 us. Con 2 tics saltará cada 102.4us
{
set_timer0 (254); // Salta cada 102.4us
if(nivel == periodoDia)
output_low(PIN_A0);
if(nivel == periodoDia+5)
output_high(PIN_A0);
if(nivel == periodoNoche)
output_low(PIN_A1);
if(nivel == periodoNoche+5)
output_high(PIN_A1);
nivel++;
}
#INT_EXT
void EXT_isr()
{
set_timer0 (255);
nivel = 0;
if (cuenta == 0)
{
ext_int_edge (H_TO_L); // La próxima interrupción será de bajada
}
else
{
ext_int_edge (L_TO_H); // La próxima interrupción será de subida
}
cuenta = !cuenta;
tiempo++; // Cuenta 1 / 100 segundos más.
if(tiempo == 100) // 1 segundo
{
tiempo = 0;
/* if(periodoDia > MaximoLuz)
periodoDia -= paso;
else if(periodoDia < MaximoLuz)
periodoDia = Maximoluz;*/
segundos++;
if(segundos > 0 && segundos <= cambio)
{
//periodoDia = MinimoLuz+((30-segundos)*paso);
periodoDia = periodoDia-paso;
periodoNoche = periodoNoche+paso;
}
if(segundos == cambio+1)// && segundos <= 60)
{
periodoDia = MaximoLuz;
periodoNoche = MinimoLuz;
}
if(segundos > 2*cambio && segundos <= 3*cambio)
{
periodoDia = periodoDia+paso;
periodoNoche = periodoNoche-paso;
}
if(segundos == 3*cambio+1)// && segundos < 120)
{
periodoDia = MinimoLuz;
periodoNoche = MaximoLuz;
}
if(segundos == 4*cambio)
segundos = 0;
}
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
set_tris_A(0b111100);
// Desactivamos las salidas
output_high(PIN_A0);
output_high(PIN_A1);
// periodoDia = MaximoLuz;
for(;;)
{
}
}
hola suky , pido disculpas si no se entiende, pero toda la vida he abreviado circuito como cto, pero la escribo y listo para evitar confusiones, gracias por tu aporte. pero dime también cual es tu opinión acerca del circuito por favor.
Armo y veo los resultados veremos si lo tengo para mañana
saludos
...enciende una, se apaga parpadeando, se vuelve a encender y asi queda y la otra siempre esta encendida.
// Conexiones:
// PIN Conexión
// --- --------------------
// 1 Vdd
// 2 Cristal
// 3 Cristal
// 4 MCLR
// 5 INT EXT (Zero Cross)
// 6 Optoacoplador
// 7 Potenciómetro
// 8 Vss
//
#include <12F683.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES MCLR //Master Clear pin enabled
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#use delay(clock=4000000)Bueno, me cuentas que opinas y si te animas vamos armando el programita aquí, con la ayuda de todos hasta que lo hagamos funcionar.
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)por este:#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
asi es que el link que pusiste se borraras.