mikrocontroller.net

Forum: Compiler & IDEs Countdown Timer (wie fang ich an?)


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin gerade dabei einen (countdown) Timer für einen UV Belichter zu
schreiben -> und jetzt stelle ich mir gerade die Frage wie ich das
machen kann:

Zum Probieren hab ich einfach mal einen min (minuten wert) und einen
sec (sekunden wert) der dann in Abhängigkeit vom Timer Interrupt
verändert wird definiert.

volatile u8 min = 1, sec = 0;

Wie macht man daraus jetzt eine Logik die die Sekunden nach unten
zählt?

bzw. wenn ich z.b. 4 Minuten habe, dann muss er ja beim ersten
interrupt gleich von 4 eins abziehen und von den vollen (60 sekunden)
auch eins abziehen.

Hab leider überhaupt keinen plan wie ich da anfangen soll....

Bitte um eure Beiträge.
Danke

Mike

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja, wie machts Du das denn


4 Minuten   0 Sekunden

Wenn ich dir jetzt sage, du moegest 1 Sekunde
davon abziehen. Was genau machst du? Welche
Ueberlegungen stellst Du an? Worauf achtest Du?

Programmierer sind zu einem nicht unerheblichen Teil
auch exzellente Beaobachter, wie wir Probleme im taeglichen
Leben loesen. Und zwar auf detaillierter Ebene. Als
Programmierer musst Du immer aus der Lauer liegen und
fragen: Halt, warum machen sie das jetzt? Aufgrund
welcher Tatsache treffen sie diese Entscheidung?

Also

4 Minuten   0 Sekunden

eine Sekunde abziehen: Da Sekunden bereits bei 0
angelangt sind ... (Hinweis: Im Programmiererjargon
ist das ein ganz einfacher Vergleich: Ist Sekunden
bereits bei 0? Wenn ja mache irgendwas, wenn nein
mache was anderes)
... ziehen wir von den Sekunden nicht einfach 1 ab
sondern setzten die Sekunden auf 59 und ziehen dafuer
bei den Minuten 1 ab. Es sei denn natuerlich die Minuten
waren schon auf 0 (die naechste Abfrage), dann werden
die Minuten auf 59 gesetzt und bei den Stunden 1 abgezogen.

also: if( Sekunden == 0 ) {
        Sekunden = 59;
        Minuten = Minuten - 1;    // wir behandeln keine Stunden
      }
      else
        Sekunden = Sekunden - 1;

siehst du: Der Code ist genau das gleiche was ich da oben
des langen und breiten hin geschrieben habe. Wenn Du einmal
in Detail weist was Du (als Person) eigentlich ganz genau
machst, wenn Du vor dem gleichen Problem stehst, dann
kannst Du das auch programmieren. Wenn man selbst ein Problem
nicht loesen kann (noch nicht mal im Prinzip), kann man auch
kein Program dafuer schrieben. So einfach ist das.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei noch zu sagen waere, dass es viele Moeglichkeiten gibt
einer Katze das Fell abzuziehen (wie die Amerikaner sagen).

Ein anderer wuerde vielleicht folgendes machen:

Ich zieh einfach immer eine Sekunde ab. Wenn dann -1
rauskommt, dann hab ich zuviel abgezogen und bin
'ueber die Minute gerauscht'. Also eine Minute weniger
und die Sekunden auf 59 setzen (oder: zu den Sekunden
wieder 60 dazuzaehlen, den -1 + 60 -> 59)

Du musst sowas wie einen Mittelweg gehen: Ohne Plan
sich an den Rechner zu setzen ist besonders bei komplexen
Problemen ein sicherer Weg ins Desaster. Auf der anderen
Seite musst Du auch ein wenig probieren. Es passiert ja nicht
viel (im Sinne von: du machst was kaputt). Manchmal ist es auch
hilfreich zunaechst mal ein einfacheres Problem zu loesen.
Vergiss mal die Minuten fuer einen Moment. Schreib einfach mal
einen Code der im Sekundentakt eine Zahl runterzaehlt. Den
Sekundentakt hinzukriegen kann auch schon eine Herausforderung
sein. Wenn Du Dem Ding dann zusiehst:
 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, ...
koenntest Du vielleicht auf die Idee kommen, dass nach 0
irgendetwas passieren muss. Also fuehrst Du erst jetzt die
Minuten ein und probierst ein bischen rum, bis die bei 0
richtig runtergezaehlt werden.

Trenn Dich auch von der Vorstellung, dass Du Dich hinsetzt
und direkt, aus dem Stand, ein fehlerfreies Programm schreiben
kannst. Du waerst der Erste dem das gelingt. Mit genug Uebung
und viel Praxis geht das bei einfachen Programmen, aber bei einem
Neuling ist das so gut wie ausgeschlossen, wenn wir mal die
allereinfachsten Erst-Programme (Hallo World) aussen vor lassen.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Tips.

Hinbekommen würde ich es höchstwarscheinlich, aber wenn ich dann mal
ein paar zeilen habe und ich dann meinen code ansehe dann verdirbt mir
das alles weil es meistens so unsauber geschrieben ist.

bzw. einfach umständlich!

Ich bin mir sicher wenn ich meinen timer fertig habe und ihn einem
guten programmierer gebe, kann der den code um 60% reduzieren.

Um wirklich sauberen Code schreiben zu können muss man einfach die
sprache gut beherschen und all ihre funktionen und möglichkeiten
kennen!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann er wahrscheinlich.

Nur: Auch der beste Programmierer hat mal so angefangen
wie Du jetzt. Mit unsauberem Code, der praktisch nicht
wartbar ist, etc...
Das kommt alles mit der Zeit und mit der Erfahrung.

Brings zum Laufen. Dann lehn Dich zurueck und schau Dir
an was man besser machen kann. zb. Eine konsistente
Formatierung: sind alle Einruekungen richtig. Sind
die Variablennamen aussagekraeftig? Ganz banale formale
Dinge koennen einen Riesenunterschied ausmachen.

Vielleicht besitzt Du auch den Masochismus das selbe Problem
mal auf 2 oder 3 verschiedene Arten zu loesen. Sowas ist
gar keine so schlechte Idee, denn dadurch sieht man wie
sich Designentscheidungen im Code auswirken koennen.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein anderer Ansatz wäre auch, Du rechnest intern in Sekunden um, also

countdown = min * 60 + sec;

Und zur Anzeige separiert du wieder:

min = countdown / 60;
sec = countdown % 60;

Und die Zählschleife:

while( countdown-- ){
// Wert anzeigen
}
// jetzt abschalten


Peter

Autor: Fritz Ganter (fritzg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und mit der Zeit wirst du dann bestimmte Lösungen dann als "schön"
empfinden. Wenn dir der Code nicht gefällt, überdenk nochmal wie man es
anders bzw. kürzer bzw. lesbarer machen kann.

Wenn ich Programme von mir anschaue die ich noch vor ein paar Jahren
geschrieben hab, will ich auch kotzen. Aber man lernt mit der Zeit.


P.S.: Geduldsorden für Karl Heinz Buchegger!

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.