If wird nicht ausgeführt

Gast #1492180
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
}
#1492185
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!
Gast #1492189
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
#1492220
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.
Gast #1492327
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
Angehängte Dateien:
Persönliche Seite #1492419
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.
#1492477
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren