Hallo zusammen! Ich würde gerne virtuelle Ports erzeugen. Das heißt, die Bits einer Variable entsprechen den Pinzuständen unterschiedlicher Ports. Ich möchte z.B. die Pins PB1, PB2, PB3, PB5 von PORTB und die Pins PC0, PC2, PC6, PC7 von PORTC zu einem neuen virtuellen PORT_1 zusammenfassen. Die Bits in PORT_1 entsprechen also den Bits aus den PORT-Registern. Geht sowas? Wahrscheinlich nur ein bisschen Trickserei mit Pointern. Aber wie? Würd mich freuen, wenn mir da jemand weiterhelfen könnte. Viele Grüße see4far
Hab mal gerade etwas im Forum rumgesucht. Hab ich mit unions eine Chance? mfg see4far
Evtl kannst du sowas machen: #define MYPORT ((PINB & 0x01)<<8 | (PINB & 0x04)<<7 | ....) uint8_t bla; bla = MYPORT;
ok... das wäre eine statische Lösung. Ideal wäre zwar eine dynamische, aber es lässt sich erstmal damit leben. Ist der Ansatz mit der union erfolgsversprechend oder eher nicht? Soweit hab ich es mir schon überlegt:
1 | union PIN { |
2 | unsigned char *Byte; |
3 | struct { |
4 | unsigned char *P0:1; |
5 | unsigned char *P1:1; |
6 | unsigned char *P2:1; |
7 | unsigned char *P3:1; |
8 | unsigned char *P4:1; |
9 | unsigned char *P5:1; |
10 | unsigned char *P6:1; |
11 | unsigned char *P7:1; |
12 | } Bits; |
13 | };
|
14 | |
15 | union PIN PIN1; |
Aber ich wüsste jetzt nicht, wie ich die Bits mit Pointer darein kriege. Gibt's da einen Ansatz?
Hi ich wüßte nicht wie du sowas realiseren könntest. Der Compiler müßte ja wissen wie er den einen Zugriff auf die Variable in diverse Hardwarezugriffe zerlegt. Das Beste wird sein wenn du dir zwei Funktionen schreibst die den "verteilten" Zugriff abstrahieren. Matthias
In C geht das definitiv nicht. In Ada sollte das Problem prinzipiell lösbar sein (die Möglichkeiten zur Deklaration und bitgenauen Adressierung lassen C uralt aussehen), allerdings handelt sich man damit vermutlich eine Menge Overhead ein.
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.