Senderenschalten vor der Sendung per Uart

Gast #5489069
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
Gast #5489082
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).
Gast #5489150
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
#5489153
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.
Gast #5489219
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.
Gast #5489243
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
Gast #5489247
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
Gast #5489779
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
Gast #5490086
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren