Hallo, wie fasse ich in AVR-GCC alle Eingänge die auf verscheiden Ports (PORTA, PORTB, PORTC) liegen in eine variable die uint16_t lang ist. Ich habe insgesamt 11 Eingänge die wegen dem Layout auf den drei Ports verteilt sind. Ich will einfach beim Programm an einem bestimmten Punkt, alle Eingänge auf einmal einlesen und in uint16_t variable so verteilen, das der jeweilige Eingang einem Bit in uint16_t variable zugerodnet ist. Gruss micha
http://www.mikrocontroller.net/articles/Netiquette#Klare_Beschreibung_des_Problems Vielleicht beschreibst Du zuerst, wozu die Konstruktion gut sein soll und nicht Deinen Lösungsansatz.
micha schrieb: > Ich will einfach beim Programm an einem bestimmten Punkt, alle Eingänge > auf einmal einlesen und in uint16_t variable so verteilen, das der > jeweilige Eingang einem Bit in uint16_t variable zugerodnet ist. Das geht schon mal nicht, da man immer nur 8 Bit "anfassen" kann. Über einen großeren Zeitraum betrachtet ist das möglich.
Hallo. Auf 1x im Sinne von EINEM Befehl geht das nicht. Aber lese doch in einer Funktion alle Ports nacheinander ein. VerUNDe alle benötigen Bits mit 1, damit die nicht benötigen Bits auf 0 sind. Und dann kannst Du mit einer Kombination aus SHIFT und ODER deine Bits in eine UINT16_t rein bringen. Vielleicht am Ende nochmal überzählige Bits löschen und dann hast Du deinen Wert. Teilweise kannst Du noch optimieren, wenn Du die Reihenfolge änderst. Aber das hängt von deinen tatsächlichen Eingängen ab.
@ micha (Gast) >Ich will einfach beim Programm an einem bestimmten Punkt, alle Eingänge >auf einmal einlesen und in uint16_t variable so verteilen, das der >jeweilige Eingang einem Bit in uint16_t variable zugerodnet ist. EXAKT auf einmal geht nicht, aber nahe zu.
1 | uint16_t get_ports(void) { |
2 | uint16_t tmp; |
3 | uint8_t p0, p1, p2; |
4 | |
5 | // das ist nahezu gleichzeitig
|
6 | p0= PINC; |
7 | p1= PIND; |
8 | p2= PINF; |
9 | |
10 | // Bits zuordnen
|
11 | |
12 | if (p0 & (1<<3)) tmp |= 0x01; |
13 | if (p1 & (1<<5)) tmp |= 0x02; |
14 | if (p2 & (1<<7)) tmp |= 0x04; |
15 | |
16 | etc. |
17 | |
18 | return tmp; |
19 | }
|
:
Bearbeitet durch User
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.