Forum: Mikrocontroller und Digitale Elektronik DMX Empfangsproblem mit ATMega16 und Hennes lib @ ASM


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

nach nun zwei recht frustrierenden Wochen muss ich mich doch mal mit der 
Bitte um Hilfe an euch wenden. Ich bin beim Räumen wieder auf meine AVR 
Kiste gestoßen, was meist nicht gut endet. Ziel war es eigentlich nur 
einen kleinen DMX empfänger zu bauen. Zusammen mit Hennes lib, bei der 
es ja eigentlich nicht viele Fehler zu begehen gibt sollte das auch 
schnell gehen, aber da begannen die Probleme... Bei der Suche im Forum 
bin ich schon über einige Themen dazu gestoßen, die aber leider alle in 
C waren und mir somit nicht viel weiter geholfen haben (ich muss dazu 
sagen, das ich C dabei nicht verwenden möchte, auch wenn ich in meiner 
Verzweiflung schonmal das ganze in C durchgespielt habe, mit ähnlichem 
Ergebnis). Ich habe mittlerweile schon alles in eine Datei geschrieben 
und soweit zusammen gepackt und Dokumentiert, dass es hoffentlich 
übersichtlich genug ist.

Benutzte Bauteile:
ATMega16@16Mhz ext. Quarz

Busbaustein:
SN75176BP

Die Beschaltung ist recht einfach:
Die Datenleitungen vom 75176 sind an Rx und TX (PD0 und PD1) sowie die 
Richtungsleitung an PD2.
In meiner Verzweifelung ist mittlerweile auch die DMX Leitung am Board 
terminiert (120 Ohm) um weitere Störungen auszuschließen. Das DMX Signal 
ist sauber und kommt von einem DE interface oder optional von einer 
Easylase, um auch da Fehler auszuschließen.

Die zu schaltende LED liegt auf PA4 und funktioniert auch ;-) Die Ports 
A,B und C sind as Ausgänge geschaltet und Theoretisch gerade zu 
Debugzwecken mit LEDs versehen. DIP schalter kommen nicht zum Einsatz, 
um da auch die Fehlerquelle ausschließen zu können. Quarz schwingt, 
Fuse-Bits sind in Ordnung.

Jetzt zum Fehler:
Die Startadresse sollte 1 sein. Es passiert nur ... nichts. Etwas 
verwundert hat mich allerdings, dass die LED nach kurzer Zeit anfängt zu 
leuchten, wenn ich Kanal 2 und 3 auf 255 stelle.
Laut Debugversuchen lande ich auf jeden Fall im FE und bekomme auch das 
Startbyte. Wenn ich mich mal spaßeshalber immer die empfangenen Bytes 
auf einem Port rausschmeissen lasse, kann ich auch ganz PWM like die 
Daten sehen ;-). Meine erste Vermutung war eine Falsche USART Baud 
einstellung aber mit "3" laut Hennes berechnung und nach dem Datenblatt 
(Seite 171) liege ich damit richtig. Eine weitere Vermutung lag darin, 
die Startadresse falsch eingebaut zu haben (keine inversion, da nicht 
über DIPS eingelesen), was aber immernoch nicht das plötzliche leuchten 
der LED erklärt. Da mag aber auch ein Fehler liegen. Bevor ich es 
vergesse zu erwähnen: ich habe den Code auch schon mehrfach im Simulator 
durchgespielt, bin aber auch dort nicht auf die Lösung des Problems 
gestoßen.

Das Board des Atmels ist fehlerfrei und funktionstüchtig mit jeglicher 
anderen Software. Um dem theoretischen Problemausschluss vorzubeugen, 
möchte ich dazu sagen, dass ich Atmels nicht fremd bin und das 
Verständnis des DMX Protokolls und Hennes Code eigentlich auch nicht das 
Problem sein sollte. Ich hoffe, nur einen kleinen Fehler übersehen zu 
haben.

Vielen Dank schonmal für die Hilfe,

Grüße,
Daniel

von Daniel (Gast)


Lesenswert?

Nochmal zum vorliegenden Signal:

habe es gerade nochmal mit richtiger DMX Hardware getestet. Das 
Eingangssignal ist OK.

Grüße,
Daniel

von Steffen H. (avrsteffen)


Lesenswert?

Ist die FW von Henne nicht für ein 8515 geschrieben?

von Steffen H. (avrsteffen)


Lesenswert?

Hast du mal die DMX  Empfangsroutine übersprungen? Also einfach oben in 
dem Interrupt Vector mal wieder ein reti rein machen. Passiert dann das 
selbe mit deiner LED? geht die dann trotzdem an?

von Daniel (Gast)


Lesenswert?

Ja, die lib ist für den 8515 geschrieben, aber ich habe versucht, alles 
soweit zu überarbeiten, dass es auch auf dem ATMega16 laufen sollte.

@Steffen
Hab ich gerade mal getestet, aber da tut sich nichts.

grüße,
daniel

von Steffen H. (avrsteffen)


Lesenswert?

muss das nicht DMX_FIELD = 0x0060 heißen? Adresse ist doch 16bit, oder?

von Steffen H. (avrsteffen)


Lesenswert?

Also ohne Interruptroutine bleibt die LED aus, oder?

von Daniel (Gast)


Lesenswert?

Ja, die LED Bleibt aus bei nicht belegtem Interrupt.

also im Simulator schreibt er es an die erste Stelle vom Databereich und 
im Datenblatt steht, dass das SRAM im $0060 startet.

von Daniel (Gast)


Lesenswert?

ok, auch nach einem test auf sicherheit, ist der wechsel auf 0x0060 beim 
SRAM start erfolglos... aber eine gute idee war es.

von Steffen H. (avrsteffen)


Lesenswert?

Der Fehler liegt irgendwo hier:

dmx_startbyte:
  tst   tempH           ;if null-> Startbyte
  brne   dmx_err
  inc    DMXstate         ;next -> start address


  ldi    XL, low(0x0001)    ;get start address for dummys. Liegt hier 
der Fehler?
  clr    XH
  rjmp  dmx_finish

dmx_startadr:
  sbiw  XH:XL, 1
  brne  dmx_finish
  ldi   XH, high(DMX_FIELD)
  ldi    XL,  low(DMX_FIELD)
  inc    DMXstate         ;next-> data handler

dmx_handle_byte:
  st    X+, tempH

  cpi    XL, low(DMX_FIELD +DMX_CHANNELS)
  brne  dmx_finish
  cpi    XH, high(DMX_FIELD +DMX_CHANNELS)
  brne  dmx_finish
  clr    DMXstate
  rjmp  dmx_finish

von Steffen H. (avrsteffen)


Lesenswert?

Du initialisierst Pointer X mit "1" wenn du das Startbyte(0) erfolgreich 
gefunden hast. Beim nächsten Einsprung in den IRQ bekommst du ja schon 
das 1.Datenbyte von CH1. Der X-Pointer wird dann "0" und wird dadurch 
mit deiner Datenadresse im SRAM geladen und speichert die Date von CH1 
auf den 1.Platz.

von Steffen H. (avrsteffen)


Lesenswert?

Also wenn du ein richtiges DMX-Signal hast, sollte es doch gehen..
Werd es jetzt selber mal testen.

von Daniel (Gast)


Lesenswert?

>>Du initialisierst Pointer X mit "1" wenn du das Startbyte(0) erfolgreich
>>gefunden hast.

Ja, dann bin ich im DMX state 1, bzw danach 2

>>Beim nächsten Einsprung in den IRQ bekommst du ja schon
>>das 1.Datenbyte von CH1.

ja, und jetzt muss ich solange runterzählen, bis ich bei Null bin, um 
mein gewünschtes Byte zu finden.

>>Der X-Pointer wird dann "0" und wird dadurch
>>mit deiner Datenadresse im SRAM geladen und speichert die Date von CH1
>>auf den 1.Platz.

Soweit korrekt, aber wo ist da ein Fehler? Ich lade das Byte an den 
Speicherplatz, wo es hin soll. Der Text ist von Henne übernommen und 
sollte eigentlich da keine Fehler aufweisen.

Aber danke fürs direkte testen.

von Daniel (Gast)


Lesenswert?

evtl. sollte ich das ganze nochmal from scratch bauen... aber warum 
immer das rad neu erfinden? :-) Ich finde Hennes Lib eigentlich Klasse, 
um an dieser stelle nochmal seinen Code und das Bereitstellen für alle 
zu würdigen.

von Steffen H. (avrsteffen)


Lesenswert?

Tja, aber in meiner Simulation wird UBBRH auf 0x8E gesetzt wenn du UCSRA 
beschreibst!

von Steffen H. (avrsteffen)


Lesenswert?

Ein Bug im Simulator? Eigentlich sollte doch durch UMSEL=1 UCSRA 
beschrieben werden.. komisch

von Steffen H. (avrsteffen)


Lesenswert?

Tja sorry, hab aber im Moment kein DMX Signal da zum testen.

von Daniel (Gast)


Lesenswert?

hmm, ich sehe es gerade auch... irre aktion... würde sinnfreien empfang 
erklären... aber wie kommt das zustande?

von Daniel (Gast)


Lesenswert?

kk, vielen Dank schonmal ich werde mal weiter mein Glück probieren. 
Meine Vermutung wäre jetzt, das ich eine falsche Baudrate erwische, und 
das 1. Byte nur finde, wenn ich 2 mal den Wert 255 auf Ch. 1 und 2 habe 
und das als 1. Byte empfangen wird ...

von Daniel (Gast)


Lesenswert?

oh, kommando zurück, die 0x8E kommen durch das URSEL UCSZ0 und USBS ;-) 
ich bin anscheinend durcheinander...

von Daniel W. (wolti)


Lesenswert?

OK, neue überprüfungen... Evtl. kann jm. damit ja etwas anfangen:

füge ich in den Code bei:
1
dmx_startbyte:
2
  out    PORTC,tempH
3
  tst    tempH     ;if null-> Startbyte
4
  brne   dmx_err
5
  inc    DMXstate     ;next -> start address
6
7
  ldi    XL, low(0x0001)  ;get start address for dummys
8
  clr    XH
9
  rjmp   dmx_finish

das "out  PORTC,tempH" ein und betrachte das Ergebnis, dann sehe ich 
permanent die erste LED leuchten und zeitweise die Zweite flackern 
(vorausgesetzt, alle Ch sind auf 0 gesetzt) ich schließe jetzt mal 
daraus, dass evtl. etwas mit den USART Einstellungen nicht stimmt...

Wobei:
URSEL stimmt
UCSZ0 und UCSZ1 stimmen (8-Bit)
und USBS auf 2 Stoppbits ist auch richtig...

von Sven K. (svenk)


Lesenswert?

Hi,

warum

ldi     tempL, (1<<URSEL)|(3<<UCSZ0)|(1<<USBS)

und  nicht

ldi     tempL, (1<<URSEL)|(1<<UCSZ0)|(1<<USBS)

???

Gruß Sven

von Daniel W. (wolti)


Lesenswert?

siehe Datenblatt (s. 167):

UCSZ0 = 1
UCSZ1 = 1

macht 8 bit

von Daniel W. (wolti)


Lesenswert?

Ok, weiter zurück. Mal nachgeschaut, was eigentlich im Main immer so 
compared wird und siehe da, die Speicherstelle ist definitiv immer 0x00. 
Es wird also schonmal nichts gespeichert. Mal weiter eingrenzen...

von Daniel W. (wolti)


Lesenswert?

;-) neue Messung. wenn ich bei allen FE's einfach mal einen counter 
erhöhe, wie z.B. so:
1
dmx_frame_error:
2
   inc  errors
3
  ldi   DMXstate, 1  ;FE detected as break
4
  cbi  UCSRA,FE  
5
  rjmp  dmx_finish

und den counter bei jeder abfrage der Startadresse lösche (also ein 
sauberes Startbyte empfangen habe) z.B. da:
1
dmx_startbyte:
2
  tst   tempH     ;if null-> Startbyte
3
  brne   dmx_err
4
  clr   errors
5
  inc    DMXstate     ;next -> start address

und das ganze mal ausgeben lasse (natürlich invertiert)...
Dann habe ich einen total gechillten etwas ungleichmäßigen aber doch 
sehr schön anzusehenden Binärzähler...
Es bleibt für mich also nur die vermutung, dass einfach nur Müll 
empfangen wird...

SN75176 ist getauscht, ohne besserung ... Weiss jm. ob der Mega16 sonst 
noch irgendwelche tollen einstellungen für den USART braucht, die ich 
übersehen habe?

Danke schonmal,
Daniel

von Sven K. (svenk)


Lesenswert?

Und Du hast definitiv richtig gefused auf 16Mhz,
also CKOPT steht auf 0 ??

Gruß Sven

P.S.: Und zu meiner Frage weiter oben,
ich hatte mich etwas unklar ausgedrückt.....

Um es besser lesen zu können hätte ich so etwas vorgeschlagen:

; Frame-Format: 8 Bit

in  tempL,UDR
clr  tempL
out  UCSRA,tempL
ldi  tempL, (1<<RXCIE) | (1<<RXEN)
out  UCSRB, tempL
ldi     tempL, (1<<USBS)|(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
out     UCSRC, tempL

von Sven K. (svenk)


Lesenswert?

Hi Daniel,

und läufts ?

Gruß Sven

von Sven K. (svenk)


Lesenswert?

Hi Daniel,

mir ist noch als Fehler eingefallen, das Du vielleicht
A und B am 75176 vertauscht hast ?

Gruß Sven

P.S.: Gib doch mal nen Status ob Du es schon gelöst hast. ;-)

von daniel (Gast)


Lesenswert?

Bin gerade erst von einem Event zurück ;-) Hab mich jetzt 4 Tage mit 
Technik rumgeschlagen und werde mich ab morgen wieder ran setzen ;-) 
Aber danke schonmal.

Grüße,
Daniel

von Sven K. (svenk)


Angehängte Dateien:

Lesenswert?

Hi Daniel,

habe den Code von Dir ein wenig verändert.

1. mega8def-File
2. die ganzen nops aus dem ISR Bereich raus
3. die letzten beiden ISR retis auskommentiert,
   da m8 nur 19 besitzt
4. PB1 als LED benutzt.
   Anode an VCC, Kathode mit Widerstand an PB1.
5. PORT A,B,C generell mal auskommentiert,
   und nur PB1 auf Ausgang

Bus ist ganz normal über Tx,RX und PD2 (Enable) angeschlossen.
Frequenz: 16Mhz

Fazit: Es funktioniert !

Kanal 1 schaltet LED bei Werten >=127 ein und drunter aus. ;-)

Für den Mega16 müsstest Du das def File ändern
und die 2 reti wieder auskommentieren.
(ISR für UART_RECV_COMPLETE liegt bei beiden an 12. Stelle ;-) )
Dann muss das gehen ;-) !!!!

Gruß Sven

von Falk B. (falk)


Lesenswert?

@  Sven K. (svenk)

>Für den Mega16 müsstest Du das def File ändern
>und die 2 reti wieder auskommentieren.
>(ISR für UART_RECV_COMPLETE liegt bei beiden an 12. Stelle ;-) )
>Dann muss das gehen ;-) !!!!

AUA! Das geht NICHT! Der Mega 8 hat 1 Word pro ISR Vektor, der Mega 16 
ZWEI!!!

MfG
Falk

von Sven K. (svenk)


Lesenswert?

Falk Brunner schrieb:
>
> AUA! Das geht NICHT! Der Mega 8 hat 1 Word pro ISR Vektor, der Mega 16
> ZWEI!!!
>

Asche über mein Haupt. Gut dann muss er seine eigenen
reti Definitionen von oben verwenden und belassen.

@Falk: Danke, das Du so aufmerksam mitliest.


Gruß Sven

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.