Hallo an alle. Ich Versuch gerade mit der UART meines ATMega168 eine LIN-Nachricht zu empfangen (ATA6662 LIN-Transceiver vorgeshaltet). Das Erste was ich empfange ist das Sync-Break. Das erkenne ich am gesetzten Frame Error Flag im Statusregister. Dieses Frame ist laut Datenblatt Read-Only. Ich habe aber das gefühl das ich kein weiteres Daten-Byte (Sync-Field entspricht 0x55) erhalten kann, weil das Frame Error Flag noch gesetzt ist. Meine Frage wäre nun, weiß jemand wie man das Frame Error Flag rücksetzen kann? Danke Gruß Sticky
kennt sich echt keiner damit aus?
Amir B-a schrieb: > Ich habe aber das gefühl das ich kein weiteres > Daten-Byte (Sync-Field entspricht 0x55) erhalten kann, weil das Frame > Error Flag noch gesetzt ist. Dein Gefühl täuscht dich. > Meine Frage wäre nun, weiß jemand wie man das Frame Error Flag > rücksetzen kann? Gar nicht. Das setzt sich selber zurück, sobald in UDR ein Zeichen steht, das korrekt empfangen wurde.
Gast
#1263254
Na ja: Das Datenblatt sagt, daß das Flag gültig ist, bis der Receive-Buffer UDRn gelesen wird (es gilt ja auch für ihn speziell). Also Buffer auslesen und Inhalt im Zweifelfall verwerfen. Es steht übrignes noch viel mehr im Datenblatt zum Thema wann was wie ausgelesen und geschrieben werden muß. Ehrlich.
Gast
#1263255
Hi >Meine Frage wäre nun, weiß jemand wie man das Frame Error Flag >rücksetzen kann? Schon mal Datenblatt gelesen? S.192 (bei mir): 'Always set this bit to zero when writing to UCSRnA.' MfG Spess
Gast
#1263259
S.192 (bei mir): 'Always set this bit to zero when writing to UCSRnA.' Schon, aber es ist readonly und soll nur "for compatibility with future devices" so geschrieben werden.
@ Spess Na klar habe ich das Datenblatt gelesen. Was soll immer diese dumme Unterstellung! Ist es nun wahr, daß das Flag von selbst zurück resetzt wird, wenn im Empfangsregister ein gültiges Byte steht? Wie gesgt ich hatte die Vermutung, daß es nicht zurückgesetzt wird, weil ich beim Empfangen des Sync-Felds eine Rote LED einschalte (bei einem Frame Error eine grüne) diese rote LED leuchtet nur nie. Hier der Code
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
> Ist es nun wahr, daß das Flag von selbst zurück resetzt wird, wenn im > Empfangsregister ein gültiges Byte steht? Ja, ist es. Aber damit ein gültiges Byte in das Empfangsregister nachrücken kann, musst du daraus das fehlerhafte erst mal rausholen. Und genau das tust du in deinem Code nicht.
@ Amir B-a (sticky) >ich beim Empfangen des Sync-Felds eine Rote LED einschalte (bei einem >Frame Error eine grüne) diese rote LED leuchtet nur nie. Besser so.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Wie bereits gesagt, UDR muss man IMMER lesen, sonst gibts Stau, denn dann wird RXC0 nicht gelöscht! Siehe Datenblatt. Ausserdem sollte man ein Break sicherer detektieren, indem man das empfangene Byte auf Null prüft. MfG Falk
Noch was:
1 | |
2 | |
3 | |
Wenn Receive_Byte entweder eine 1 oder das Datenbyte liefert, hat dieser Code mit dem Erkennen eines Sync-Break nichts zu tun. Auch wenn irgendein Datenbyte empfangen wurde ist die Bedingung true.