Mit WinAVR möchte ich in einem Feld verschiedene Portpins definieren, um diese auslesen zu können. So stelle ich mir das vor: char port_tab[4][MAX_USED_PORTS] = { { DS1820_PORT_DDR, DS1820_PORT_OUT, DS1820_PORT_IN, PA4 }, { DS1820_PORT_DDR, DS1820_PORT_OUT, DS1820_PORT_IN, PA5 }, { DS1820_PORT_DDR, DS1820_PORT_OUT, DS1820_PORT_IN, PA6 }, { DS1820_PORT_DDR, DS1820_PORT_OUT, DS1820_PORT_IN, PA7 }, }; Natürlich geht das nicht so einfach, da die Portbezeichnungen irgendwie Adressen sind. Wie könnte ich das dennoch sinnvollerweise einsetzen und im weiteren Programmverlauf weiterverwenden? DANKE!
Salve, soweit ich weiß adressiert der GCC die I/O-Ports über Memory Mapping (theoretisch jedenfalls - praktisch werden aus Optimierungsgründen meist direkte Portzugriffe draus gemacht). So gesehen werden die Portkonstanten wie "PORTA" doch nur dereferenzierte Pointer sein. In der Doku zur avr-libc wird dieses Thema auch behandelt. Schau am besten dort nochmal rein. Also meine Idee wäre sowas: char* ports[] = { &PORTA, &PORTB, &PORTC }; char porta = *ports[0]; Viel Erfolg, Mark
Ich habe noch mal in den Headerfiles geschaut. Außerhalb der eigentlichen Funktion kann ich wohl nicht auf die PORTs zugreifen, da dort beim Aufruf immer ein Makro ausgeführt wird. Allerdings ist das schade, dass eben die Adressen nicht direkt definiert sind, sondern gleich mit Makro. Deshalb ist das weniger portabel und könnte so aussehen:: // DDRA, PORTA, PINA uint8_t ds1820_tab[4][DS1820_MAX_PORTS] = { { 0x1A, 0x1B, 0x19, PA4 }, { 0x1A, 0x1B, 0x19, PA5 }, { 0x1A, 0x1B, 0x19, PA6 }, { 0x1A, 0x1B, 0x19, PA7 } }; Damit kann ich dann das entsprechende Bit setzen,l was in dem Tab vereinbart ist. _SFR_IO8(ds1820_tab[0][1]) |= ds1820_tab[0][3]; Wenn es eine besser Lösung gibt, immer her damit:
Damit verbunden würde mich schon interessieren, wie ich dann auch PORTS usw. an Funktionen übergeben kann? Hat sowas schon einmal jemand gemacht?
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.