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
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...
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.