Jag har även skippat assembler och börjat nöta i C istället, går mycket lättare än jag trodde.
För att räkna ut skillnaden mellan två kurser(räknar egentligen ut hur stor driften är) gör jag såhär:
Kod: Markera allt
volatile short int Kurs_ar;
volatile short int Kurs_old;
volatile short int Drift;
volatile short int Temp;
void update_DRIFT (void)
{
X = Kurs_ar;
if (X > 1800) X -= 3600;
if (Kurs_old > 1800) Kurs_old -= 3600;
Temp = Kurs_old - X;
if (Temp < -1800) Temp += 3600;
if (Temp > 1800) Temp -= 3600;
Drift = Temp;
Kurs_old = Kurs_ar;
}
"Drift" är hur mycket som skiljer från senaste gången "Drift" beräknades. Resultat blir + eller - beroende på vilket håll.
Eftersom kursen kommer i form av ascii-tecken(8 byte som ser ut såhär 0x0D, 0x0A, Hundratal, Tiotal, Ental, PUNKT, Tiondelar, Checksum) så har jag gjort såhär:
Kod: Markera allt
#define NEWLINE 0x0A
unsigned char Pointer;
volatile short int Kurs_temp;
ISR(USART_RX_vect)
{
char ReceivedByte;
ReceivedByte = UDR0;
if(ReceivedByte==NEWLINE) Pointer = 1;
switch(Pointer)
{
case 1:
Pointer++;
break;
case 2:
Pointer++;
Kurs_temp = ((ReceivedByte - 48) * 1000);
break;
case 3:
Pointer++;
Kurs_temp += ((ReceivedByte - 48) * 100);
break;
case 4:
Pointer++;
Kurs_temp += ((ReceivedByte - 48) * 10);
break;
case 5:
Pointer++;
break;
case 6:
Pointer++;
Kurs_temp += (ReceivedByte - 48);
Kurs_ar = Kurs_temp;
break;
default:
break;
}
}
Är det ett problem att allt görs i avbrotts-rutinen?
Bör jag kolla Checksum också?