ATMega 128 Auf Ports über Pointer zugreifen

#4438432
Lesenswert?

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...
#4438516
Lesenswert?

Ich konnte das Problem jetzt schonmal teilweise lösen.
Und zwar wenn ich in dem else Zweig die Zeile:
pDDR[port] = 0xff;
in
*pDDR[port] = 0xff;
ändere funktionierts, ich finde es nur komisch, dass es nie jemand in 
dem anderen Thread bemängelt hat, oder funktionierte es 2007 noch ohne, 
dass man den Pointer dereferenziert?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren