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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.