Problem mit Variablen auf einem Mega324

Gast #4984745
Hallo,

ich habe bei mir das Problem, dass wenn ich eine Variable außerhalb der 
main deklariere, er die While-Schleife nicht verlässt:
[ ATMega324PA | avr-gcc | Atmel Studio 7 ]

Dieser Code funktioniert:
1
int main(void)
2
{
3
  bool Zeit_eingestellt    = false;  // Variable innerhalb der main deklariert.
4

5
  do // Belichtungszeit einstellen
6
  {
7
    _delay_ms(50);
8

9
    // Inkrementalgeber auslesen:
10
    Belichtungszeit += (uint16_t)Drehgeber_lesen();
11

12
    if (Belichtungszeit > 999)
13
    {
14
      Belichtungszeit = 999;
15
    }
16
    if (Belichtungszeit < 1)
17
    {
18
      Belichtungszeit = 1;
19
    }
20

21
    Anzeige.Anzeigen(Belichtungszeit);
22
    I01 = Belichtungszeit;
23
    
24
    if (!Taster_entprellt && flanke1)
25
    {
26
      Zeit_eingestellt = true;
27
      UART_senden((int32_t)Zeit_eingestellt, true);
28
    }
29

30
    flanke1 = Taster_entprellt;
31
  } while (!Zeit_eingestellt);
32
}


Dieser Code funktioniert hingegen NICHT:
1
bool Zeit_eingestellt    = false;  // Variable außerhalb der main deklariert.
2

3
int main(void)
4
{
5
  Zeit_eingestellt    = false;  // hier nochmal auf false gesetzt.
6

7
  do // Belichtungszeit einstellen
8
  {
9
    _delay_ms(50);
10

11
    // Inkrementalgeber auslesen:
12
    Belichtungszeit += (uint16_t)Drehgeber_lesen();
13

14
    if (Belichtungszeit > 999)
15
    {
16
      Belichtungszeit = 999;
17
    }
18
    if (Belichtungszeit < 1)
19
    {
20
      Belichtungszeit = 1;
21
    }
22

23
    Anzeige.Anzeigen(Belichtungszeit);
24
    I01 = Belichtungszeit;
25
    
26
    if (!Taster_entprellt && flanke1)
27
    {
28
      Zeit_eingestellt = true;
29
      UART_senden((int32_t)Zeit_eingestellt, true);
30
    }
31

32
    flanke1 = Taster_entprellt;
33
  } while (!Zeit_eingestellt);
34
}


Weiß jemand, woran das liegen kann? Was mache ich hier falsch?

LG
Tim
Gast #4984753
Was soll dieser Unsinn?

int main(void)
{
  do // Belichtungszeit einstellen
  {
  } while (!Zeit_eingestellt);
}

Was glaubst du was nach main() passiert wenn die Bedingung nicht
erfüllt ist? Nichts passiert dann mehr.
Gast #4984757
Kleiner Nachtrag:

Da ich die Info, ob die Belichtungszeit nun gesetzt wurde, außerhalb in 
einer Funktion brauche, habe ich einfach eine zweite Variable angelegt, 
mit Unterstrich davor und beschreibe diese ebenfalls, wenn der Taster 
losgelassen wird. Auch hier wird die While-Schleife nicht verlassen.

Warum??

1
bool _Zeit_eingestellt = false;  zweite Variable, siehe unten
2

3
int main(void)
4
{
5
  bool Zeit_eingestellt    = false;  // Variable innerhalb der main deklariert.
6

7
  do // Belichtungszeit einstellen
8
  {
9
    _delay_ms(50);
10

11
    // Inkrementalgeber auslesen:
12
    Belichtungszeit += (uint16_t)Drehgeber_lesen();
13

14
    if (Belichtungszeit > 999)
15
    {
16
      Belichtungszeit = 999;
17
    }
18
    if (Belichtungszeit < 1)
19
    {
20
      Belichtungszeit = 1;
21
    }
22

23
    Anzeige.Anzeigen(Belichtungszeit);
24
    I01 = Belichtungszeit;
25
    
26
    if (!Taster_entprellt && flanke1)
27
    {
28
      Zeit_eingestellt = true;
29
      _Zeit_eingestellt = true;  // Wenn ich das hier einfüge, verlässt er die While-Schleife ebenfalls nicht.
30
      // Die "UART_Senden"-Funktion war nur zum debuggen
31
    }
32

33
    flanke1 = Taster_entprellt;
34
  } while (!Zeit_eingestellt);
35
}
Gast #4984760
holger schrieb:
> Was soll dieser Unsinn?
>
> int main(void)
> {
>   do // Belichtungszeit einstellen
>   {
>   } while (!Zeit_eingestellt);
> }
>
> Was glaubst du was nach main() passiert wenn die Bedingung nicht
> erfüllt ist? Nichts passiert dann mehr.

Es ist eine Art Schrittkette, mit mehreren While-Schleifen 
hintereinander.
Er bleibt definitiv in der ersten Schleife hängen, wenn ich am Drehgeber 
drehe, kann ich den Wert ändern. Wenn er sie überspringen würde, würde 
er ja in die nächste Anweisung gehen, das würde ich auf dem Display 
sehen.
Moderator #4984964
Wie stellst du fest, dass Zeit_eingestellt tatsächlich auf true gesetzt
wird? In deinem Eröffnungsbeitrag hast du dafür vermutlich den
UART_senden-Aufruf genutzt. Im Beispiel von 00:45 fehlt dieser Aufruf
aber.

Prinzipiell sollte es keinen Unterschied machen, ob die Variable lokal
oder global definiert ist. Wenn doch, wird die Variable vermutlich auf
Grund eines Fehlers an anderer Stelle des Programms überschrieben.
Gast #4985119
Ich habe den Fehler beseitigt.

Als erstes habe ich die Flanke als volatile bool global deklariert.
Dann hat er sich immer aufgehängt, wenn ich den Taster losgelassen hab.

Ich hab nen Timer mit CTC alle 1ms laufen. Darin zähle ich bis 500 und 
immer wenn die 500 erreicht sind (also alle 500ms) schaue ich auf 
_Zeit_eingestellt und sende Infos bei Änderung auf den UART. Wenn ich 
das senden auskommentiere, hängt er sich nicht auf, also bleibt er in 
der UART_senden-Funktion (nur bei Änderung von "_Zeit_eingestellt" 
aufgerufen in der ISR) hängen, oder beendet diese nicht rechtzeitig.

Ich habe diese Funktion nun in die If-Abrage, welche die While-Schleife 
beendet reingepackt und es geht, ist vermutlich auch sauberer so.

Danke für die guten Anregungen und Tipps. :)

Schönes WE
Tim

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.