UART mit LIN-Protokoll

sticky36

Neues Mitglied
11. Aug. 2008
8
0
0
Sprachen
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

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
 

Anhänge

  • Lin.c
    13,4 KB · Aufrufe: 5

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)