Forum: Mikrocontroller und Digitale Elektronik Alle Eingänge in eine uint16_t variable schreiben


von micha (Gast)


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

von google (Gast)


Lesenswert?

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.

von Uwe (de0508)


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.

von Pepe (Gast)


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.

von Falk B. (falk)


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
}

: Bearbeitet durch User
von micha (Gast)


Lesenswert?

cool danke euch!

von Falk B. (falk)


Lesenswert?

Besser so

uint16_t tmp=0;

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.