Buenas noches compañeros tengo un pequeño problema y espero me puedan ayudar, estoy haciendo un circuito para controlar varios reles con el atmega328p sin la tarjeta de arduino, el circuito comienza funcionando sin problemas al cabo de unos segundos se queda congelado, ¿puede ser que los condensadores de 22pf están muy alejados del cristal?...
int ledPin = 13;
boolean flag = true;
long previousMillis = 0;
long On = 100; // tiempo que dura encendido, en milisegundos
long Off = 30; // tiempo que dura apagado, en milisegundos
int r0=0,r1=0,r2=0,r3=0,r4=0;
int habilitar=0,timer=0,seg=0,minu=0;
int estado0=0,estado1=0,estado2=0,estado3=0,estado4=0;
int estadoanterior0=0,estadoanterior1=0,estadoanterior2=0,estadoanterior3=0,estadoanterior4=0;
int salida0=0,salida1=0,salida2=0,salida3=0,salida4=0;
int star;
int tiempo=0,tiempo2=0,seguro=0,j=0;
void setup() {
pinMode(ledPin, OUTPUT);
DDRD=0B11111111;
PORTD=0B00000000;
pinMode(8,OUTPUT);
pinMode(A0,INPUT);
pinMode(9,OUTPUT);
pinMode(A1,INPUT);
pinMode(10,OUTPUT);
pinMode(A2,INPUT);
pinMode(11,OUTPUT);
pinMode(A3,INPUT);
pinMode(12,OUTPUT);
pinMode(A4,INPUT);
pinMode(A5,INPUT);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
}
void loop() {
//ciclo de configuracion al reiniciar el circuito
while (habilitar==0){
delay (5);
tiempo++;
if (tiempo==200){
tiempo2++;
tiempo=0;
}
if (tiempo2==5){
seguro++;
}
if (seguro==2){
secuencia_star();
habilitar=1;
break;
}
//indicador de configuracion
if (millis() < (previousMillis + On + Off)){
flag = true;
}
else {
flag = false;
previousMillis = millis();
}
if (flag == true){
if (millis() > (previousMillis + On)){
digitalWrite(ledPin, LOW);
}
else{
digitalWrite(ledPin, HIGH);
}
}
estado0=digitalRead(A0);
if ((estado0==HIGH) && (estadoanterior0==LOW)){
salida0=1-salida0;
delay (20);
}
estadoanterior0=estado0;
if (salida0==1){
digitalWrite(8,HIGH);
}
else {
digitalWrite(8,LOW);
}
estado1=digitalRead(A1);
if ((estado1==HIGH) && (estadoanterior1==LOW)){
salida1=1-salida1;
delay (20);
}
estadoanterior1=estado1;
if (salida1==1){
digitalWrite(9,HIGH);
}
else {
digitalWrite(9,LOW);
}
estado2=digitalRead(A2);
if ((estado2==HIGH) && (estadoanterior2==LOW)){
salida2=1-salida2;
delay (20);
}
estadoanterior2=estado2;
if (salida2==1){
digitalWrite(10,HIGH);
}
else {
digitalWrite(10,LOW);
}
estado3=digitalRead(A3);
if ((estado3==HIGH) && (estadoanterior3==LOW)){
salida3=1-salida3;
delay (20);
}
estadoanterior3=estado3;
if (salida3==1){
digitalWrite(11,HIGH);
}
else {
digitalWrite(11,LOW);
}
estado4=digitalRead(A4);
if ((estado4==HIGH) && (estadoanterior4==LOW)){
salida4=1-salida4;
delay (20);
}
estadoanterior4=estado4;
if (salida4==1){
digitalWrite(12,HIGH);
}
else {
digitalWrite(12,LOW);
}
//pulso para iniciar las neveras
star=digitalRead(A5);
if (star==HIGH){
//estos tiempos son de prueba hay que cambiarlos
if (digitalRead(8)==HIGH){
r0=240;
}
else{
r0=120;
}
if (digitalRead(9)==HIGH){
r1=240;
}
else{
r1=120;
}
if (digitalRead(10)==HIGH){
r2=240;
}
else{
r2=120;
}
if (digitalRead(11)==HIGH){
r3=300;
}
else{
r3=180;
}
if (digitalRead(12)==HIGH){
r4=5;
}
else{
r4=3;
}
secuencia_star ();
habilitar=1;
break ;
}
}
//ciclo de control de neveras
//contador de tiempo en fraciones de 1/5 de segundos
timer++;
//tiempos de cada relay en segundos
if (timer==5){
seg++;
timer=0;
}
if (seg==1){
minu++;
seg=0;
}
//tiempos de cada relay en minutos
if (minu==1){
r0=r0+1;
r1=r1+1;
r2=r2+1;
r3=r3+1;
r4=r4+1;
minu=0;
}
digitalWrite(ledPin, HIGH);
//control de relay
if (r0 == 3){
digitalWrite(PD0,LOW);
digitalWrite(8,LOW);
}
if (r0 >= 5){
r0=0;
digitalWrite(PD0,HIGH);
digitalWrite(8,HIGH);
}
if (r1 == 2){
digitalWrite(PD1,LOW);
digitalWrite(9,LOW);
}
if (r1 >= 4){
r1=0;
digitalWrite(PD1,HIGH);
digitalWrite(9,HIGH);
}
if (r2 == 5){
digitalWrite(PD2,LOW);
digitalWrite(10,LOW);
}
if (r2 >= 6){
r2=0;
digitalWrite(PD2,HIGH);
digitalWrite(10,HIGH);
}
if (r3 == 7){
digitalWrite(PD3,LOW);
digitalWrite(11,LOW);
}
if (r3 >= 9){
r3=0;
digitalWrite(PD3,HIGH);
digitalWrite(11,HIGH);
}
if (r4 == 3){
digitalWrite(PD4,LOW);
digitalWrite(12,LOW);
}
if (r4 >= 5){
r4=0;
digitalWrite(PD4,HIGH);
digitalWrite(12,HIGH);
}
delay(200);
}
void secuencia_star (){
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
delay (100);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
delay (100);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
delay (100);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
delay (100);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
delay (100);
}
void secuencia10(){
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
delay(200);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
delay(200);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
delay(200);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
delay(200);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
delay(200);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
}