Alle Eingänge in eine uint16_t variable schreiben

Gast #4034849
Lesenswert?

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
#4034862
Lesenswert?

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.
Gast #4034877
Lesenswert?

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.
#4034896
Lesenswert?

@ 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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren