Arduino Anfängerfrage 5 Inputs am Arduino gleichzeitig einlesen

OP #5283897
Lesenswert?

Hallo zusammen,

ich programmiere schon seit geraumer Zeit NXP ehemals Freescale 
Microcontroller in Assembler und will jetzt C lernen indem ich mit 
Arduino beginne. Eine Art sanfte Migration sozusagen ;-)

Aktuell habe ich ein Projekt ins Auge gefasst in dem ich die vier 
Dateneingänge eines HEF4511D inkl. Latch enable Leitung abgreifen will 
um diese dann z.B. auf ein Display als Text auszugeben.

Nur wie lese ich 5 Datenleitungen gleichzeitig in Arduino ein?

Hat jemand evtl. einen Codeschnipsel für mich und würde mir bitte 
helfen?

Grüße
Angehängte Dateien:
Gast #5283916
Lesenswert?

Ingo K. schrieb:
> Nur wie lese ich 5 Datenleitungen gleichzeitig in Arduino ein?

Die "Nummern" beim Arduino sind lediglich eine Durchnummerierung der 
einzelnen Portbits von Portregistern des ATMega328

Ein Port besteht immer auf 8 Bits... Und die können mit einer einzigen 
Leseoperation eingelesen werden, allerdings nicht mit digitalRead von 
der Arduino IDE

Schau mal hier rein: 
https://www.arduino.cc/en/Reference/PortManipulation

Da wird der Zusammenhang zwischen der Arduino Nummerierung in den 
tatsächlichen Portbezeichnungen des ATMega beschrieben
#5283919
Lesenswert?

Was meinst du mit gleichzeitig? Hängen alle Datenleitungen am gleichen 
Port und du willst den Zustand von allen Leitungen in selben Systemtakt 
wissen? Dann lies den kompletten Port aus. Keine Ahnung, ob das mit 
Arduino geht, aber wenn auf deinem Board ein Atmega ist, kannst du das 
so machen:
1
uint8_t datapins = PINB; //kompletter Port B eingelesen
OP #5283942
Lesenswert?

Ja, alle vier Datenleitungen hängen am gleichen Port. Diesen will ich 
dann auslesen wenn Latch enable gesetzt wird also per Interrupt.

Outputs gleichzeitig setzen geht ja mit der Bitmanipulation beim Arduino 
aber gleichzeitig lesen? In dem Punkt liegt das Problem.

Grüße,
#5283953
Lesenswert?

Wenn die Leitungen am selben Port hängen, hast du ja kein Problem.

Dominik R. schrieb:
> uint8_t datapins = PINB; //kompletter Port B eingelesen

Dann hast du das Abbild der Zustände des kompletten Ports in der 
Variable 'datapins' und kannst z.B. mit der For-Schleife jedes einzelne 
Bit prüfen:
1
for(int i = 0; i < 8; i++){
2
  if(PINB & (1 << i))
3
    //Pin high
4
  else
5
    //Pin low
6
}

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