ich habe ein code gesrieben, um ein LIN-Bus zu realisiren durch AT90CAN128. das code tut bis jetzt nix ich weiß nicht woran das ligt? könnte vieleicht jemand , der mit LIN-Protokolle auskennt das anschauen vieleicht könnte was das fehler entdeken danke
:
Gesperrt durch Moderator
sorry code habe ich vergessen #include "lin_drv_usart.h" ////G L O B A L S // volatile BYTE id; //Ohne parity bits volatile BYTE id_w_parity; //lin v1.3 identifier mit gerechnete parity bits volatile BYTE tab_data[8]; //8 bytes daten puffer volatile BYTE Index; //Index for data buffer volatile BYTE status; volatile BYTE err; //lin error status volatile BYTE state; //lin state machine status volatile BYTE cmd; //lin current command volatile BYTE cpt; //Zähler volatile UINT crc; //lin checksumme /** * @fn SIGNAL(USART0_RX_vect) * @brief This interrupt function manages the State machine of the LIN. **/ SIGNAL(USART0_RX_vect) { switch (state) { //////STATE_CK_BREAK:///// // case ST_CK_BREAK: if (Uart_get_byte() == 0x00) { Set_BRR(UART_BRR_NORM); switch(cmd) { // Slave Task case LIN_S_TX: case LIN_S_RX: state = ST_CK_SYNC; break; // Master Task case LIN_M_TX: case LIN_M_RX: Uart_send_byte(0x55); // sende Synchronisationsfeld crc = LIN_CalcChecksum(); // rechne Checksumme state = ST_CK_SYNC; // nächste Zustand break; default: state = ST_CK_SYNC; break; } } else { state = ST_CK_BREAK; } break; /////STATE_CK_SYNC://// // case ST_CK_SYNC: if (( Uart_get_byte()==0x55 ) ) { switch(cmd) { // Master Task case LIN_M_TX: case LIN_M_RX: id_w_parity = LIN_InitIdField(id ); //add P0/P1 parity bits Uart_send_byte(id_w_parity); //sende id mit parity state = ST_ID_TX; //nächste Zustand break; default: // in slave mode state = ST_ID_RX; break; } } else { state = ST_CK_BREAK; status = MSK_ST_ERR; switch(cmd) { case LIN_M_TX: case LIN_M_RX: err = MSK_ST_ERRBIT; // Bit fehler break; default: // in slave mode err = MSK_ST_ERRSYNCHRO; // Synchronisationsfehler break; } } break; // /////STATE_ID_TX:////// // case ST_ID_TX: if (Uart_get_error()) // fehler aufgetreten?? { err = MSK_ST_ERRBIT; // Bitfehler status = MSK_ST_ERR; // fehler aufgetreten state = ST_CK_BREAK; // zu ST_CK_BREAK springen Set_BRR(UART_BRR_SYNC); // baud rate ändern } else if((Uart_get_byte() == id_w_parity)) // Parity empfangen ?? { switch (cmd) { //TRANSMITION// case LIN_M_TX: // sende daten Index = Lin_dlctonbyte(id); // gibt Datenfeldlänge if (Index) { Uart_send_byte(tab_data[0x00]); state = ST_DATA_TX; // zu ST_DATA_TX Zustand Index--; cpt = 0x01; } else { /* nix */ } break; //RECEPTION// case LIN_M_RX: // Empfang daten state = ST_DATA_RX; // zu ST_DATA_RX Zustand cpt = 0x00; Index = Lin_dlctonbyte(id); //gibt datenfeldlänge break; default: break; } } else { state = ST_CK_BREAK; // zu ST_CK_BREAK springen err = MSK_ST_ERRBIT; status = MSK_ST_ERR; // fehler augetreten Set_BRR(UART_BRR_SYNC); // baud rate ändern } break; // /////STATE_DATA_RX:////// RECEPTION // case ST_DATA_RX: if (Uart_get_error()) // fehler aufgetreten?? { err = MSK_ST_ERRBIT; status = MSK_ST_ERR; state = ST_CK_BREAK; // zu ST_CK_BREAK springen Set_BRR(UART_BRR_SYNC); // } else { tab_data[cpt]=Uart_get_byte(); // daten empfangen cpt++; if(cpt == Index) // datenfeldlänge stimmt ?? { crc = LIN_CalcChecksum(); // rechnet Checksumme state = ST_CRC_RX; // nächste zustand } } break; // /////STATE_DATA_TX://////TRANSMITION // case ST_DATA_TX: if (Uart_get_error()) // fehler aufgetreten?? { //stop bitfehler err = MSK_ST_ERRBIT; status = MSK_ST_ERR; state = ST_CK_BREAK; // zu ST_CK_BREAK springen Set_BRR(UART_BRR_SYNC); // baud rate ändern } else if ((Uart_get_byte() == tab_data[ cpt-1 ])) { if (Index) { Uart_send_byte(tab_data[cpt]); // daten gesendet Index--; cpt++; } else { Uart_send_byte(crc); // sende Checksumme state = ST_CRC_TX; // zu nächste Zustand } } else { err = MSK_ST_ERRBIT; //stop bitfehler status = MSK_ST_ERR; state = ST_CK_BREAK; // zu ST_CK_BREAK springen Set_BRR(UART_BRR_SYNC); // baud rate ändern } break; // /////STATE_CRC_RX://////RECEPTION // case ST_CRC_RX: if (Uart_get_error()) // fehler ?? { err = MSK_ST_ERRBIT; status = MSK_ST_ERR; } else if ( Uart_get_byte() != ((crc) & (0x00FF)) ) // Checksumme geprüft { err = MSK_ST_ERRCSUM; // Checksumme fehler status = MSK_ST_ERR; } else { status = MSK_ST_RXOK; // Reception erfolgt } state = ST_CK_BREAK; // das ganze widerholen: zum ersten Zustand Set_BRR(UART_BRR_SYNC); // baud rate änderen break; // /////STATE_CRC_TX://////TRANSMITION // case ST_CRC_TX: if (Uart_get_error()) //feler augetreten ?? { err = MSK_ST_ERRBIT; status = MSK_ST_ERR; } else if (Uart_get_byte() != ((crc) & 0xFF)) // check summe geprüft { err = MSK_ST_ERRCSUM; // Checksumme fehler status = MSK_ST_ERR; } else { status = MSK_ST_TXOK; // Transmision erfolgt } state = ST_CK_BREAK; // das ganze widerholen: zum ersten Zustand Set_BRR(UART_BRR_SYNC); break; default: state = ST_CK_BREAK; Set_BRR(UART_BRR_SYNC); break; }//end case }//end usart rxc isr
Ich habe auch viele Programme, die nicht funktionieren. Manchmal funktionieren Programme nicht, weil die Versorgungsspannung fehlt. Sollte man doch auf dem Oskar schnell sehen können.
HI mit nicht funktioniert habe ich nicht gemeint das LIN-protokol ob ich vollständig imlimentiert habe oder habe was vergessen?? aber versorgung spannung ist schon da.
Dann probiere doch einfach aus, was geht und was nicht. Die Arbeit wird Dir hier keiner abnehmen.
Wenn Du mich mal ganz lieb fragst, dann schicke ich Dir ein funktionierendes Beispiel (LIN1.3 oder 2.0)...
...wie kann man nur so viel spass daran haben jemandem nicht zu helfen!? Dennis
Hallo, verstehe auch nicht warum den Jenigen, die nicht helfen wollen oder können . die anderen ärgern. Es reicht wenn die nicht antworten oder tut mir leid ich weiß nicht sagen . jetzt mein nächste frage aber ,bitte euch ich habe genug stress. Leute die nicht helfen wollen nicht antworten. Ich habe bis jetzt geschafft ein Signal aus den LIN-Transceiver raus zu sehen und zwar den lin Synchronisations- Break und Synchronisationss Feld ja es sieht nicht aus wie das Signal, das man in Literatur Bucher sieht aber trotzdem ist schon was. In mein Zustandsmaschine wurde den Synchronisations feld nicht detektiert deshalb macht nicht weiter und springt zum Synchronisations-Break wieder könnte jemand vielleicht warum ? das war mwin erste Frage . Zweite Frage: ich benutze 16.0000 M Quarz und ich weiß nicht, ob ich Überhaupt den Takt fraquenz in den knoten haben darf oder ist das zu viel? Danke euch alle
> ...wie kann man nur so viel spass daran haben jemandem nicht zu helfen!?
Wie kann man nur so unverschämt sein, 5 Meter Code einzustellen und zu
fragen: "Was mache ich falsch", ohne sich zuvor auf den eigenen Hintern
gesetzt zu haben ?
ich habe leute gefragt, die schon mal mit LIN-bus was gemacht haben, und den LIN-Protokol kennen. LIN-BUS experten?? <steht oben sehr gross gesrieben> fals du nicht zu "LIN-experten" gehört, hättest du liber nix antworten.!!
Linni schrieb: > dann schicke ich Dir ein > funktionierendes Beispiel (LIN1.3 oder 2.0)... Huhu! Treibt sich der "Linni" hier noch rum und würde mir vielleicht mal das besagte Beispiel für LIN zusenden? ;-) LG Daniela
Hallo, der code list ungewohnlich. Nach welchem Lin protokoll dem alten oder Eminem neueren Auch scheint mir gewisses ausserhalb der specs. Auf erstem blick, nachdem 0x55 gesendet wird geht die state machine in ST_CK_SYNC wobei deren case Anweisung auskommentiert list.
Hi
>Hallo, der code list ungewohnlich.
Vor allem: er ist 8 Jahre alt.
MfG Spess