Forum: Mikrocontroller und Digitale Elektronik ATmega88 UART disable


von Mark U. (residuum)


Lesenswert?

Hallo,

die UART-Pins sollen als reguläre Outputs genutzt werden. Deshalb wird 
der UART abgeschaltet und der Output aktiviert (Pins D0 und D1):
1
  UCSR0A = 0;
2
  UCSR0B = 0;
3
  UCSR0C = 0;
4
  bitSet(PRR, PRUSART0);
5
  PORTD &= ~(0x03);
6
  DDRD  |=  (0x03);

Wenn dann die beiden Pins auf low gesetzt werden, bewegt sich nur der 
RX-Pin, TX bleibt dauerhaft auf high:
1
  bitClear(PORTD, 0);
2
  bitClear(PORTD, 1);

TX wurde bereits auf Kurzschlüsse zu benachbarten Signalen geprüft.
Die Makros bitSet() und bitClear() funktionieren mit dem RX-Pin ohne 
Auffälligkeiten.

Wie kann ich den TX-Pin als Output nutzen? Was übersehe ich hier?

Danke.
-Markus

von Karl M. (Gast)


Lesenswert?

Hallo Markus,

aktiviere einfach den UART TX, RX nicht !

von Mark U. (residuum)


Lesenswert?

Dann klappt's.
Aber ein paar Zeichen sollen ja zunächst ausgegeben werden...

von holger (Gast)


Lesenswert?

>Dann klappt's.
>Aber ein paar Zeichen sollen ja zunächst ausgegeben werden...

Ja, und? Wenn du   UCSR0B = 0; machst ist der USART aus.
Die Vermutung liegt nahe das dein gezeigter Code nicht
der verwendete Code ist.

von holger (Gast)


Lesenswert?

>Ja, und? Wenn du   UCSR0B = 0; machst ist der USART aus.
>Die Vermutung liegt nahe das dein gezeigter Code nicht
>der verwendete Code ist.

Hmmm, wenn man das da unten liest sollte man wohl warten
bis das letzte Byte auch raus ist;)

The disabling of the Transmitter (writing TXENn to
zero) will not become effective until ongoing and pending transmissions 
are completed, that is,
when the Transmit Shift Register and Transmit Buffer Register do not 
contain data to be transmitted.

von Mark U. (residuum)


Lesenswert?

Habe das Problem gefunden: Mit
1
bitSet(PRR, PRUSART0);
wird der UART schon zuvor abgeschaltet, die Register lassen sich dann 
nicht mehr ändern.
Wenn dieses erste Abschalten auskommentiert wird, funktioniert der Code 
wie erwartet.

von Peter D. (peda)


Lesenswert?

Markus E. schrieb:
> Habe das Problem gefunden: MitbitSet(PRR, PRUSART0);

Wenn Du der UART den Takt klaust, kann sie das Senden nicht mehr 
beenden.

von Mark U. (residuum)


Lesenswert?

Das ist klar, deshalb wurden im angegebenen Code-Ausschnitt auch zuerst 
die Register gelöscht, dann der UART abgeschaltet.
Was ich übersehen hatte war, dass der UART bereits an einer anderen 
Stelle weiter oben abgeschaltet wurde mit dem Ergebnis, dass das 
Schreiben der UART-Register keine Wirkungs mehr zeigte.

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.