- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 5 von 5

Thema: Stack initialisierung mit GCC?

  1. #1
    Benutzer Stammmitglied Avatar von Tob
    Registriert seit
    11.01.2005
    Beiträge
    58

    Stack initialisierung mit GCC?

    Anzeige

    Powerstation Test
    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.

    MfG Tob

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das Stack initialisieren machen die Compiler automatisch, auch GCC.

  3. #3
    Benutzer Stammmitglied Avatar von Tob
    Registriert seit
    11.01.2005
    Beiträge
    58

    Problem mit ADC

    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.

    Code:
    #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

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  5. #5
    Benutzer Stammmitglied Avatar von Tob
    Registriert seit
    11.01.2005
    Beiträge
    58
    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 \/

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad