struct und pointer

Gast #263944
Lesenswert?
• ▲
▼
Hallo zusammen,

habe wieder mal ein schwieriges Problem, ein Wissender schüttelt
darüber  wahrscheinlich den Kopf ...

Ich möchte ein struct über den Addressbereich von Port B eines ATmega
32 legen und habe mir dazu folgendes zusammengebastelt:

#include "Time.h"

 struct Io{
  volatile char port;
  volatile char ddr;
  volatile char pin;
 };

int main()
{
  Io *PortB = (Io*)(0x16);
  PortB->ddr = 16+32+64+128;    // upper bits output: LEDs

  init_wait();

  while (true)
  {
    PortB->port = 0;
  time_s(1);
  PortB->port = 16+32+64+128;
  time_s(1);
  }
}

Kompiliert wird alles, nur die probeweise angeschlossene LED bleibt
aus. (Die time_s() hat an anderer Stelle schon ihre Funktionsfähigkeit
bewiesen.)

Ideen?
Vielen Dank
Gast #263945
Lesenswert?
• ▲
▼
Schau mal die Aufteilung des Dataspce an. Wenn Du auf die Register als
memory zugreifst, dann ist die Adresse von PORTB nit 16hex, sondern
36hex.
Die unteren 32 Bytes sind die Memory-Space-Adresse der CPU-Register
0-31.

Viele Grüße, Stefan
Gast #263947
Lesenswert?
• ▲
▼
Vom Prinzip her stimmt das, was Du getan hast. Praktisch bedeutet das:

Port->port liegt auf 0x16
Port->ddr  liegt auf 0x17
Port->pin  liegt auf 0x18

Das stimmt aber nicht mit den definitionen für den Chip überein (Auszug
aus (iom32.h, GCC)
/* Port B */
#define PINB    _SFR_IO8(0x16)
#define DDRB    _SFR_IO8(0x17)
#define PORTB   _SFR_IO8(0x18)

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