www.mikrocontroller.net

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


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
int main( void )
{

Timer0_Init();
Timer1_Init();
Timer2_Init(&pwm_ch0,&pwm_ch1,&pwm_ch2,&pwm_ch3,&pwm_ch4,&pwm_ch5,&pwm_ch6,&pwm_ch7);


sei(); //Interrupte einschalten

   while(0==0)
    {
  cli(); //Interrupte aus
  
  if(Seconds == 1 )
  {
  pwm_ch7 += 25;
  }
  
  sei(); //Interrupte einschalten
  }

}

Autor: Thomas K. (muetze1)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas

Das habe ich, in der Timerdeklaration ist
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

Autor: A. K. (prx)
Datum:

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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier der der Code zusätzlich mit Timer0

Gruss Michael

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht 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

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.