Atmega328p se queda congelado

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);

}

No he mirado con detenimiento tu código pero observa ese while(habilitado==0) a ver si justamente en algún momento deja de estar en 0 esa variable de lo contrario pasará lo que indicas.
Usa Serial.print indicando que ocurre en distintas etapas de tu código y verás como se desarrolla el mismo.