Forum: Mikrocontroller und Digitale Elektronik TXC Problem


von Flite (Gast)


Lesenswert?

Hallo zusammen!

Ich verwende für ein RS485 Netzwerk den halbduplexen Treiber MAX485.

Um ihn senden zu lassen, muss ich die Enalbe Leitung ja auf high
ziehen. Anschließend muss sie wieder auf low abfallen, damit er wieder
empfangen kann.

Ich arbeite mit Codevision - ATMega 8.

Setze ich mit sofort nach putchar die Leitung auf low, so ist das zu
früh (klar - die Daten sind noch im Sende buffer - nicht komplett
gesendet).

Dazu müsste ich dann das TXC Bit auswerten, also warten, bis TXC = 1
ist.

Hier mein Programmschnippsel:
putchar(outp);
while ((UCSRA << 1) < 128)
{}
PORTD.4 = 0;  // Auf Empfangen umschalten!

Nach einem Reset des Controllers funktioniert dies auch - allerdings
nur einmal. Danach durchläuft der Mega8 die Schleife sofort (ohne zu
warten) und setzt natürlich die Enable leitung zu früh auf low.
D.H. theoretisch muss TXC auf 1 sein - aber warum?

Wo liegt mein Denkfehler?

Grüße
Flite

von leo9 (Gast)


Lesenswert?

Standard-Antwort: Datenblatt lesen
das TXC (genauso wie RXC) wird durch schreiben ins Datenregister nicht
rückgesetzt, d.h. du mußt nach der while Schleife das TXC löschen
(durch schreiben einer Eins).

grüsse leo9

von Flite (Gast)


Lesenswert?

Sowas in die Richtung hab ich mir schon gedacht - leider bin ich aus dem
Datenblatt nicht ganz schlau geworden.

Wie kann ich ein einzelnes Bit setzen?

Muss ich das RXC bit auch auf 1 setzen, sobald 1 geworden ist?

Tut mir leid - mein Englisch ist nicht das Beste ...

Grüße Flite

von Flite (Gast)


Lesenswert?

Ok, wie ich das TXC Bit auf eins setze hab ich rausgefunden ... Das
funktioniert jetzt.

Aus dem RXC Bit werd ich noch nicht so schlau ...

Ich frage ab, ob es = 1 ist -> dann hole ich mich mit getchar das Byte,
das empfangen wurde.

Muss ich das jetzt irgendwie wieder zurücksetzen oder geht das so?

Flite

von leo9 (Gast)


Lesenswert?

wenn du das RXC-Bit pollst, mußt du es auch "händisch" löschen (wieder
durch Schreiben einer Eins). Wenn du mit Interrupts arbeitest glaub ich
zu 98% dass der "Int-Aufruf" bereits das bit löscht.

grüsse leo9

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.