Forum: Compiler & IDEs ATMega 128 Auf Ports über Pointer zugreifen


von Peter M. (killbill)


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...

von Tom K. (ez81)


Lesenswert?

1
volatile uint8_t* pDDR[] = ......
2
pDDR[port] = 0xff;
Tip: Welchen Datentyp haben die Arrayelemente? Welchen Datentyp hat 
demzufolge DDR[port]?

von Peter M. (killbill)


Lesenswert?

Beide uint8 oder eben auch unsigned char.

von Codix (Gast)


Lesenswert?


von Peter M. (killbill)


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?

von Codix (Gast)


Lesenswert?

Peter M. schrieb:
> dem anderen Thread bemängelt hat,

Beitrag "Re: [AVR] Pins über Array ansteuern"

Wurde bemängelt....gaaanz unten steht es.

von Peter M. (killbill)


Lesenswert?

ah klar jetzt seh ichs auch...
Danke vielmals für die Hilfe!

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
Noch kein Account? Hier anmelden.