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
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
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 |
:
Bearbeitet durch User
Dominik R. schrieb: > Keine Ahnung, ob das mit > Arduino geht, aber wenn auf deinem Board ein Atmega ist, kannst du das > so machen: > uint8_t datapins = PINB; //kompletter Port B eingelesen Natürlich geht das mit Arduino genau so.
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,
Ich meinte, ob es einen Arduino-Befehl (sowas wie digitalRead) gibt, um einen kompletten Port einzulesen.
Dominik R. schrieb: > Ich meinte, ob es einen Arduino-Befehl (sowas wie digitalRead) > gibt, um > einen kompletten Port einzulesen. Wurde dir schon gezeigt: uint8_t data = PINB; //kompletter Port B eingelesen Übersehen?
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 | } |
Danke für den Input! Ich versuche mal etwas zu programmieren und melde mich dann wieder. Ich bin gerade dabei diverse Seiten durchzuarbeiten damit da was passendes dabei raus kommt. Grüße
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.