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


von bratze (Gast)


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.

von SeppK (Gast)


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?

von bratze (Gast)


Lesenswert?

Hi,

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

von Falk B. (falk)


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

von bratze (Gast)


Angehängte Dateien:

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 =)

von Johannes M. (johnny-m)


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.

von bratze (Gast)


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?

von Johannes M. (johnny-m)


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.

von bratze (Gast)


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?

von Thorsten (Gast)


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.

von Thorsten (Gast)


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.

von Thorsten (Gast)


Lesenswert?

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

von bratze (Gast)


Lesenswert?

Wahh, da wär ich nie draufgekommen! Danke, funktioniert!

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.