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
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.
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.
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!
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.
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.