Eigentlich ganz einfach.Eine Frage habe ich noch: Warum wird erst in der if-Abfrage (if (us_counter == 0)) der Wert von us_counter mit einem Wert beschrieben (us_counter = 1000; ) und nicht schon davor?
Wenn die Variable us_couter den Wert 0 hat, dann wird die darunter stehende Routine aufgerufen.
Als ersten wird dann innerhalb dieser Routine der Variable us_couter der Wert 1000 zugewiesen und dann der Rest der da stattfinden soll ausgeführt.
Nun wird diese Routine so lange nicht mehr aufgerufen, bis die Variable us_couter wieder den Wert 0 erreicht.
us_couter wird in einem Timer Overflow Interrupt heruntergezählt, somit hat man eine Zeitverzögerung erreicht.
Würde man die Variable us_couter ausserhalb der if Abfrage auf 1000 setzen, wäre sie praktisch immer grösser als 0, da sie ja ständig neu gesetzt würde.
Übrigens teste ich meine Programme gerne mit der Simulator Funktion von AVR Studio 4.
Damit kann man das Timing wunderbar mit dem Timer und Cycle Conter überprüfen und gucken ob in der Simulation die Ausgänge auch das tun was man erwartet.
Das Prog hat da zwar ein paar kleinere Bugs, funktioniert aber ansonsten super.
Der Aufruf bzw. das Einbinden von Interrupts ist Compilerabhängig und sollte sich im Tutorial des jeweiligen Compilers finden lassen. Bei ACR GCC hätt ich jetzt nachschauen müssen.
So, also es scheint alles soweit zu Klappen. Beim ersten Versuch hab ich die Freigabe der Interrupts via sei() ; nicht ganz an den richtigen Stellen geschrieben. Aber das ist mir sofort aufgefallen und habe sie richtig setzen können.
Viele Dank für eure Hilfe! Habe wieder einiges dazu lernen können
Ganz besonderer Dank geht an Searcher und wkrug!
Gruß
Technik_Amateur
Lesezeichen