Hallo alle.
Ich möchte eine Lin-Kommunikation mit der UART des ATMega168
realisieren. habe dazu einen ATA6662 Transceiver angeschlossen.
(um den Master muss ich mich nicht kümmern)
Ich erhalte einen Master-Header, auf die ich an meinen Slave reagieren
möchte.
Der Master ist ein BabyLIN modul von der Firma Lipowsky.
Am oziloskop sehe ich, das der Head gesendet wird. Jedoch antwortet mein
Slave nicht.
Folgendes zum Programmablauf:
-Ich sammel am ADC Werte bis eine Nachricht anliegt.
-Dann springt das Programm in eine ISR, wo der Slave auf die Anfrage des
Masters antworten soll.
so weit so gut.
-Ich prufe, ob ein Frame Error vor liegt (entpricht einem Sync-Break)
funzt auch noch.
-Ich lese das nächte Byte, welches eine Hex55 (dez85) also das Sync-Feld
ist, ein. Das Funz leider nicht richtig!!!
-Nun überspringe ich das problem in dem ich fest sage es liegt eine
hex55 vor und lese das nächte Byte ein, welches die ID ist. Aber wieder
komm ich nicht in die Funktion.
Was mach ich falsch?
Wer kann Helfen?
Gruß Sticky
Ich möchte eine Lin-Kommunikation mit der UART des ATMega168
realisieren. habe dazu einen ATA6662 Transceiver angeschlossen.
(um den Master muss ich mich nicht kümmern)
Ich erhalte einen Master-Header, auf die ich an meinen Slave reagieren
möchte.
Der Master ist ein BabyLIN modul von der Firma Lipowsky.
Am oziloskop sehe ich, das der Head gesendet wird. Jedoch antwortet mein
Slave nicht.
Folgendes zum Programmablauf:
-Ich sammel am ADC Werte bis eine Nachricht anliegt.
-Dann springt das Programm in eine ISR, wo der Slave auf die Anfrage des
Masters antworten soll.
so weit so gut.
-Ich prufe, ob ein Frame Error vor liegt (entpricht einem Sync-Break)
funzt auch noch.
-Ich lese das nächte Byte, welches eine Hex55 (dez85) also das Sync-Feld
ist, ein. Das Funz leider nicht richtig!!!
-Nun überspringe ich das problem in dem ich fest sage es liegt eine
hex55 vor und lese das nächte Byte ein, welches die ID ist. Aber wieder
komm ich nicht in die Funktion.
Was mach ich falsch?
Wer kann Helfen?
Gruß Sticky
Code:
ISR (USART_RX_vect) { //Die Interupt Service Routine wird ausgeführt wenn ein zeichen empfangen wird
uint16_t TMPchecksum = 0;
uint8_t checksum; //Hier steht die Enhanced Checksumme
uint8_t ID; //Hier steht die vom Master versandte ID (ohne Paritätsbits)
uint8_t PID; //Hier steht die vom Master versandte ID (mit Paritätsbits)
uint8_t ID_adr; //Hier stehen die oberen drei Bits der ID mit der die Baugruppe angesprochen wird
uint8_t ID_func; //Hier stehen die unteren drei Bits der ID mit der die Funktionen ausgeführt werden
uint8_t SyncFeld;
uint8_t Sync_Break;
//LIN KOMMUNIKATION STARTET HIER
Sync_Break=Receive_Byte();
if (Sync_Break){ //Ein Frame Error wird durch ein Sync-Break hervorgerufen
Sync_Feld=Receive_Byte();
if (SyncFeld==0x55){
PID = Receive_Byte();
ID = (PID & 00111111); //ID (ohne Paritätsbits)
ID_adr = (ID >> 3);
ID_func = (PID & 00000111);
if(Paritaet_Berechnen(PID)) {
if ((ID_func==0) && (Slave_Address==ID_adr)){
for (uint8_t i=0; i<=6; i++){
Send_Byte(Daten[i]); //gesammelte Daten senden
TMPchecksum= TMPchecksum + Daten[i]; //Checksumme berechnen (CARRY-BIT fehlt noch)!!!!!!!
}
TMPchecksum = TMPchecksum+PID; //Enhanced Checksumme!
//Low-Byte der checksumme + High-Byte der checksumme
checksum = (uint8_t) ((TMPchecksum & 0x00FF) + (TMPchecksum >> 8));
checksum= ~checksum; //Checksumme invertieren
Send_Byte(checksum); //anschließend die Checksumme senden
}
if ((ID_func == 1) && (Slave_Address==ID_adr)){
Set_RelaisPB1(1); //Relais1 einschalten
}
if ((ID_func == 2) && (Slave_Address==ID_adr)){
Set_RelaisPB1(0); //Relais1 ausschalten
}
if ((ID_func == 3) && (Slave_Address==ID_adr)){
Set_RelaisPB2(1); //Relais2 einschalten
}
if ((ID_func == 4) && (Slave_Address==ID_adr)){
Set_RelaisPB2(0); //Relais2 ausschlaten
}
if ((ID_func == 5) && (Slave_Address==ID_adr)){
Set_RelaisPB1(1);
Set_RelaisPB2(1); //Relais1+2 einschlaten
}
if ((ID_func == 6) && (Slave_Address==ID_adr)){
Set_RelaisPB1(0);
Set_RelaisPB2(0); //Relais1+2 ausschlaten
}
if ((ID_func == 7) && (Slave_Address==ID_adr)){
SW_Reset(); //Reset auslösen
}
}//parität
else{
DDRC = (1 << DDC4);
PORTC |= (1<<PC4);} //gelbe LED eischalten, somit liegt ein Paritätsfehler vor
}//syncfeld
}//FE
}//ISR