Forum: Compiler & IDEs DMX Empfang mit Assembler Problem


von Benedikt Patt (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe ein Problem mit dem angehängten Quelltext, den ich mit Hilfe
der DMX-Tutorials von http://www.hoelscher-hi.de/hendrik/ erstellt
habe.
Das Problemt besteht darin, dass das erste DMX-Byte als Startbyte
interpretiert wird. Das heißt: Der Code funktioniert soweit. Wenn ich
Die Adresse auf Kanal 1 eingestellt habe, reagiert das Teil erst auf
DMX-Kanal 2. Die Kanäle sind also um eins versetzt. Sobald DMX-Kanal 1
einen anderen Wert als 0 hat, wird nichts mehr empfangen. Ich habe mal
testweise den Quelltext so geändert, dass das Startbyte mit 255
verglichen wird. dann werden nur DMX-Daten empfangen, wenn ich Kanal 1
am Pult auf 255 stelle. Irgendwie wird da ein Byte verschluckt.
Vielleicht sieht ja einer von euch einen Fehler.
Vielen Dank im Voraus!

Gruß
   Benedikt Patt

von Stefan K. (_sk_)


Lesenswert?

Da gibt es keinen Fehler, das ist das "normale" DMX-Verhalten:

* StartCode, muss NULL sein
* Datenbytes, bis zu 512
* Break
* Mark after Break

Aus meinem Strand-Lighting DMX-Manual:
...for this reason, a dimmer receiver must not accept as 8-bit level
data, any packet with START CODE other than NULL START following the
RESET.

Also, frei übersetzt:
wenn das erste Byte NICHT NULL ist, dann darf der Dimmer die Daten
nicht annehmen.

Mit was erzeugst Du denn Deine DMX-Signale?

Gruß, Stefan

von Benedikt Patt (Gast)


Lesenswert?

Hallo,

Danke erst mal für deine schnelle Antwort!
Das das Startbyte Null sein muss, ist mir klar. Mein Problem ist nur,
dass der erste DMX-Kanal von meinem Pult (habe auch schon andere Pulte
getestet) als Startbyte interpretiert wird und der 2.Kanal erst als
erstes Datenbyte. Daher denke ich, dass das 'echte' Startbyte
irgendwo verschluckt wird. Im Simulator funktioniert das alles ganz
toll...

Gruß
benne

von Stefan K. (_sk_)


Lesenswert?

Vielleicht empfängst Du mehr als einen Frame-Error. Das würde Dein
Problem jedenfalls erklären. Benutzt Du einen Quarz für den AVR? Ändere
doch mal Deinen Code so ab:

frame_error:
    clr dmx_status        ;dmx_status definiert auf 1 setzen
    inc dmx_status        ;(damit sind auch mehrere Frame_Error mögl.)
    cbi UCSRA,FE          ;clear flag
    clr dmx_byte_counter  ;dmx_byte_counter zuruecksetzen
    ldi Ramh_write,0x00   ;RAM Adresse für DMX Werte setzen
    ldi Raml_write,0x60
    reti

Noch besser wäre es, wenn Du bei einem Frame-Error das empfangene Byte
auf NULL testest und bei <> NULL den dmx_status auf NULL setzt.

Und BITTE! formatiere Deinen Code anständig. Wenn schon Assembler, dann
wenigstens von der Formatierung einigermassen lesbar. Auf Code ohne eine
einzige Einrückung werde ich nicht mehr antworten.

Gruß, Stefan

von Benedikt Patt (Gast)


Angehängte Dateien:

Lesenswert?

Danke für deinen Tipp!
Also für den AVR verwende ich einen 8MHz Quarz. Ich habe den Code
abgeändert und auch eingerückt ;-) Sorry, das war mein erster ASM-Code,
da habe ich noch nicht so drauf geachtet... wobei das natürlich besser
gewesen wäre. Ich kann den Code leider heute Abend erst testetn. Ich
bin mir nicht mehr sicher, ob ich die genannte Änderung nicht schonmal
gemacht habe. Ich melde mich dann nochmal, ob's funktioniert hat.

Gruß
   Benedikt

von Stefan K. (_sk_)


Lesenswert?

Hallo Benedikt,

ich glaube, ich habe Deinen Fehler gefunden. Schau mal im Datenblatt
ATmega16 auf Seite 154 unter "Receiver error Flags":

"Due to buffering of the error flags, UCSRA must be read before the
receive buffer (UDR), since reading of the UDR I/O location changes the
buffer read location."

Auf Deutsch:
Das FE-Flag gibt es nicht nur einmal, sondern für jedes Byte des
Eingangspuffers (der UART des mega ist doppelt gepuffert). Liest Du
jetzt zuerst UDR und dann UCSRA, dann holst Du das falsche FE-Bit.

Drehe mal
get_byte:
    in dmx_Byte,UDR   ;get data
    in temp,UCSRA     ;get USART state

so um:

get_byte:
    in temp,UCSRA     ;get USART state
    in dmx_Byte,UDR   ;get data

Viele Grüße, Stefan

von Stefan K. (_sk_)


Lesenswert?

P.S.:
Dein Code ist so schon viel besser zu lesen!

von Benedikt Patt (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Stefan,

du hast mein Problem gelöst! Nun funktioniert alles. Für alle die es
Interessiert, habe ich den funktionsfähigen Code nochmals angehangen.
Abhängig von den DMX Werten werden die Ausgänge von Port B an oder aus
geschaltet.

Vielen dank nochmal!!

Gruß
   Benedikt

von Hendrik (Gast)


Lesenswert?

Herzlichen Glückwunsch!

Du hast meinen Code geschreddert, hast mit Hilfe des Forums die
übelsten Bugs gefunden und implizierst, dass dieses Konstrukt nun
irgendwie brauchbarer wäre als der Ausgangscode...

Ich weiß, dass ist jetzt nicht wahnsinnig konstruktiv und Du bist von
deiner Leistung wahrscheinlich völlig begeistert - für mich ist dieser
Thread allerdings ziemlich frustrierend.

Hendrik

PS: Bitte haltet Euch (wenigstens zunächst) an den Ursprung:
www.hoelscher-hi.de/hendrik/light/ressources.htm

(und packt dann  ggf. mit 'st X+, dmx_byte' die Daten in das Array
;-)

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

>Du hast meinen Code geschreddert, hast mit Hilfe des Forums die
>übelsten Bugs gefunden und implizierst, dass dieses Konstrukt nun
>irgendwie brauchbarer wäre als der Ausgangscode...

Hat er das behauptet?
Ich kann das jedenfalls nicht aus dem OP herauslesen.
Er verweist doch extra auf Deine Seite. Vielleicht hat er einfach nur
selbst versucht, das ganze "Konstrukt" zu verstehen und hat dann hier
nachgefragt. Ich finde da gar nichts frustrierendes...

Naja, nur mein Senf ;-)

von Hendrik (Gast)


Lesenswert?

@Patrick:
Hast Recht. Ich sollte nach 2h Kleinkrieg mit dem gcc nicht mehr
posten...

Grüße, Hendrik

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Vielleicht solltest Du ja auch einfach mal fragen...

 ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.