Forum: Mikrocontroller und Digitale Elektronik Senderenschalten vor der Sendung per Uart


von Paul J. (Gast)


Lesenswert?

Hallo Forum,

ich habe hier schon sehr viel gelesen und es hat mir auch weiter 
geholfen, dafür schon mal Danke. Doch jetzt zu meiner Frage. Ich habe es 
geschaft auf einen Atmega328p per Uart zu senden und zu empfangen und 
das mit den Interrupts und Ringpuffer. Doch ich würde gerne haben, dass 
der Sender vor dem Senden automatisch eingeschaltet und ausgeschaltet 
nach den Senden, mit einem 3ten Portpin. Wie geht den das?


Zur zeit mache ich noch:
1
PORTC |= (1 << PC4);
2
delay_ms (1);
3
sendecode(werte);
4
delay_ms(1);
5
PORTC &= ~(1 << PC4);

Gruß

Paul

von RX TX GND (Gast)


Lesenswert?

Paul J. schrieb:
> dass der Sender vor dem Senden automatisch eingeschaltet und
> ausgeschaltet nach den Senden, mit einem 3ten Portpin

Was für ein Sender? RS485? Funk?

SingleWire Uart (K-Line) lässt sich mit Diodenlogik oder 2 
Transistoren(einer Inverterstufe, einer Open-Collector) als Wired-And 
nebst Pullup realisieren.
Nicht umsonst ist seit Emile Baudot der UART-Ruhepegel High.

Paul J. schrieb:
> das mit den Interrupts und Ringpuffer.

Wenn die Applikation was in den Senderingpuffer rein wirft, wird der 
Sender aktiviert und der ganze Kram wird Interrupt-getrieben raus 
getickert. Der letzte Sendeinterrupt (UART 
Sendeschieberegister-leer-Interrupt) macht dem Sender aus, nachdem das 
letzte Byte draußen ist (= bei leerem Senderingpuffer).

von spess53 (Gast)


Lesenswert?

Hi

>Doch ich würde gerne haben, dass
>der Sender vor dem Senden automatisch eingeschaltet und ausgeschaltet
>nach den Senden, mit einem 3ten Portpin. Wie geht den das?

Die USART signalisiert mit dem Setzen von TXCn in OCSRnA, das die 
Übertragung (UDR und TX-Puffer leer) abgeschlossen ist. Das kannst du 
abfragen oder den TXC-Interrupt auslösen und dann dein Gerät abschalten. 
Ohne Interrupt muss das Flag allerdings manuell zurückgesetzt werden.

MfG Spess

von Peter D. (peda)


Lesenswert?

Paul J. schrieb:
> Zur zeit mache ich noch:
> PORTC |= (1 << PC4);
> delay_ms (1);
> sendecode(werte);
> delay_ms(1);
> PORTC &= ~(1 << PC4);

Wenn es funktionert, warum nicht.
Wir kennen Deinen Sender nicht, wissen also nicht, welche Vorlauf- und 
Nachlaufzeit er benötigt.
sendecode() muß man natürlich so schreiben, daß es erst nach dem letzten 
Stopbit terminiert.

von Wolfgang (Gast)


Lesenswert?

RX TX GND schrieb:
> Der letzte Sendeinterrupt (UART
> Sendeschieberegister-leer-Interrupt) macht dem Sender aus, nachdem das
> letzte Byte draußen ist (= bei leerem Senderingpuffer).

Wenn der Senderingpuffer leer ist, heißt das noch lange nicht, dass das 
letzte Bit bereits gesendet wurde. Der UART puffert auch noch.

von spess53 (Gast)


Lesenswert?

Hi

>Wenn der Senderingpuffer leer ist, heißt das noch lange nicht, dass das
>letzte Bit bereits gesendet wurde. Der UART puffert auch noch.

Dafür gibt es ja das TXC-Flag, das erst gesetzt wird wenn alle 
UART-Internen Puffer leer sind und das letzte Bit gesendet ist.

MfG spess

von georg (Gast)


Lesenswert?

Peter D. schrieb:
> sendecode() muß man natürlich so schreiben, daß es erst nach dem letzten
> Stopbit terminiert.

Das kann man auch in die Ausschaltverzögerung einrechnen. Ist nicht die 
lupenreine Theorie, funktioniert aber. Man muss ja nicht auf die ms 
präzise abschalten, es geht ja wohl um den Stromverbrauch.

Georg

von Peter D. (peda)


Lesenswert?

georg schrieb:
> Das kann man auch in die Ausschaltverzögerung einrechnen.

Ist aber umständlich bei variabler Paketlänge.

von Paul J. (Gast)


Lesenswert?

spess53 schrieb:
> Dafür gibt es ja das TXC-Flag, das erst gesetzt wird wenn alle
> UART-Internen Puffer leer sind und das letzte Bit gesendet ist.

das würde mich interessieren wie man das in der Senderoutine macht..

Funk, es ist eine modifiziert Packet Radio anlage, die Messdaten 
empfangt und Einstellungen sendet.


Gruß

Paul

von spess53 (Gast)


Lesenswert?

Hi

>das würde mich interessieren wie man das in der Senderoutine macht.

Das hat mit der eigentlichen Senderoutine nichts zu.

Du schreibst eine Interruptroutine für den Tx-Complete Interrupt die 
beim Interrupt den Sender über einen Pin ausschaltet und gibst bei der 
USART-Initialisierung den Interrupt frei.

Vor dem Start der USART-Übertragung schaltest du den Sender über dieses 
Pin ein.

von Michael B. (laberkopp)


Lesenswert?

Paul J. schrieb:
> Wie geht den das?

Gar nicht,
Warum auch ?
Der uC ist programmierbar.

Paul J. schrieb:
> Zur zeit mache ich noch:

Vernünftig und geht.

Reicht jedenfalls zum freischalten eines RS485 Transmitters.

von Olaf (Gast)


Lesenswert?

> nach den Senden, mit einem 3ten Portpin. Wie geht den das?

Bessere Mikrocontroller unterstützen das per Hardware. Bei den meisten 
musst du das in der Software aber von Hand machen.

Olaf

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.