Forum: Mikrocontroller und Digitale Elektronik Atmel Studio 6 Fehler


von Michael (Gast)


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

von Kim Jong Dumm (Gast)


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).

von Michael (Gast)


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

von fauler (Gast)


Lesenswert?

Wenn ich Compiler wäre würde ich auch belangloses wegoptimieren :-)

von Peter II (Gast)


Lesenswert?

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.

von Gerhard G. (g_g)


Lesenswert?

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ß

von Peter R. (pnu)


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.

von Michael (Gast)


Angehängte Dateien:

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.

von Gerhard G. (g_g)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.