Forum: Mikrocontroller und Digitale Elektronik struct und pointer


von Poseidonius (Gast)


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

von Stefan Kleinwort (Gast)


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

von Poseidonius (Gast)


Lesenswert?

ok,

und, nachdem ich dann noch die Reihenfolge in der struct-Definition
gedreht habe, blinkt mein kleines Mäusekino ...

Vielen Dank
Sebastian

von Ingo (Gast)


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)

von Patrick D. (oldbug) Benutzerseite


Lesenswert?


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.