mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik struct und pointer


Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok,

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

Vielen Dank
Sebastian

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.