Codigo inestable

Hola a todos, primero decir que soy nuevo tanto en el foro como en el mundo del arduino..

Se que no es lo mas elegante entrar a un sitio a pedir ayuda, pero en mi caso no veo otra salida.

Os cuento un poco mi problema, encargué un proyecto a un programador, se trata de un arduino que controla cuatro electroválvulas neumáticas encargadas de gestionar a través de unos cilindros el movimiento de una caja de cambios de un coche que tengo como afición para correr.
Y en efecto el hizo su trabajo y me entregó un programa que funciona correctamente, hasta que arranco el coche..
Las entradas y salidas que tiene el arduino son:

El funcionamiento es sencillo, hay un pulsador para punto muerto, otro para marcha atrás y dos levas, una para subir marchas y otra para bajar marchas. Además al final se incluyeron un pulsador para seleccionar de forma individual una marcha concreta.

El programa funciona correctamente, pero cuando lleva uno minutos en funcionamiento, el arduino selecciona punto muerto sin tocar nada y el coche se queda en punto muerto..

Como pista la señal del embrague que es un pulsador NC si lo desconecto funciona todo perfectamente.

Aquí pongo el programa.

Cualquier sugerencia será bienvenida.

Gracias de antemano!

Perdón el código no me entra entero y la imagen de las entradas / salidas es esta:

const byte p_muerto = 2;
volatile int pm, e = 0;
byte ma, ch, gear, x, y, z = 0;
int m, sh, retardo = 0;

void setup()
{
DDRB = 0xFF; // BOTONES
DDRA = 0xFF; // FIN DE CARRERA
DDRK = 0xFF; // ELECTROVALVULAS
DDRC = 0xFF; // BOTONES 1-5 Y EMBRAGUE
DDRF = 0xFF; // 8 SEGMENTOS
PORTK = 0xFF;
PORTF = 0x00;

Serial.begin(9600);
punto_m();
}

void loop()
{
PORTK = 0xFF;
x = PINB | 0x00; // botones 1
y = PINC & 0xFF; // botones 2
z = PINA | 0x00;

/*
Serial.print(" portA: " ); Serial.print(z, HEX);
Serial.print(" | portB: " ); Serial.print(x, HEX);
Serial.print(" | portC: "); Serial.print(y, HEX);
Serial.print(" || marcha: "); Serial.print(m);
Serial.print(" | shift: "); Serial.print(sh);
Serial.print(" | change: "); Serial.print(ch);
Serial.print(" || p_muerto: "); Serial.print(pm);
Serial.print(" | marcha atras: "); Serial.print(ma);
Serial.print(" | embrague: "); Serial.println(e);

*/
if(x == 0x10) { delay(150); if(ch==0&&ma==0){ sh++; ch=1; if(sh >= 5){ sh=5; ch=0; }} }
if(x == 0x20) { delay(150); if(ch==0){ if(sh == 0){ sh=0; m=0;} if(sh == 1) { sh = 1; ch=0;} else if(sh >= 2) { ch=1; sh--; } } }
if((x == 0x40) && m == 0 && pm == 1 && e==1 ){ marcha_a(); } // pm = 0
if(x==0x80 && e==1){ punto_m(); }
//if(e==1){ marcha_a(); }
if((sh >= 1)&&(e == 1)) { pm = 0; if(pm == 0) { m=sh; marchas(); } }
x = 0;

//if(m==0) PORTF = 0x00;
if(m==1) PORTF = 0x01; if(m==2) PORTF = 0x02;
if(m==3) PORTF = 0x04; if(m==4) PORTF = 0x08; if(m==5) PORTF = 0x10;
if(ma==1) PORTF = 0x20;
marchas2();

//pruebas de tiempo
delay(10);
retardo++;
if(retardo==5) { retardo = 0; e = 0; }
}

void marchas2()
{
y = PINC & 0xFF;

if( y == 0x00){ e = 1; }
if( y == 0x01){ m = 1; marchas(); }
if( y == 0x02){ m = 2; marchas(); }
if( y == 0x04){ m = 3; marchas(); }
if( y == 0x08){ m = 4; marchas(); }
if( y == 0x10){ m = 5; marchas(); }
if((y=PINC&0xF0) == 0x00){ e = 1; }
y = 0;
}

void marchas()
{
//PORTF = 0x00;
ch=0; pm=0; sh=m;
Serial.print(" marcha: "); Serial.println(m);
switch(m){
case 1: if(gear==0x01) break;
while(digitalRead(27)==0){ PORTK = 0xDF; }
while(digitalRead(29)==0){ PORTK = 0x7F; }
while(digitalRead(23)==0){ PORTK = 0xFD; }
while(digitalRead(24)==0){ PORTK = 0xFB; }
while(digitalRead(27)==0){ PORTK = 0xDF; }
while(digitalRead(28)==0){ PORTK = 0xBF; }
PORTK = 0xFF; PORTF = 0x01; e=0;
gear = 0x01; delay(250); break;

case 2: if(gear==0x02) break;
while(digitalRead(27)==0){ PORTK = 0xDF; }
while(digitalRead(29)==0){ PORTK = 0x7F; }
while(digitalRead(23)==0){ PORTK = 0xFD; }
while(digitalRead(24)==0){ PORTK = 0xFB; }
while(digitalRead(26)==0){ PORTK = 0xEF; }
while(digitalRead(29)==0){ PORTK = 0x7F; }
PORTK = 0xFF; PORTF = 0x02; e=0;
gear = 0x02; delay(250); break;

case 3: if(gear==0x04) break;
while(digitalRead(27)==0){ PORTK = 0xDF; }
while(digitalRead(29)==0){ PORTK = 0x7F; }
while(digitalRead(23)==0){ PORTK = 0xFD; }
while(digitalRead(25)==0){ PORTK = 0xF7; }
while(digitalRead(27)==0){ PORTK = 0xDF; }
while(digitalRead(28)==0){ PORTK = 0xBF; }
PORTK = 0xFF; PORTF = 0x04; e=0;
gear = 0x04; delay(250); break;

case 4: if(gear==0x08) break;
while(digitalRead(27)==0){ PORTK = 0xDF; }
while(digitalRead(29)==0){ PORTK = 0x7F; }
while(digitalRead(23)==0){ PORTK = 0xFD; }
while(digitalRead(25)==0){ PORTK = 0xF7; }
while(digitalRead(26)==0){ PORTK = 0xEF; }
while(digitalRead(29)==0){ PORTK = 0x7F; }
PORTK = 0xFF; PORTF = 0x08; e=0;
gear = 0x08; delay(250); break;

case 5: if(gear==0x10) break;
while(digitalRead(27)==0){ PORTK = 0xDF; }
while(digitalRead(29)==0){ PORTK = 0x7F; }
while(digitalRead(22)==0){ PORTK = 0xFE; }
while(digitalRead(25)==0){ PORTK = 0xF7; }
while(digitalRead(27)==0){ PORTK = 0xDF; }
while(digitalRead(28)==0){ PORTK = 0xBF; }
PORTK = 0xFF; PORTF = 0x10; e=0;
gear = 0x10; delay(250); break;
}

}

void punto_m()
{
if(gear==0x40) return;
PORTF = 0x40; pm=1;
Serial.print(" punto muerto: " ); Serial.print(pm);
while(digitalRead(27)==0){ PORTK = 0xDF; }
while(digitalRead(29)==0){ PORTK = 0x7F; }
while(digitalRead(23)==0){ PORTK = 0xFD; }
while(digitalRead(25)==0){ PORTK = 0xF7; }
PORTK = 0xFF; e=0; m=0; sh=0;
gear = 0x40; ma=0; ch=0;
delay(250);
}

void marcha_a()
{
if(gear==0x20) return;
Serial.print(" marcha atras: "); Serial.print(ma);
while(digitalRead(27)==0){ PORTK = 0xDF; }
while(digitalRead(29)==0){ PORTK = 0x7F; }
while(digitalRead(22)==0){ PORTK = 0xFE; }
while(digitalRead(25)==0){ PORTK = 0xF7; }
while(digitalRead(26)==0){ PORTK = 0xEF; }
while(digitalRead(29)==0){ PORTK = 0x7F; }
pm=0; ch=0; e=0; PORTK = 0xFF;
PORTF = 0x20; gear = 0x20;
delay(250);
}

Por favor edita tus 4 post, porque todos tienen alguna falla de acuerdo a las normas. Mientras iré respondiendo tus inquietudes. Te envié privado con las instrucciones pero tmb están en el primer hilo de cualquier sección.