Hallo zusammen,
ich würde gerne auf I/O Ports vom ATMega 128 mit Hilfe von Pointern
zugreifen, damit ich eben nicht mit switch/case if/else Abfragen erstmal
mühsam immer den aktuellen Port ermitteln muss.
Im folgenden mein Code dazu:
1 | void initPort(ePORT port, ePORTDIR dir)
|
2 | {
|
3 | volatile uint8_t* pDDR[] = {&DDRA,&DDRB,&DDRC,&DDRD,&DDRE,&DDRF};
|
4 | volatile uint8_t* pPorts[] = {&PORTA,&PORTB,&PORTC,&PORTD,&PORTE,&PORTF};
|
5 | pDDR[port] = 0xff;
|
6 | if(dir == 255)
|
7 | pPorts[port] = 0xff;
|
8 | }
|
Folgendes habe ich dann auch noch in der h-Datei
1 | #include <avr/io.h>
|
2 |
|
3 | typedef enum PORT{PIO_PORTA,PIO_PORTB,PIO_PORTC,PIO_PORTD,PIO_PORTE,PIO_PORTF,PIO_PORTG}ePORT;
|
4 | typedef enum PORTDIR{PIO_OUT=255,PIO_IN=0}ePORTDIR;
|
5 | #define DDR_Array[]
|
6 |
|
7 | void initPort(ePORT port, ePORTDIR dir);
|
Die Schreibweise volatile uint8_t ... habe ich aus einem älteren Thread
in dem Karl Heinz mal geantwortet hat.
Beitrag "[AVR] Pins über Array ansteuern"
Also mit der Funktion möchte ich Ports initialisieren, scheint soweit
auch zu funktionieren, allerdings zeigt mir der Compiler noch folgenden
Fehler an:
assignment makes pointer from integer without a cast
Kann mir da jemand weiterhelfen?
Achja als IDE benutze ich Eclipse und die AVR-GCC Toolchain
Edit: Ich habe in der Header Datei PIO_OUT=255,PIO_IN=0 in
PIO_OUT=0,PIO_IN=255 verändert. Macht ja mehr Sinn, wenn ich die
Pull-UPs setzen möchte
Edit2: Scheint doch überhaupt nicht zu funktionieren, also dem DDR
Register wird nicht der Wert 255 zugewiesen, oder mein Simulator will
mich mal wieder an der Nase herumführen...