mikrocontroller.net

Forum: Compiler & IDEs Hauptprogramm warten lassen


Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich lasse in einem Timer Interrupt die Variable (uint16_t) zeit 
hochzählen. Das Hauptprogramm soll solange warten bis der Wert 750 
erreicht ist.

While (zeit<750);

Weder im Simulator, noch in der Hardware funktioniert das. Die 
While-Schleife wird nie verlassen, auch „zeit“ größer als 750 wird. Aber 
warum?

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls der Letzte Satz unverständlich war:

Die While-Schleife wird nie verlassen, auch wenn „zeit“ größer als 750 
wird. Aber warum?

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ohne glaskugel ganz schwer zu sagen. vll das volatile-procedere, vll 
auch nicht.

poste bitte ein "funktionierendes" und aussagekräftiges beispiel deines 
codes.
danke.

bye kosmo

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kosmonaut pirx wrote:
> hallo,
> ohne glaskugel ganz schwer zu sagen. vll das volatile-procedere, vll
> auch nicht.
Der Zusammenhang lässt erahnen, dass tatsächlich die Variable nicht 
volatile deklariert ist.

2:0 für volatile...

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den Fehler jetzt mit Hilfe des Disassembler gefunden:

87:            while (zeit<750) ;
+0000017C:   91800060    LDS     R24,0x0060       Load direct from data 
space
+0000017E:   91900061    LDS     R25,0x0061       Load direct from data 
space
+00000180:   E022        LDI     R18,0x02         Load immediate
+00000181:   3E8E        CPI     R24,0xEE         Compare with immediate
+00000182:   0792        CPC     R25,R18          Compare with carry
+00000183:   F3E0        BRCS    PC-0x03          Branch if carry set
+00000184:   E020        LDI     R18,0x00         Load immediate
+00000185:   E2E0        LDI     R30,0x20         Load immediate
+00000186:   E4FE        LDI     R31,0x4E         Load immediate

Das Problem ist, dass der Sprungbefehl nur 3 Befehle zurück reicht. Es 
müssten die Register R24 und R25 aber wieder neu aus dem Speicher 
geladen werden. Es müssten also die ersten zwei LDS Befehle auch wieder 
ausgeführt werden. Wie mache ich das dem Compiler klar? Er rechnet 
anscheinend nicht damit das ein Interrupt den Speicher ändern könnte.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nico wrote:
> Das Problem ist, dass der Sprungbefehl nur 3 Befehle zurück reicht. Es
> müssten die Register R24 und R25 aber wieder neu aus dem Speicher
> geladen werden. Es müssten also die ersten zwei LDS Befehle auch wieder
> ausgeführt werden. Wie mache ich das dem Compiler klar? Er rechnet
> anscheinend nicht damit das ein Interrupt den Speicher ändern könnte.
Wie oben schon angedeutet: Indem Du die Variable "zeit" volatile 
deklarierst. Dann weiß der Compiler auch, dass diese Variable sich 
außerhalb seines Einflussbereiches ändern kann.

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, Ich musste „Zeit“ einfach als volatine deklarieren.
So ist das leider beim Studium, dort lernt man das zwar mal alles, aber 
nur theoretisch. Erst wenn man praktisch solche Probleme hat weis man 
für was solche Befehle gut sind.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nico wrote:
> Vielen Dank, Ich musste „Zeit“ einfach als volatine deklarieren.
> So ist das leider beim Studium, dort lernt man das zwar mal alles, aber
> nur theoretisch. Erst wenn man praktisch solche Probleme hat weis man
> für was solche Befehle gut sind.
"volatile" ist kein Befehl, sondern ein Typqualifizierer. Allerdings 
frage ich mich, warum Du die beiden ersten Antworten anscheinend einfach 
ignoriert hast. Da stand doch schon alles...

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil ich nicht damit gerechnet habe so schnell eine Antwort zu bekommen 
und hatte desshalb eure antworten noch nicht gelesen.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nico wrote:
> Weil ich nicht damit gerechnet habe so schnell eine Antwort zu bekommen
> und hatte desshalb eure antworten noch nicht gelesen.
Mist, wir sind zu schnell...;-)

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder ich zu langsam ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.