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
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
ok, und, nachdem ich dann noch die Reihenfolge in der struct-Definition gedreht habe, blinkt mein kleines Mäusekino ... Vielen Dank Sebastian
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)
1. http://www.mikrocontroller.net/forum/read-1-203338.html#203494 2. http://www.mikrocontroller.net/forum/read-2-212460.html#213070
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.