Forum: Compiler & IDEs Von UART ungenutze PIN's des PORT


von Kai E. (ice6man)


Lesenswert?

Hallo,

ich habe die Suchefunktion genutzt aber nicht gefunden, was mich bewegt:

Ich habe ein wenig Port-Engpass in meinem Projekt und wollte fragen, ob 
man den Port, über den UART abgewickelt wird, die frien PIN's für andere 
Aufgaben nutzen kann.

Wenn ja, wie wird das DDR gesetzt?

Vielen Dank!

Kai

von Dennis (Gast)


Lesenswert?

Meine Glaskugel sagt, dass du ein AVR benutzt...

Dann ja, UART-Pins sind auch nur ganz normale Pinbs, die als GPIO 
genutzt werden können.

Thema DDR setzen: na ja, so wie es deine Anwendung erfordert (hast es ja 
nicht verraten, was da darauf soll)

Üblicherweise macht man es aber ganz anders:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister

Oder aber sowas hier:

http://www.mikrocontroller.net/articles/Port-Expander_PCF8574

Ich persönlich nehme auch gerne mal einen kleinen uC als "intelligenten 
Portexpander" und steuere ihn über UART oder SPI...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Kai E. schrieb:
> Ich habe ein wenig Port-Engpass in meinem Projekt und wollte fragen, ob
> man den Port, über den UART abgewickelt wird, die frien PIN's für andere
> Aufgaben nutzen kann.

Ja, natürlich kann man das.

> Wenn ja, wie wird das DDR gesetzt?

Du setzt diejenigen Bits, die Du als Ausgänge benutzen willst, Du 
löschst diejenigen Bits, die Du als Eingänge benutzen willst.

Ach, Du willst die DDR-Bits nicht einzeln setzen bzw. löschen, sondern 
mit einem Befehl das ganze DDR-Register beschreiben? So etwas geht auch, 
da - wenn UART aktiviert - die dafür zuständigen DDR-Registerbits 
ignoriert werden.

Unschön ist es trotzdem. Setze und Lösche besser die Bits einzeln im 
DDR-Register, die Du auch brauchst.

: Bearbeitet durch Moderator
von Eduard S. (schneehase)


Lesenswert?

Hier ein kleines Bespiel.
1
// RX ist an bit 0
2
// TX ist an bit 1
3
// AA, BB, CC sind bits 2,3,4 und alles Eingänge
4
// UU, VV, WW sind bits 5,6,7 und alles Ausgänge
5
// Die Werte sind schon in der Libc definiert
6
// Du kannst Sie aber umdefinieren damit dein Code einfacher lesbar wird
7
#define AA PB2
8
#define BB PB2
9
// usw
10
11
// DDR setzen hier PORTB bzw DDRB. Geht mit allen PORTs so
12
DDRB = (1<<UU)|(1<<VV)|(1<<WW)|(0<<CC)|(0<<BB)|(0<<AA)|(1<<TX)|(0<<RX)
13
14
// Einzelne Ausgänge setzen auf HIGH schalten
15
PORTB |= (1<<UU)|(1<<VV)
16
17
// auf LOW schalten
18
PORTB &= (1<<WW)|(1<<VV)
19
20
// Einzelnen Eingang lesen
21
VariablefuerAA = PINB & ( (1<<AA) )
22
23
// Mehrere Eingänge auf einmal lesen
24
VariablefuerBBCC = PINB &( (1<<BB)|(1<<CC)
25
26
// Testen ob ein Eingang low oder high ist
27
VariablefuerAA = PINB & ( (1<<AA) )
28
if( VariablefuerAA == 0 ) // Testet auf low, egal an welchem bit AA ist
29
{...}

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

Falls es ein AVR ist: Null Problem.

Dir fehlen dann halt nur Bit 0 und Bit 1.

Die Richtungsbits, Pull-Up u. s. w. werden wie gehabt angesprochen.

Keine Ahnung, aber möglicherweise, spiegeln sich der aktuelle RxD- und 
TxD-Zustand im Bitmuster beim Lesen. Einfach ignorieren.

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.