Forum: Mikrocontroller und Digitale Elektronik DMX-Empfang mit Atmega169 funktioniert immer noch nicht!


von Markus W. (mark-169)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Ich möchte einen MH mit DMX steuern, die Hardware funktioniert soweit, 
nur beim Programm klemmt es noch trotz intensiver Fehlersuche und 
umwälzen von Tutorials und Foren...

zunächst zu meiner Hardware:
  AVR: Butterfly(Atmega169) -->OK!
  Programmschnittstelle: ISP-Programmieradapter -->OK!
  DMX: kommerzieller DMX-Controller + RS485-Wandler -->OK!

Nun zur Software:
  Code (im Anhang) stammt von "Henne's Sites"
  ... verwende seine Demo (PORTD an wenn DMX >127).
  [[http://www.hoelscher-hi.de/hendrik/light/ressources.htm]]


Ich bin den Quellcode durchgegangen und habe alle Variablen auf Atm169 
angepasst und PortD getestet.

Leider funktioniert immer noch nichts.

Unsicher bin ich mir noch bei der Oszillatorfrequenz und dem einstellen 
der Startadresse.

Nun meine Frage:
Wie kann ich die OSz.freq.-Einstellungen überprüfen (AVRStudio und 
AVRProg)???

Außerdem stimmt das mit der Startadresse (Die Dip-Schalter verwende ich 
nicht; welche Adresse ist auch erstmal egal)?????

Vllt könnt ihr mir Tipps geben!

Danke gruß mark-169

PS: Das Prog besteht aus drei Dateien, habe sie im Anhang untereinander 
geschrieben.
demo_dmx_in.c --> Demo-Prog, schalten des Ports durch DMX-Signal
lib_dmx_in.c --> eigentliches Prog zum Auswerten des DMX
lib_dmx_in.h --> naja erklärt sich von selbst...variablen und co.

von Falk B. (falk)


Lesenswert?

@  Mark Walter (mark-169)

>Unsicher bin ich mir noch bei der Oszillatorfrequenz und dem einstellen
>der Startadresse.

>UBRRH  = 0;
>UBRRL  = ((F_OSC/4000)-1);            >//250kbaud, 8N2

Was soll das? Stimmt zwar, ist aber schlecht lesbar und nciht 
standardkonform. Warum nimmst du nicht die normalen Makros?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#UART_initialisieren

>Nun meine Frage:
>Wie kann ich die OSz.freq.-Einstellungen überprüfen (AVRStudio und
>AVRProg)???

http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

>Außerdem stimmt das mit der Startadresse (Die Dip-Schalter verwende ich
>nicht; welche Adresse ist auch erstmal egal)?????

>uint16_t Temp= (255-PINC); //invert DIP state

Das geht schief. Eher so
1
uint16_t Temp= ~PINC & 0xFF; //invert DIP state

>// *************** DMX Reception ISR ****************
>ISR (USART0_RX_vect)
>{
>uint8_t USARTstate= UCSRA;  //get state
>uint8_t DmxByte= UDR;        //get data
>uint8_t DmxState= gDmxState;  //just get once from SRAM!!!

Hier wäre ich auch vorsichitg. Ich bin mir nicht sicher, ob der Compiler 
ggf. die reigenfolge umstellen darf. Dann geht aber der Zugriff von 
UCSRA vor UDR schief!

MfG
Falk

von Markus W. (mark-169)


Lesenswert?

Hallo Falk! Danke für die schnelle Antwort!

So ich hab des jetzt mal geändert:
1
//DDRD |= (1<<2);
2
//PORTD &= ~(1<<2);  //enable reception
3
[/]
4
UCSRC |= (1<<UMSEL)|(3<<UCSZ0)|(1<<USBS); //ursel
5
UCSRB |= (1<<RXEN)|(1<<RXCIE);
6
7
UBRRH = UBRR_VAL >> 8;
8
UBRRL = UBRR_VAL & 0xFF; //250kbaud, 8N2

Was hat das
1
DDRD |= (1<<2);
2
PORTD &= ~(1<<2);  //enable reception
 eigentlich da zu suchen? Hat doch nix mit Initialisierung/Empfang zu 
tun?

Das mit der Startadresse bekomm ich immer noch net hin, da ich
1
void get_dips(void)
 wegen
1
//#define USE_DIP
 und
1
#ifdef USE_DIP
 nicht verwende? Die Adresse muss ich aber trotzdem definieren!

1
DmxAddress = 0;
???

Mfg Markus

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.