Forum: Mikrocontroller und Digitale Elektronik If wird nicht ausgeführt


von Michael (Gast)


Lesenswert?

Hallo zusammen

Ich steh irgendwie auf dem Schlauch. Meine If Schleife wird nicht 
ausgeführt. Habe mit dem Debugger Schritt für Schritt angeschaut. Auch 
wenn Bedingung Seconds == 1 zutreffend ist wird der Schleifeninhalt 
nicht ausgeführt. Damit mir die Timer nicht in die Quere kommen habe ich 
noch die Interrupte wärend der Prüfung deaktiviert.

Hat jemand eine Ahnung an was das liegt?
1
int main( void )
2
{
3
4
Timer0_Init();
5
Timer1_Init();
6
Timer2_Init(&pwm_ch0,&pwm_ch1,&pwm_ch2,&pwm_ch3,&pwm_ch4,&pwm_ch5,&pwm_ch6,&pwm_ch7);
7
8
9
sei(); //Interrupte einschalten
10
11
   while(0==0)
12
    {
13
  cli(); //Interrupte aus
14
  
15
  if(Seconds == 1 )
16
  {
17
  pwm_ch7 += 25;
18
  }
19
  
20
  sei(); //Interrupte einschalten
21
  }
22
23
}

von Thomas K. (muetze1)


Lesenswert?

1. es gibt keine If-Schleifen (www.if-schleife.de)
2. Du musst dem Compiler mitteilen, dass sich deine Seconds Variable 
ausserhalb der main() ändern kann. Deshalb füge "volatile" zu der 
Variablendeklaration hinzu.

Hintergrund: Der Compiler erkennt das sich die Variable in der Main() 
nicht ändert und somit die Bedingung niemals erfüllt sein kann. Von 
daher optimiert er sie raus.

Und lern bloss das richtige Einrücken - sonst siehst du nachher selber 
nicht mehr durch!

von Michael (Gast)


Lesenswert?

Hallo Thomas

Das habe ich, in der Timerdeklaration ist
1
volatile unsigned char Seconds = 0;
deklariert.

Bezüglich einrücken hast du recht, es war mal richtig eingerückt bis ich 
den Fehler zu suchen begonnen habe :-(

Gruss Michael

von (prx) A. K. (prx)


Lesenswert?

Wieso kommt eigentlich mittlerweile mindestens wöchentlich jemand mit 
einer "if-Schleife" an? Ist das ansteckend?

von Timmo H. (masterfx)


Lesenswert?

>while(0==0)
das habe ich ja auch noch nicht gesehen für eine while(1)-Schleife :-)

Zum Problem:
Wird denn der Code auf dem µC richtig ausgeführt? Denn auf den Simulator 
kann man sich nicht 100%ig verlassen wie ich auch mehrfach schon 
feststellen musste.

von Christopher G. (cbg)


Lesenswert?

Poste mal den gesamten Code und nicht nur irgendeinen Ausschnitt.
Wenn du mehrere Module hast und Seconds in deinem Timermodul deklariert 
ist, dann musst du die Variable noch im Hauptmodul bekanntmachen. 
Stichwort "extern".

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Hier der der Code zusätzlich mit Timer0

Gruss Michael

von Christopher G. (cbg)


Lesenswert?

Und das kompiliert ohne Meckern? Du deklarierst 2 mal Seconds. Einmal in 
timer0.h und einmal in timer0.c.
Ausserdem bindest du in timer0.c die main.h ein.
Lies dir mal durch wie man Module sinnvol erstellt und wie man mit 
Headerfiles umgehen sollte (d.h. was drinnen stehen soll und wo man 
sie inkludiert). "Include guard" ist mal ein Stichwort.

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Christopher

Ja der kompilert ohne zu meckern :-(

Nun läuft die ganze Sache auch wie gewünscht.
habe nun die .h am Anfang des Hauptprogramms mit include eingebunden
und gegen doppeltes einbinden geschützt.

Was ich jetzt nicht begreife wiso muss ich die .c Dateien nicht mit 
include einbinden? Ist die über die Prototypen schon eingebunden?

Wiso kann ich mit --> der Dekleration
"extern volatile unsigned char Seconds"
in der Datei timer0.c die Variable nicht global verfügbar machen?

Danke und Gruss Michael

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Michael schrieb:
> Wiso kann ich mit --> der Dekleration
> "extern volatile unsigned char Seconds"
> in der Datei timer0.c die Variable nicht global verfügbar machen?

"extern" bedeutet, dass die Variable in einem anderen Objektmodul 
vorhanden ist und im Objektfile von timer0.c nur ein Platzhalter 
eingesetzt wird. Mit "extern" stellt man nichts zur Verfügung.

von Christopher G. (cbg)


Lesenswert?

Headerdateien (*.h) enthalten Funktionsprototypen und 
Variablendeklarationen. In ihnen darf kein Code stehen (Ausnahme 
Konstantendefinitionen). In den .c Dateien steht dann der Code. Alle 
benötigten Funktionsprototypen fur das aktuelle Modul und für die 
verwendeten Module inkludiert man über die .h Dateien.
Jedes Modul kann dann einzeln zu einer Object-Datei kompiliert werden. 
Das macht man mit dem Kompiler (z.B. avr-gcc -c).
Am Schluss verbindet man alle benötigten Module zum eigentlichen 
Programm. Das geschieht mit dem Linker (z.B. avr-gcc).

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.