Forum: Mikrocontroller und Digitale Elektronik Countdownzähler


von Achim S. (achims)


Lesenswert?

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
char zahlstart[40];      // Def Variable
2
int i;          // 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
char zahlstart[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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael H. (michael_h45)


Lesenswert?

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
char zahlstart[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.

von Achim S. (achims)


Lesenswert?

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

von Achim S. (achims)


Lesenswert?

Hallo
habe den ganzen Code vom Uprg drin
1
void nb_startzeit(uint8_t zeitm, uint8_t zeitn) // Start
2
  {                   
3
    gfx_set_proportional(1);      // ändert Breite auf schmall
4
    gfx_move(zeitm, zeitn-5);    // Gibt Startpunkt an waag min 0 max 30
5
    gfx_print_text("Start in");  // Ausgabe Text
6
    gfx_move(zeitm, zeitn+5);    // Angabe des Ortes
7
    gfx_print_text("Sekunden");  // Ausgabe Text
8
9
    gfx_move(zeitm+60,zeitn-10);  // Angabe Ort
10
    gfx_hline(42);                // Zeichnet Linie nach rechts + Länge  
11
    gfx_vline(25);
12
    gfx_move(zeitm+60,zeitn-10);  // Angabe Ort
13
    gfx_vline(25); 
14
    gfx_move(zeitm+60,zeitn+15);  // Angabe Ort
15
    gfx_hline(43);      // Zeichnet Linie nach rechts + Länge  
16
17
  char zahlstart[40];              // Def Variable
18
  int i;                           // Zählvariable
19
    for (i = 5; i > 0; i--)        // Zählschleife
20
     {
21
        sprintf(zahlstart, " %d", i);    // Bildung Wert
22
        gfx_move(zeitm+72, zeitn-1);    // Angabe Ort
23
        gfx_set_proportional(0);      // Angabe Schrift
24
        gfx_print_text(zahlstart);    // Ausgabe Variable
25
        delay(1000);        // Pause 1 s
26
   if(i == 5)  IO_LEDS_RED_PORT = 0xFC;  // LEDs 2,3,4,5,6,7 rot AN 
27
   if(i == 4)  IO_LEDS_RED_PORT = 0x78;  // LEDs 3,4,5,6 rot AN 
28
   if(i == 3)  IO_LEDS_RED_PORT = 0x30;  // LEDs 4,5 rot AN 
29
   if(i == 2)  {
30
        IO_LEDS_RED_PORT = 0x30;    // LEDs 4,5 rot AN    
31
        IO_LEDS_GREEN_PORT = 0x30;  // LEDs 4,5 gruen AN 
32
       }
33
   if(i == 1){
34
        IO_LEDS_RED_PORT = 0x00;    // LEDs 4,5 rot AUS
35
             }
36
    }
37
  {
38
       gfx_move(zeitm+68, zeitn-1);  // Anagbe Ort
39
       gfx_set_proportional(1);      // Angabe Schrift
40
       gfx_print_text("     ");      // Löschen
41
       gfx_move(zeitm+68, zeitn-1);  // Angabe Ort
42
       gfx_set_proportional(1);      // Angabe Schrift
43
       gfx_print_text("Aktion");     // Ausgabe Aktion
44
       IO_LEDS_GREEN_PORT = 0xff;    // LEDs alle gruen AN
45
  }                   
46
 }  // Ende Start
Habe auch die Ansteuerung der LED. Hier ist noch delay drin. Weiter oben 
im anderen Thread steht der Austausch mit der verzögerung drin.
achim

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.