Hallo zusammen, ich habe heute versucht, ein kleines Testprogramm für einen Mikrocontroller zu schreiben (erstmal nur Software, noch keine Hardware). Leider bin ich an der Software gescheitert. Es sollte erstmal ein total einfaches Programm für einen Test werden: #include <avr/io.h> int main(void) { DDRB = 0xFF; while(1) { PORTB = 0xFF; } } Aber das ganze will nicht funktionieren... Grund ist denke ich eine Definition. In io.h ist DDRB mit: #define DDRB _SFR_IO8(0x17) definiert, im IO View des Atmel Studios steht es aber auf Adresse 0x37 (ATmega8). Selbes gilt für PORTB, der ist auch im IO View anstatt auf 0x18 auf 0x38. Das ganze wird zwar kompiliert aber nichts tut sich im IO View. Beim Debuggen geht er nichtmal über die erste Zeile und ein Watch auf DDRB gibt aus: DDRB Unknown identifier Error (Verwendete Version 6.0.1996 - Service Pack 2) Das ganze ist unabhängig davon, welchen µP ich nehme. Wie kann ich dieses Problem beheben? (tritt auch in AVR 5 auf) Mit freundlichen Grüßen Michael
Ich hatte das auch mal, der Ursprung liegt glaube ich darin, daß die Adresse zB. für DDRB physikalisch um 0x20(?) gegenüber dem was der Compiler verwendet verschoben ist. Wenn man die echte Adresse anspricht, zB. mittels Assembler, geht's. Ich vermute das liegt an einer Compiler/Linker-Einstellung (bin da aber kein Experte drin).
Der Assembler Code sieht soweit eigentlich auch in Ordnung aus... DDRB = 0xFF; 0000002F SER R24 Set Register 00000030 OUT 0x37,R24 Out to I/O location PORTB = 0xFF; 00000031 OUT 0x38,R24 Out to I/O location 00000032 RJMP PC-0x0001 Relative jump
fauler schrieb: > Wenn ich Compiler wäre würde ich auch belangloses wegoptimieren :-) dann bist du aber ein fehlerhafter compiler man sollte dich nicht benutzen.
Hallo, int main(void) { DDRB = 0xFF; while(1) { PORTB |= (1<< 1); PORTB |= (1<< 2); PORTB &= ~(1 << 1); PORTB &= ~(1 << 2); PORTB |= (1<< 3); PORTB = 0xAA; } } bei mir funktioniert es! Gruß
Zusammen mit dem out-Befehl hat ddrb die Adresse 0x17. Als normaler Speicherplatze angesprochen ist ddrb aber um einen offset von 0x20 (die Zahl der Register r0 bis r31)versetzt. Im Datenblatt ist deshalb in der Auflistung ddrb unter 0x17 und auch(0x37)zu finden, ebenso wie fast alle anderen io-Register. DDRB ist dem Kompiler natürlich bekannt, aber eben unter der IO-Adresse 0x17.deshalb meckert er auch. mit STM oder LPM wäre das DDRB unter der Adresse 0x37 erreichbar.
G. G. schrieb: > while(1) > { ... > } > } Dass das funktioniert, ist mir klar^^ Den Schleifeninhalt zu Ändern, hilft aber nicht, wenn man nichtmal in die Schleife kommt ;) Mein Code sollte auch funktionieren, steht ja auch so in X-Tutorials. Die Frage ist warum er: DDRB = 0xFF; einfach nicht machen will :( Wenn das gelöst ist, würde mit dem selben Ansatz das Problem mit der Zuweisung von PORTB genauso funtkonieren.
Hallo, Michael schrieb: > Die Frage ist warum er: DDRB = 0xFF; einfach nicht machen will ich wollte dir nur zu verstehen geben, dass das bei mir funktioniert. Gruß G.G.
Bester Fehler der Welt... Heute debuggt er, als wäre nichts gewesen ;( Trotzdem vielen Dank für die Tipps
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.