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.
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.