Forum: Mikrocontroller und Digitale Elektronik Atmege Hardware UART und I/O


von Kurt (Gast)


Lesenswert?

Hi
Ich muß an einem ATmega den UART benutzen aber auch den TX-Pin 
"händisch" beeinflussen. Beides getrennt funktioniert.
Aber sobald ich den UART initialisiere, werden Änderungen am Pin-Level 
nicht mehr umgesetzt. Im Datenblatt finde ich nur eine Aussage dazu, daß 
der Tx-Pin als Ausgang agiert, egal wie das Richtungsregister gesetzt 
wird - das ist ja auch OK - aber nichts weiter sonst. Gibt's da 'nen 
Trick?

Bitte keine Antworten wie "nutze nen extra Pin" oder mit externer 
Hardware. Per Software UART klappt alles wie gewünscht aber es wäre 
schöner die Hardware zu nutzen.

von c-hater (Gast)


Lesenswert?

Kurt schrieb:

> Ich muß an einem ATmega den UART benutzen aber auch den TX-Pin
> "händisch" beeinflussen. Beides getrennt funktioniert.
> Aber sobald ich den UART initialisiere, werden Änderungen am Pin-Level
> nicht mehr umgesetzt. Im Datenblatt finde ich nur eine Aussage dazu, daß
> der Tx-Pin als Ausgang agiert, egal wie das Richtungsregister gesetzt
> wird - das ist ja auch OK - aber nichts weiter sonst. Gibt's da 'nen
> Trick?

Na klar: wenn man händisch am Pin rumpfuschen will, muss man halt TXEN 
der USART löschen. Andere Tricks gibt's nicht.

von Frank K. (fchk)


Lesenswert?

Kurt schrieb:

> Gibt's da 'nen
> Trick?

Nein, es gibt keinen Trick. Wenn Du den UART benutzt, kontrolliert 
ausschließlich der den Pin. Ist so, kannst Du nicht ändern.

Was ist Dein eigentliches Problem? Break senden bei LIN? Reizung eines 
K/L Line Interfaces? Das bekommt man auch mit geänderter Bitrate hin.

fchk

von S. Landolt (Gast)


Lesenswert?

Kann ich mir nicht vorstellen, und das Datenblatt, z.B. vom ATmega1284, 
scheint mir Recht zu geben:
'When the Transmitter is enabled, the normal port operation of the TxDn 
pin is overridden by the USART'

von Jasson J. (jasson)


Lesenswert?

>Ich muß an einem ATmega den UART benutzen aber auch den TX-Pin
>"händisch" beeinflussen

Das einzige, was mir einfällt ist, den TX über einen... z.B. 1k Ohm 
gehen lassen und NACH dem Widerstand einen anderen Pin anschließen, 
dessen Data Direction Bit du entweder auf Input schaltest (dann 
beeinflusst der PIN nicht, pay attention dem internen PullUp) oder das 
Direction Bit auf Output und dann kannst du den Pegel vom TX Pin 
überschreiben.

Ansonsten geht es wie c-hater schrieb, zum händischen am Pin spielen, 
müsstest du TXEN löschen.

>> So, was 'hast' du denn vor? :)
Wird das was, um ein Frame Error zu erzeugen?

von S. Landolt (Gast)


Lesenswert?

> 1k Ohm gehen lassen und NACH dem Widerstand einen anderen Pin

?

> Bitte keine Antworten wie "nutze nen extra Pin" oder mit
> externer Hardware.

von Jasson J. (jasson)


Lesenswert?

^^ ist mir auch gerade aufgefallen - mit Anlauf rein

von S. Landolt (Gast)


Lesenswert?

Übrigens ist es nicht einmal möglich, eine laufende Übertragung 
abzubrechen (so man das denn wollte): 'The disabling of the Transmitter 
(writing TXENn to zero) will not become effective until ongoing and 
pending transmissions are completed', dies Problem hatten wir hier mal 
vor einiger Zeit.

von Oliver S. (oliverso)


Lesenswert?

Kurt schrieb:
> Ich muß an einem ATmega den UART benutzen aber auch den TX-Pin
> "händisch" beeinflussen. Beides getrennt funktioniert.

Wie immer lautet die entscheidende Frage: Warum? Warum musst du die 
Hardware-USART benutzen, und warum musst du dazu noch am TX-Pin 
rumspielen?

Sinnvoll klingt das alles nicht, aber egal. Mit einem 
Software-USART-Transmitter kannst du mit den Pins machen, was du willst.

Oliver

von Roland E. (roland0815)


Lesenswert?

Per ODER mit einem weiteren Portpin verknüpfen. Oder das Gefrickel mit 
dem 1k Widerstand.

von c-hater (Gast)


Lesenswert?

S. Landolt schrieb:

> Übrigens ist es nicht einmal möglich, eine laufende Übertragung
> abzubrechen (so man das denn wollte): 'The disabling of the Transmitter
> (writing TXENn to zero) will not become effective until ongoing and
> pending transmissions are completed', dies Problem hatten wir hier mal
> vor einiger Zeit.

Naja, regulär geht das wirklich nicht, aber man könnte hier durchaus 
tricksen. Die Vorgänge in der Statemachine der USART laufen mit der 
eingestellten Bitrate ab (eigentlich natürlich: mit dem 8- oder 
16-fachen davon). Und die Bitrate kann man jederzeit ändern und diese 
Änderung wird auch sofort wirksam. Das eröffnet Möglichkeiten für 
schmutzige Tricks. Wenn der Takt hoch genug bzw. die reguläre Bitrate 
gering genug ist. Dann setzt man einfach den Bitratenteiler auf den 
geringsten möglichen Wert und der Rest der ausstehenden Operationen der 
Statemachine schnurrt auf einen kurzen Burst zusammen, den der Peer 
ignoriert, weil das unterhalb seiner Wahrnehmungsschwelle liegt.

Blöd ist allerdings: das betrifft dann auch RX. Für bidirektionale 
Verbindungen also sowieso unbrauchbar. Aber auch für unidirektionale 
eher nicht empfehlenswert. Wenn, dann lieber gleich Soft-UART.

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.