mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik if Bedingung wird nicht wahr, warum?


Autor: bratze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

folgende If Abfrage wird bei mir nicht wahr:

  if( (time == 2) && (c_std == c_max) ) { blub }

Syntax sollte wohl stimmen hoffe ich, wenn time gleich 2 und c_std 
gleich c_max ist wird's wahr.

c_std und c_max werden am Anfang (vor main) durch

typedef unsigned int uint_t;
uint_t c_max = 30;
volatile uint_t c_std;

initialisiert.

Die If Abfrage steht in nem Interrupt:

ISR(TimerX...) {

   c_std++;
   if(...von oben...) { blub }

.....


Durch nen Taster wird nun in der main time = 2; gesetzt. Das Programm 
verhält sich dann so, als ob die If Abfrage nicht wahr wird.

Wenn ich allerdings time gleich am Anfang mit 2 initialisiere 
funktionierts. Muss wohl an dem time = 2; vom Taster hängen?

Für jede Hilfe dankbar.

Autor: SeppK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn ich allerdings time gleich am Anfang mit 2 initialisiere
>funktionierts. Muss wohl an dem time = 2; vom Taster hängen?

Kann es sein, dass der Taster prellt?

Autor: bratze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

pullups sind aktiviert...der Tastendruckt wird ja registriert. Nur dann 
komm ich nimmer mit... ;)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  bratze (Gast)

>typedef unsigned int uint_t;

Das ist recht sinnlos, es gibt ordentliche Definitionen in stdint.h. Die 
sollte man nutzen.

>Für jede Hilfe dankbar.

Poste kompletten Quelltext als Anhang.

MfG
Falk

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

Bewertung
0 lesenswert
nicht lesenswert
So Quelltext im Anhang. Erklärung dazu:

Taster0 schaltet das ganze ein
Taster1 aus
Taster2-4 legt das Programm fest
Taster5-7 legt die Geschwindigkeit des Programmes fest

Und hier noch die Warnings vom Compiler:

../Lauflicht.c: In function '__vector_7':
../Lauflicht.c:148: warning: implicit declaration of function 'execute'
../Lauflicht.c: At top level:
../Lauflicht.c:168: warning: conflicting types for 'execute'
../Lauflicht.c:148: warning: previous implicit declaration of 'execute' 
was here

Ist mein erstes C Programm, einfach so zur Übung probiert. Also immer 
raus mit den Verbesserungsvorschlägen =)

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

Bewertung
0 lesenswert
nicht lesenswert
Eine Funktion muss bekannt sein, bevor sie erstmalig aufgerufen wird! 
execute() wird aber erst nach dem Aufruf deklariert, weshalb der 
Compiler die Funktion da noch nicht kennt und denkt, du willst sie 
definieren. Bei der eigentlichen Definition weiter unten kommt er dann 
völlig ins Schleudern, weil die Funktion ja schon definiert ist.

Entweder schreibst Du die Definition von execute() weiter oben hin oder 
Du deklarierst einen Prototypen am Anfang.

Autor: bratze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok hab ich geändert, die Warnings verschwinden. Jetzt ist nurnoch die 
Frage:

wenn Programm0 gestartet ist (wird es standardmäßig)
ich dann auf den Taster für Programm1 klicke bleibt er genau da stehen 
wo die LED grade an ist, heißt so viel keine der Bedingungen wird wahr?!

Wo is da der Hund drinn?

Und wie soll ich uint_t aus der stdint.h deklarieren?

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

Bewertung
0 lesenswert
nicht lesenswert
>     if( (status == 0) & (PINA == TASTER0) )
Nimm da lieber ein logisches UND statt dem bitweisen. In diesem Falle 
sollte es zwar auch so funktionieren, aber mit nem '&&' ist besser 
ersichtlich, was da passiert.

> Und wie soll ich uint_t aus der stdint.h deklarieren?
Indem Du die stdint.h einbindest und Deine ganzen 'uint_t' durch 
'uint16_t' ersetzt...

Die ganze Abfrage funktioniert natürlich nur dann, wenn jeweils nur eine 
Taste gedrückt wird, aber das ist Dir hoffentlich eh klar.

Autor: bratze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo ist klar, hab ich geändert, das passt jetzt soweit ohne Warnings.

Jetzt ist nurnoch die Frage zu klären mit dem "time"

Ich starte das Ding (Taster0)
Starte Programm0 (Taster2)

So jetzt ist gleichzeitig Time = 0 standardmäßig gesetzt, also die 
höchste geschwindigkeit und das Ding geht gut ab.

Jetzt drück ich Taster6 für Time = 1 und das Lauflicht wird grade an der 
Stelle unterbrochen wo ich eben gedrückt hab und die einzelne LED 
leuchtet. Heißt doch so viel wie, dass keine der If Abfragen in dem 
Interrupt wahr wird?

Wenn ich jetzt allerdings wieder Taster5 drücke für Time = 0 dann gehts 
wieder ab.

Wenn man sich nun die 2 If Abfragen anschaut von Time0 und Time1 
unterscheiden die sich durch die Counter Abfrage. Also irgendwas wird 
hier nicht richtig gemacht?

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich tippe mal deine Variablen counter_std und counter_05sec laufen über, 
denn du initialisierst sie nicht mit 0.

Ich hab mir bei solchen Vergleichsbedingungen mit == außerdem angewöhnt 
auf >= zu testen, da ist man meist auf der sicheren Seite. Soll heißen 
ich würde eher  folgendes machen:

if((time == 2) && (counter_std >= counter_max_sec))

Das ist denke ich aber Ansichtssache wie man das macht, viel wichtiger 
erscheint mir die Sache mit dem Initialisieren der beiden Variablen.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs mir nochmal angeschaut. Dein Fehler liegt woanders. Wenn dein 
Programm mit time = 0 läuft, dann wird dein PORTB bei jedem Aufruf der 
ISR neu beschrieben. Die beiden Variablen counter_std und counter_05sec 
werden 30,5 Mal in der Sekunde erhöht und laufen von 0 bis 2^16 zyklisch 
durch.

Jetzt schaltest du um auf time = 1. Dein PORTB wird jetzt nur neu 
beschrieben, wenn counter_05sec == 15 ist. Der Wert von counter_05sec 
kann aber irgendwo zwischen 0 und 2^16 liegen und wird in einer Sekunde 
um 30,5 erhöht. Da kannst du dir ja ausrechnen, wenn dein Wert für 
counter_05sec z.B. gerade über 15 liegt wie lange das dauert, bis er 
wieder 15 wird. Solange wird sich auch nichts ändern an deiner Anzeige 
und es sieht so aus als würde das Programm stehen.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfachste Lösung: teste einfach in deiner Abfrage auf >= anstatt auf 
==, dann sollte das funktionieren.

Autor: bratze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahh, da wär ich nie draufgekommen! Danke, funktioniert!

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.