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.
>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?
@ 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
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 =)
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.
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?
> 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.
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?
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.
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.
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.