Hi ich habe ein Problem und zwar will ich DMX Senden und Empfangen. Beides einzeln funktioniert auch. Aber sobald ein DMX Signal anliegt was er erkennt Sendet er nicht mehr. Gebe ich dem uC Strom und es liegt kein DMX Signal an Sendet er. Hardware: AVR Atmega 16 @ 8mHz 2 x SN75176 LCD und ein DMX Gerät Oder kann es sein das der uC zu langsam ist um beides Gleichzeitig zu rechnen und sich dann die Interrupts blockieren. eine 16 mHz Quarz habe ich momentan nicht zur Verfügung zum Testen. Aber ich glaube das es ein Softwareproblem ist. Ich finde nur momentan keins. Gruß
@ PcHeRo (Gast) >Oder kann es sein das der uC zu langsam ist um beides Gleichzeitig zu >rechnen und sich dann die Interrupts blockieren. Glaub ich weniger. DMX ist zwar recht flott, aber der AVR ist das auch. > eine 16 mHz Quarz habe >ich momentan nicht zur Verfügung zum Testen. Brauchst du erstmal nicht. >Aber ich glaube das es ein Softwareproblem ist. Ich finde nur momentan >keins. Ich sehe mehrere. Zum einen sind eine Deklaratione und Definitionen der
1 | volatile uint8_t DmxField[50]; //array of DMX vals |
2 | volatile uint8_t DmxRxField[30]; //array of DMX vals (raw) |
in den zwei headerfiles NICHT OK. Das muss heissen
1 | extern volatile uint8_t DmxField[50]; //array of DMX vals |
2 | extern volatile uint8_t DmxRxField[30]; //array of DMX vals (raw) |
Damit werden die Arrays DEKLARIERT, sprich, der Typ vereinbahrt. In die jeweiligen Dateien *.c muss dann die DEFINITION von ganz oben, wo die Arrays wirklich im Speicher angelegt werden. Denn so wie du es jetzt hast, werden MEHRERE Araays vom gleich Namen angelegt. Da sollte der Compiler Warnings erzeugen. F_OSC in mehreren Headerfiles neu definieren ist sehr schlecht. Sowas gehört EINMAL in main.h oder so. Bei AVR GCC heisst das ausserdem F_CPU und wird in Hz angegeben. Das sollte man nicht neu erfinden sondern so nutzen. MFG Falk
So also ich habe jetzt die beiden DMX In Out Datein zu einer Zusammengefügt. Die Variablen nach deiner Meinung Deklariert und Definiert (Ich hoffe ich habe dich dabei richtig Verstanden. Aber es Funktioniert immernoch nicht. Das mit F_CPU und F_OSC ist auch geändert. Die baud wird jetzt auch richtig Berechnet aber leider immernoch das selbe Problem. Sobald ich vom PC aus DMX Sende und der uC das Empfängt, Sendet der uC nicht mehr. Ich hoffe du findest noch mehr Fehler denn man lernt ja nie aus. Will auch mal bei Zeit ein Oszi dranhängen, ob er vill sendet nur die Timings nicht mehr stimmen. Gruß
Bist du sicher das deine Sotware überhaupt DMX sendet? Was mir noch nicht klar ist, wie du die Übertragung anstößt (was machst du das mindestens Einmal ein USART_TXC_vect Interrupt ausgelöst wird). Ebenso kann ich nicht glauben das das so überhaupt funktionieren kann, wenn du um DMX zu senden die Baudrate änderst. Wie soll mit der geänderten Baudrate ein DMX-Empfang funktionieren?
@ PcHeRo (Gast)
>Ich hoffe du findest noch mehr Fehler denn man lernt ja nie aus.
Ohhh, das mit dem Umstellen des Baudratenregisters fürs Senden im TX
Interrupt ist nicht was du willst! Damit änderst du auch die Baudrate
für den Empfänger!!! Den Break kann man auch anders erzeugen, einfach
den Pin auf LOW setzen.
Ausserdem ist ein Delay von 10 Mikrosekunden in der ISR schon sehr
grenzwertig. Ein Byte dauert gerade mal 44 Mikrosekunden, das sind
gerade mal 352 CPU Takte. Damit wird mehr als 20% CPU-Leistung sinnlos
verbraten.
MfG
Falk
also ich habe jetzt nochmal ein bisschen nachgeschaut in der Datei und auf dem Display bisschen Debug gemacht. Sobald der uC in die RXC ISR geht, funktioniert die TXC nicht mehr. der ISR wird nicht ausgelöst. Ich habe dann mal weil ja am Anfang auch der USART mit UDR=0; gestartet wird mal in die RXC gesetzt. Da meint mein DMX Gerät es Empfängt was und die Daten ändern sich die ganze Zeit. Außerdem geht er laut Debug weiterhin in die ISR vom TXC. Also musst die ISR vom RXC irgendwas Blockieren das die TXC nicht mehr ausgelöst wird? oder verstehe ich da was Falsch. In dem Tutorial von euch über UART bzw USART finde ich aber nichts, was ich vergessen haben könnte zum Thema ISR. MfG
PcHeRo schrieb: > die Daten ändern sich die ganze Zeit. Außerdem geht er laut Debug > weiterhin in die ISR vom TXC. Also musst die ISR vom RXC irgendwas > Blockieren das die TXC nicht mehr ausgelöst wird? oder verstehe ich da > was Falsch. Hier ist er: UCSRA &= ~(1<<FE); //reset flag (necessary for simulation in AVR Studio) Damit löscht du dir das TXC Flag im UCSRA und damit ist dann kein Interrupt mehr 'pending'.
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.