PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stack initialisierung mit GCC?



Tob
20.06.2009, 08:33
Hi,

Ich hab mal ne kleine Frage zum GCC Compiler.

Und zwar muss man ja, wenn man den Atmega 32 mit Assembler programmiert
und mit Interrupts, Sprüngen etc. arbeiten möchte, den Stack initialisieren.

Muss man, wenn man den GCC Compiler für C verwendet,
auch den Stack initialisieren oder macht der Compiler das automatisch?

Ich hab schon verzweifelt auf der RN-Wissen Seite und mit der Suchfunkition im Forum gesucht aber nichts gefunden.

Wäre nett wenn ihr mir helfen könntet. :-k

MfG Tob

Besserwessi
20.06.2009, 09:25
Das Stack initialisieren machen die Compiler automatisch, auch GCC.

Tob
20.06.2009, 09:45
Danke für deine schnelle Antwort! =D>

Allerdings hab ich dann das Problem, dass ich nicht weis, warum mein Programm nicht funktioniert.

Eigentlich möchte ich mit dem Programm erreichen, dass die Spannung an PortA0 (also ADC0) gemessen wird
und der µC bei einer Spannung von >1V die LED an PORTD6 einschaltet.

Im AVR Studio funktioniert das auch, aber wenn ich das ganze mit dem echten µC teste
geht die LED nur bei >2,2V und nach einem Hardware Reset an.

Bin noch Anfänger, also erschlagt mich bitte nicht wenn ich großen Mist gebaut hab.



#include <avr/io.h>

int main(void)
{
int temp=0;

DDRD = 0xff; //PORTD als Ausgang

ADCSRA |= (1<<ADEN); //ADC Ein
ADCSRA |=(1<<ADPS1); //Teilungsfaktor auf 8(1Mhz CPU-Takt), externe Referenzspannung(5V), Kanal 0
ADCSRA |=(1<<ADPS0);

ADCSRA |= (1<<ADSC); //Dummyreadout
while (ADCSRA & (1<<ADSC));

while (1) //Spannung an Kannal 0 messen und bei >1V PortD6 auf 1 setzen
{
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));
temp = ADCL;

if (temp > 204)
{
PORTD |= (1<<PD6);
}
else
{
PORTD &= ~(1<<PD6);
}
}

return 0;
}

MfG Tob ](*,)

Besserwessi
20.06.2009, 13:56
Da gibt es ein paar Probleme:
1) Beim Register ADCSRA wird nie der ganze Wert gesetzt, sondern immer nur ein paar bits dazu. Ist vermulich nicht die Ursache für das Problem, kann aber noch Ärger machen.

2) Beim Auslesen wird nur ADCL ausgelesen. Das high Byte wird also ignoriert. Schlimmer ist noch, das damit nie neue Daten ausgelesen wird, den erst durch das auslesen des High Bytes werden neue Daten ünernommen.
Richtig wäre es ADCW zu benutzen, da hat man die ganzen 10 Bits. Sonst müßte man mit "left Adjust" arbeiten, und nur das high Byte auslesen.

3) Der Teiler wird auch 4, nicht 8 gestellt, ist aber an sich noch kein Problem.

4) Es wird eine externe Ref. genutzt. Leigt da denn überhaupt eine Spannung an. Normal wäre das eher nicht.

Tob
21.06.2009, 17:57
Danke für deine Antwort!

Es lag wie du gesagt hast daran, dass ich nur ADCL ausgelesen habe.

Nachdem ich jetzt beide Bytes mit ADCW auslese funktionierts.

Thx \:D/