mikrocontroller.net

Forum: Compiler & IDEs DMX Empfang mit Assembler Problem


Autor: Benedikt Patt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt Patt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt Patt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.:
Dein Code ist so schon viel besser zu lesen!

Autor: Benedikt Patt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Hendrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
;-)

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Hendrik (Gast)
Datum:

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

Grüße, Hendrik

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht solltest Du ja auch einfach mal fragen...

 ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.