Wie ich statt serialRead/serialWrite direkt auf die Ports zugreifen kann, weiß ich. Nur mit einem weiß ich nicht weiter. Die Portnummern für den Zugriff via serialRead/serialWrite hatte ich in Variablen gespeichert. Das geht beim Direktzugriff wohl nicht, weil *Portname und Bit* gespeichert werden muss. Oder hat jemand eine Idee, auf welche Weise die Info kompakt gespeichert werden kann?
Warum sollte man etwas speichern? Ich lege per Define einen Name für das Pin eines Ports fest und greife dann darauf zu! Quelle: Peter Dannegger
1 | struct bits { |
2 | u8 b0:1; |
3 | u8 b1:1; |
4 | u8 b2:1; |
5 | u8 b3:1; |
6 | u8 b4:1; |
7 | u8 b5:1; |
8 | u8 b6:1; |
9 | u8 b7:1; |
10 | } __attribute__((__packed__)); |
11 | |
12 | #define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)
|
1 | #define LED_PIN SBIT(portb,0)
|
2 | #define LED_DDR SBIT(ddrb,0)
|
3 | |
4 | LED_DDR = 1; // output |
5 | LED_PIN = 1; // on |
6 | LED_PIN = 0; // off |
Danke aber das hilft mir nicht weiter. Vielleicht habe ich das Problem nicht gut beschrieben. Ist es möglich, einen Port dynamisch zu adressieren? Also wenn der Pin (Port und Bit) erst zur Laufzeit feststehen?
Natürlich geht das, wenn man mal in das Datenblatt oder wenigstens in die Header-Dateien schauen würde. Denn auch hinter einem PORT Makro steht letzlich nur eine Zahl.
Nuggi schrieb: > Ist es möglich, einen Port dynamisch zu > adressieren? Also wenn der Pin (Port und Bit) erst zur Laufzeit > feststehen? digitalWrite() kann das. Also sollte deine deine zukünftige Funktion das auch sollen können. (wenn du das kannst)
A ja. Bit+Port sind const PROGMEM Strukturen. Das hätte ich auch selbst hingekriegt, danke.
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.