1 | ISR (USART_RX_vect) { //Die Interupt Service Routine wird ausgeführt wenn ein zeichen empfangen wird
|
2 |
|
3 |
|
4 |
|
5 | uint16_t TMPchecksum = 0;
|
6 | uint8_t checksum; //Hier steht die Enhanced Checksumme
|
7 | uint8_t ID; //Hier steht die vom Master versandte ID (ohne Paritätsbits)
|
8 | uint8_t PID; //Hier steht die vom Master versandte ID (mit Paritätsbits)
|
9 | uint8_t ID_adr; //Hier stehen die oberen drei Bits der ID mit der die Baugruppe angesprochen wird
|
10 | uint8_t ID_func; //Hier stehen die unteren drei Bits der ID mit der die Funktionen ausgeführt werden
|
11 | uint8_t SyncFeld;
|
12 | uint8_t Sync_Break;
|
13 |
|
14 |
|
15 | //LIN KOMMUNIKATION STARTET HIER
|
16 | Sync_Break=Receive_Byte();
|
17 |
|
18 | if (Sync_Break){ //Ein Frame Error wird durch ein Sync-Break hervorgerufen
|
19 |
|
20 | UCSR0A &= 0b11100011; //Frame Error Flag löschen;
|
21 |
|
22 | SyncFeld=Receive_Byte();
|
23 | SyncFeld= ~SyncFeld; //0xAA wird empfangen. Durch Invertieren erhält man 0x55
|
24 | //Grund: LIN sendet MSB zuerst und steht im Empfangsregister der UART im LSB
|
25 | if (SyncFeld==0x55){
|
26 |
|
27 | DDRC = (1 << DDC4); //LED ein!
|
28 | PORTC |= (1<<PC4);
|
29 |
|
30 | PID = Receive_Byte();
|
31 | ID = (PID & 0b00111111); //ID (ohne Paritätsbits)
|
32 | ID_adr = (ID >> 3);
|
33 | ID_func = (PID & 0b00000111);
|
34 |
|
35 | if(Paritaet_Berechnen(PID)) {
|
36 |
|
37 |
|
38 |
|
39 | if ((ID_func==0) && (Slave_Address==ID_adr)){
|
40 |
|
41 | for (uint8_t i=0; i<=6; i++){
|
42 | Send_Byte(Daten[i]); //gesammelte Daten senden
|
43 | TMPchecksum= TMPchecksum + Daten[i]; //Checksumme berechnen (CARRY-BIT fehlt noch)!!!!!!!
|
44 | }
|
45 |
|
46 | TMPchecksum = TMPchecksum+PID; //Enhanced Checksumme!
|
47 | //Low-Byte der checksumme + High-Byte der checksumme
|
48 | checksum = (uint8_t) ((TMPchecksum & 0x00FF) + (TMPchecksum >> 8));
|
49 | checksum= ~checksum; //Checksumme invertieren
|
50 | Send_Byte(checksum); //anschließend die Checksumme senden
|
51 |
|
52 | }
|
53 |
|
54 | if ((ID_func == 1) && (Slave_Address==ID_adr)){
|
55 | Set_RelaisPB1(1); //Relais1 einschalten
|
56 | }
|
57 |
|
58 | if ((ID_func == 2) && (Slave_Address==ID_adr)){
|
59 | Set_RelaisPB1(0); //Relais1 ausschalten
|
60 | }
|
61 |
|
62 | if ((ID_func == 3) && (Slave_Address==ID_adr)){
|
63 | Set_RelaisPB2(1); //Relais2 einschalten
|
64 | }
|
65 |
|
66 | if ((ID_func == 4) && (Slave_Address==ID_adr)){
|
67 | Set_RelaisPB2(0); //Relais2 ausschlaten
|
68 | }
|
69 |
|
70 | if ((ID_func == 5) && (Slave_Address==ID_adr)){
|
71 | Set_RelaisPB1(1);
|
72 | Set_RelaisPB2(1); //Relais1+2 einschlaten
|
73 | }
|
74 |
|
75 | if ((ID_func == 6) && (Slave_Address==ID_adr)){
|
76 | Set_RelaisPB1(0);
|
77 | Set_RelaisPB2(0); //Relais1+2 ausschlaten
|
78 | }
|
79 |
|
80 | if ((ID_func == 7) && (Slave_Address==ID_adr)){
|
81 | SW_Reset(); //Reset auslösen
|
82 | }
|
83 | }//parität
|
84 |
|
85 | else{
|
86 | DDRC = (1 << DDC4);
|
87 | PORTC |= (1<<PC4);} //gelbe LED eischalten, somit liegt ein Paritätsfehler vor
|
88 | }//syncfeld
|
89 | }//FE
|
90 | }//ISR
|