Atmel Studio 6 Fehler

Gast #3120732
Lesenswert?

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
Gast #3120775
Lesenswert?

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).
Gast #3120807
Lesenswert?

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
#3120838
Lesenswert?

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.
Gast #3120883
Lesenswert?

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.
Angehängte Dateien:

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