Mit dem linken Button soll der Timer gestartet (und ein Relais geschaltet) werden, bei nochmaligem Drücken soll der Timer neu gestartet (und ein anderes Relais geschaltet) werden. Beim Drücken des rechten Buttons soll der Timer gestoppt werden und die abelaufene Zeit noch für 10' angezeigt werdern (außerdem noch beide Relais geschaltet werden).
Nun habe ich (als mehr oder weniger Anfänger) ein paar Fragen, vielleicht habt ihr Tipps:
Ist der Aufbau so überhaupt sinnvoll? Ich habe das tolle ShiftOut-Tutorial als Grundlage benutzt.
Ist es sinnvoll, den Timer über einen Interrupt zu starten / zu stoppen? Dann könnte ich die Uhr ganz einfach runterlaufen lassen (delay(1000) zählt 1 s weiter) und bräuchte mir keine Gedanken um das Timing zu machen (ich möchte eigentlich keinen separaten Baustein a la DS1307 dafür verwenden).
Mit dem Debouncen der Taster kenne ich mich nicht aus: Ich habe eine Bounce-Bibliothek und ein Debounce-Tutorial gefunden. Was empfehlt ihr (ggf. im Kontext Interrupts)?
Gibt es das gesamte Problem vielleicht schon als fertigen Code gelöst und ich habe es übersehen?
last but noch least: Wozu dient der Kondensator am Clock-PIN?
Der kondensator verlangsamt die flanken der clock pulse. Ich habe den bei meinen 595 spielereien nie in betracht gezogen und auch nicht "vermisst". Ich wuesste auch nicht, was da flickern sollte (wie im artikel beschrieben). Es sei denn, man schickt dem chip falsche daten, egal ob bewusst oder unbewusst. Es koennte natuerlicht sein, dass aus irgendwelchen gruenden (z.b. stoerkapazitaeten, miese schaltung, defekte chips) die daten nicht schnell genug valide sind (die clock also relativ zu ihnen etwas zu frueh auf HIGH geht), was man durch einen kondensator wieder hinpfuschen kann. Befuerworten kann ich sowas aber nicht. Ich hatte das problem jedenfalls nie.
Einige deiner links funktionieren nicht.
Da es hier nur um sekunden geht (fuer den micro sind das ewigkeiten) wuerde ich mir persoenlich nicht die muehe machen, mit timern/irq zu arbeiten. Mit der millis() funktion kann man gut abfragen, ob es "zeit" fuer den naechsten tick ist. Es sei denn, du willst das unbedingt.
Die de-bounce bibliothek scheint sinnvoll zu sein. Ein einfacher RC filter funktioniert auch. Absolut notwendig ist das nur, wenn du den schalter als trigger fuer einen interrupt verwendest. Alles andere kann man per software auswerten/timen.
ad1): den Kondensator habe ich entfernt.
ad2): danke, ist korrigiert (war es von anderen Foren gewohnt anders Links einzufügen)
ad3): vielleicht nutze ich die MsTimer2 - Bibliothek und
ad4): um das debouncen kümmere ich mich anschließend.
Danke + lg
fresapo
edit:
den Anschluss der 7-Segment-Anzeigen habe ich nun passender zum Datenblatt gewählt und den Kondensator weggelassen:
Was mir gerade noch an deiner 2. skizze auffaellt, pin #13 der chips (enable, "active low") muss auf GND. Sonst haben die ausgaenge Q0-Q7 einen nicht wohl definierten zustand. Das kann sich z.b. dadurch aeussern, dass es manchmal nicht funktioniert und durch "handauflegen" dann ploetzlich doch.
Wenn du auf diesen pin einen der PWM ausgaenge legst, laesst sich sehr leicht eine (globale) helligkeitsregulation realisieren.
Hi,
danke dir (auch für den PWM-Tipp) , hab's in der Grafik korrigiert.
Morgen werde ich die Schaltung aufbauen und den Quelltext hier einstellen.
lg fresapo
Noch nicht auf dem Bild sind zwei Buttons links/rechts. Die Logik des linken Buttons, zu ihm gehören die Variablen alter und aktueller Zustand, ist in dieser Tabelle dargestellt:
Wenn man den rechten Button drückt, soll ein Interrupt ausgelöst werden, der die Uhr anhält und die Variable leftButtonLastState auf 0 zurück setzt, das werde ich hinkriegen. Außerdem muss ich die Taster noch entprellen, da hab' ich Bammel vor.
die Bounce-Bibliothek zum Entprellen habe ich nun benutzt um den linken (im Bild oben ;-)) und rechten Taster zu entprellen. Für die reale Anwendung muss man noch ein wenig mit der debounce-Zeit und der "duration" (wie lange wurde gedrückt) spielen.