python skickar först ett tecken som avgör vilket index som nästkommande värde ska sparas till
atmegan svarar genom att skicka tillbaka samma sak som den har mottagit (på så vis kan det kontrolleras i python att kommunikationen har gått rätt till)
python skickar nu det värde som ska sparas
atmegan sparar detta värde (samt skickar tillbaka det till python)
För att debugga så låter jag atmegan visa ett värde ur denna array mha LED:sen på STK:n, vilket index som visas kan jag ändra genom att skicka ett speciellt tecken från python.
Det hela funkar fint.. nästan hela tiden, ibland så byter atmegan det index som visas utan att python har skickat ett kommando om detta! i python görs en automatisk kontroll att det som kommer tillbaka från atmegan överrensstämmer med det som skickades så jag ser då att atmegan inte har feltolkat något kommando. Eftersom python alltid väntar på ett svar innan det skickar nästa kommando så sker det heller inga buffer overflows(?). Pga detta så är jag tämligen säker på att felet inte ligger i själva kommunikationen utan någon annanstans men jag kan inte komma på var

Min enda tanke om vad det skulle kunna vara är att jag har deklarerat för lite utrymme för någon variabel och att denna i så fall ibland skriver över variabeln "displayed_channel" men som sagt så kan jag inte komma på var i såna fall.
Nedan ser ni min interruptfunktion i atmegan, sist i kommentarerna till varje case har jag lagt till vilket tecken som motsvarar respektive case.
Kod: Markera allt
ISR(USARTRXC_vect){
static int index;
static int displayed_channel= 0;
static uint8_t serial_data[5]; //vector, 5 elements
static char received_byte;
received_byte = UDR; //reading register
switch(received_byte){
case CHANNEL_1: //axis 0 'a'
index = 0;
break;
case CHANNEL_2: //axis 1 'b'
index = 1;
break;
case CHANNEL_3: //axis 2 'c'
index = 2;
break;
case CHANNEL_4: //axis 3 'd'
index = 3;
break;
case CHANNEL_5: //axis 4 'e'
index = 4;
break;
case CHANGE_CHANNEL_TO_DISPLAY: // for debugging 'f'
displayed_channel++;
if (displayed_channel > 4){
displayed_channel = 0;
}
break;
default:
serial_data[index] = (uint8_t)received_byte;
PORTB = ~serial_data[displayed_channel]; // for debugging
break;
}
serial_write(&received_byte);
}