@ Nico D. (Gast)
>AtMegas laufen beide mit 14,7456 Mhz per externen Quarz und Fuses sind
Das ist zwar ein Baudratenquarz, aber DMX mit 250kBaud keine
typische Baudrate. Somit laufen deine beiden AVR ziemlich (gleich)
falsch mit
-8% Fehler. Wenn die zwei unter sich sind kein Problem, aber mit anderen
DMX Geräten geht das nicht.
Für DMX nimmt man 8 oder 16 MHz.
>Wenn ich aber ein FrameError erzeuge um ein BREAK-Befehl zu geben,
>passiert beim Mega8 nix. Er kommt nicht in die if-Abfrage rein (getestet
>mit einfachem Einschalten einer LED) woraus ich schließe, dass er
>irgendwie das Framing-Error nicht erkennt.
Dein Sender sieht OK aus.
> uint8_t USARTstate= UCSRA; // Status vor Daten-Empfang bestimmen !
> uint8_t DmxByte = UDR; // Daten auselesen
> uint8_t DmxState = gDmxState; // just load once from SRAM to increase
speed
Hier wäre ich vorsichtig. Bei den gefühlt eine Million Sonderregleung
und vor allem NICHTregelungen von C kann es sein, dass die reale
Reihenfolge der Abarbeitung bei Zuweisung während der Deklaration nicht
streng definiert ist.
Muss sie aber, sonst geht deine Auswertung schief. Probier's mal old
school.
1 | uint8_t USARTstate; // Status vor Daten-Empfang bestimmen !
|
2 | uint8_t DmxByte; // Daten auselesen
|
3 | uint8_t DmxState; // just load once from SRAM to increase speed
|
4 |
|
5 | USARTstate= UCSRA; // Status vor Daten-Empfang bestimmen !
|
6 | DmxByte = UDR; // Daten auselesen
|
7 | DmxState = gDmxState; // just load once from SRAM to increase speed
|
> empfang = DmxByte; // in die Variable kommt der aktuelle Wert, der über UDR
übertragen wurde und wird in der Main-Funktion an eine LED übergeben, die
entsprechend blinkt
>if (USARTstate & (1<<FE)) // BREAK-Status ueberpruefen
Sollte prinzipiell reichen, sicherer ist aber ein zusätzliches Prüfen
von DmxByte==0
Das mit den diversen else if ist mir etwas diffus, pack das lieber in
einen switch, das ist übersichtlicher und ggf. sicherer.
MfG
Falk