Forum: Compiler & IDEs DMX(RS485) Empfangen blockiert senden


von PcHeRo (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Falk B. (falk)


Lesenswert?

@  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

von PcHeRo (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Marco (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@  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

von PcHeRo (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.