Hallo
ich verwende in meinem Prg einen Countdownzähler von 5 auf 0. Bisher
verwende ich delay. Bin aber dabei alle Prg auf Timer umzustellen.
1
charzahlstart[40];// Def Variable
2
inti;// Zählvariable
3
for(i=5;i>0;i--)// Zählschleife
4
{
5
sprintf(zahlstart," %d",i);// Bildung Wert
6
gfx_move(zeitm+72,zeitn-1);// Angabe Ort
7
gfx_set_proportional(0);// Angabe Schrift
8
gfx_print_text(zahlstart);// Ausgabe Variable
9
delay(1000);// Pause 1 s
Das funktioniert sehr gut. Habe den Code durch das folgende ersetzt:
1
charzahlstart[40];// Def Variable
2
3
if(wait10_merker==1)
4
{
5
verzoegerung++;
6
if(verzoegerung==100)
7
{
8
verzoegerung=0;
9
vzzeit--;
10
11
sprintf(zahlstart," %d",vzzeit);// Bildung Wert
12
gfx_move(zeitm+72,zeitn-1);// Angabe Ort
13
gfx_set_proportional(0);// Angabe Schrift
14
gfx_print_text(zahlstart);// Ausgabe Variable
15
}}
Damit fängt das Problem an. Die neue Zeit wird durch sprintf nicht
dargestellt. An der Verzögerung kann es eigentlich nicht liegen, da ich
sie auch an anderen Stellen verwende. Das ganze Prg hat nur eine
Schleife und wird durch einen Timer mit 10ms gesteuert. vzzeit habe ich
vorhjer auf 5 gesetzt und will es auf null runterzählen. Danach soll das
Prg in eine anderee Schleife springen. Arbeite mit 16M und Atmega 128
Achim Seeger schrieb:> if (wait10_merker==1)> {> verzoegerung++;> if (verzoegerung==100)> {> verzoegerung=0;> vzzeit--;>> sprintf(zahlstart, " %d", vzzeit); // Bildung Wert> gfx_move(zeitm+72, zeitn-1); // Angabe Ort> gfx_set_proportional(0); // Angabe Schrift> gfx_print_text(zahlstart); // Ausgabe Variable> }}> [/c]> Damit fängt das Problem an. Die neue Zeit wird durch sprintf nicht> dargestellt. An der Verzögerung kann es eigentlich nicht liegen, da ich> sie auch an anderen Stellen verwende. Das ganze Prg hat nur eine> Schleife und wird durch einen Timer mit 10ms gesteuert.
Beschreibe nicht das was du glaubst programmiert zu haben, sondern poste
den Code.
Heinweis: Einrückungen können manchmal den Unterschied zwischen "Ich seh
selbst den Fehler" und "Ich brauch jemanden anderes, der zuerst mal den
Code korrekt einrückt und dann den Fehler sieht" ausmachen.
Grundsätzlich:
- die Interrupt-Routinen so kurz wie möglich halten. Das heißt hier:
Mach in deinem Timer nichts anderes, als "verzoegerung" hochzuzählen. In
deiner while(1)-Schleife in main() kannst du dann Abfrage auf 100 und
Displayausgabe machen.
- leg sowas die Display-Buffer als globale Variable ab. Wenn du an
verschiedenen Stellen Ausgaben machst, brauchst du nicht jedes mal das
knappe RAM dafür reservieren.
- gewöhn dir unbedingt vernünftige Einrückung an. Vereinfacht die
Lesbarkeit und damit die Fehlersuche.
Dein Code würde dann so aussehen:
1
charzahlstart[40];// Def Variable
2
3
if(wait10_merker==1)
4
{
5
verzoegerung++;
6
if(verzoegerung==100)
7
{
8
verzoegerung=0;
9
vzzeit--;
10
11
sprintf(zahlstart," %d",vzzeit);// Bildung Wert
12
gfx_move(zeitm+72,zeitn-1);// Angabe Ort
13
gfx_set_proportional(0);// Angabe Schrift
14
gfx_print_text(zahlstart);// Ausgabe Variable
15
}
16
}
Wird dein Interrupt überhaupt ausgeführt? Lass doch einfach mal eine LED
darin blinken.
Und Ist das hier auch sicher erfüllt? if (wait10_merker==1)
Der Rest vom Code und v.a. die Initialisierung des Timers und die
Umgebung der hier beschriebenen Funktion sind interessant.
Hallo Miachael
Der Interrupt wird ausgeführt. Am Ende des Prg habe ich eine LED drin,
die mit 400ms blinkt. Dadurch sehe ich immer ob die Zeit korrekt ist. In
andeen Prg kontrolliere ich damit den ganzen Timer und die Interrupt.
Ein grossteil des Codes ist bereits im Netz. Steht unter Taster
entprellen drin. Das mir dem wait10 geht korrekt. Habe die
Tasterentprellung von PD auch drin und es läuft ohne jede Probleme. Kann
jeden Taster auswerten, egal ob kurz oder lang. Leider macht mir das
Anpassen von älteren Codes probleme. Ist nicht so einfach. Da stück
oeben geht mit delay. Für den Timer verwende ich kein delay mehr. In den
anderen Codes habe ich die verzögrung drin. Stammt von KH. Geht noch um
die Anpassung an den Countdownzähler und die Ausgabe der Werte.
achim