ATMega 128 Auf Ports über Pointer zugreifen

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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.