PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega8 "Timer" selber erstellen



kollimann
27.08.2012, 20:02
Hallo, steh etwas auf dem Schlauch...................
Ich baue eine RGB LED Steuerung mit einem Atmega8, soweit kein Problem.
Ich würde gern die eigestellten Parameter nach einer Zeit XX ins Eeprom speichern das beim nächsten anschalten alles so ist wie beim letzten ausschalten.
RGB LED bedeutet ja das ich beide Timer für 3 PWM Kanäle benötige, also hab ich keinen Timer über um nun angenommen 30 Sekunden zu zählen um dann zu speichern.
Kurze Projekt Info.
3PWM Kanäle für die RGB LEDs, 3 Taster, 1xheller,1xdunkler,1xFarbe.

Mein Gedankengang, wenn 1Taster gedrückt wird eine Startvariable auf 1 setzen, einen Zählwert auf 0 setzen, in die Hauptschleife dann wenn "Startvariable=1" dann incr Zählwert, wenn Zählwert = XXXXXXX dann Sekunde +1 und Zählwert wieder 0. Also einen "eigenen" Timer, wobei eigentlich völlig egal ist wie genau der geht, also ob nun da 30Sekunden am Ende rauskommen oder 40Sekunden ist ja wurscht.
Sinn des ganzen soll nur sein, man macht Licht an, stellt sich was hübsches ein wenn dann eingestell, also die in etwa 30Sekunden abspeichern.


Soweit zur Theorie.
Wie bekomm ich nun raus "bis wieviel" der Atmega in einer Do-Loop zählt? Weil irgendwie muss ich ja einen anhaltswert finden wieviel mal er in etwa pro Sekunde die Do-Loop durchrennt.

Hoffe es versteht jemand in etwa was ich hier schreibe,

Der Code in groben Zügen


Do
Taster1 überwachen, wenn gedrückt goto heller
Taster2 überwachen, wenn gedrückt goto dunkler
Taster3 überwachen, wenn gedrückt goto farbe

Compare1a = Farbwert1
Compare1b = Farbwert2
OC1a = Farbwert3

If Startzähler = 1 then
incr Zählwert
If Zählwert = XXXXX
Incr Sekunde
Zählwert = 0
End if
End if
If sekunde = 30 then
goto speichern
end if
Loop

Heller
bla bla
Zählwert = 0
Startzähler = 1
goto main


das dann auch bei dunkler und bei Farbe, also immer wenn ein Taster gedrückt Zeit von 0, wenn dann man X Sekunden ruhe ist speichern.

Atmega läuft bei 4Mhz

Also eigentlich brauch ich ja nur noch wissen eben bis wie weit zählt der Atmega in etwa pro Sekunde? Wie berechne ich das?
Oder wie sonst machen?????
Andere, bessere Vorschläge gern willkommen.

Danke Heiko

Kampi
27.08.2012, 20:17
Hallo,

in deinem jetzigen Programm würdest du andauernd in die Speichern-Routine springen, da "Startzähler" nicht zurück gesetzt wird und damit machst du dir dein EEPROM kaputt.
Mal eine ganz doofe Frage meinerseits.....wieso machst du es nicht einfach das es beim Tastendruck gespeichert wird ;)?
Finde ich persönlich einfacher als sowas.
Zu deiner Frage.....was meinst du bis wieviel der in einer Do-Loop zählt?
Im Moment läuft es so ab, das er bei Startzähler = 1 die Variable Zählwert erhöht und das solange bis die Variable einen bestimmten Wert erreicht hat. Danach wird sie auf 0 gesetzt und Sekunde um 1 erhöht. Das ganze macht er 30x bis Sekunde = 30 ist und dann geht er ins Programm speichern und danach geht der ganze rummel von vorne los.
Du kannst also die "Zeit" bis die 30 erreicht sind dadurch bestimmen indem du den Wert XXXXX sag ich mal von 16000 auf 32000 erhöhst.
Die Zeit die der Controller braucht um das Hauptprogramm abzuarbeiten wird durch die Befehle im Programm (ISRs und Subs mit eingeschlossen) beeinflusst.
Je mehr Befehle desto mehr Zeit braucht er.
Du kannst es ausrechnen indem du dir anguckst was der Compiler aus jedem Befehl macht, dir dann anschaust wieviel Taktzyklen die Befehle brauchen, die zusammenrechnest und dann hast du die Zeit.
Einfacherer Weg wäre du togglest am Anfang deines Programmes einen Pin und schaust mitm Oszi wie hoch der Takt ist. Dann weißt du wieviel Sekunden vergehen bevor der Controller wieder am Anfang vom Programm ist.

Besserwessi
27.08.2012, 20:40
Die Idee, 30 Sekunden nach einer Änderung zu speichern ist schon gut - so speichert man nicht jede kleine Änderung, sondern nur wenn der Wert auch eine Zeit genutzt wurde. Vor dem Speichern sollte noch getestet werden, ob sich der Wert überhaupt geändert hat.

Um die 30 Sekunden festzulegen sehe ich 2 Möglichkeiten: man zählt die Durchläufe der Hauptschleife. Wie viele Durchläufe man da braucht müsste man nachmessen bzw. aus der Simulation bestimmen. In der Simulation gibt es einen Zyklenzähler, so das es nicht schwer ist die Zahl der Zyklen für einen Druchlauf zu messen. So super genau muss die Zeit ja auch nicht sein.

Für eine genauere Zeit könnte man einen Interrupt von einem der Timer nutzen - zumindest wenn die PWM Frequenz nicht extra hoch gewählt wird. In der ISR wird dann ein Variable hoch oder runter gezählt, und bei erreichen der Grenze ein Flag gesetzt. Über das Falg merkt das Hauptprogramm dann, das die Daten gespeichert werden sollen. Speichern direkt in der ISR ist nicht gut (ginge aber auch noch), weil das Schreiben ins EEPROM relativ lange braucht - in der Zeit wird dann nicht auf Tasten reagiert.

kollimann
27.08.2012, 20:44
OK, doch nicht so optimal erklärt.............

Warum nicht beim Tastendruck speichern...
Also ich habe 10 Hell/Dunkel stufen und 10 Farben, 5x dunkler 3x Farbe, och nö doch heller ,wieder 3x macht schon 12xspeichern.

Das mit dem "Ende" hab ich weggelassen, klar wird in der speicher Routiene das "zählen" beendet !
Also bei jedem Tastendruck wirds gestartet, bei erneutem Tastendruck wirds wieder auf 0 gesetzt, also so lange man Tasten drückt gehts immer von vorn los bzw. wird neu gestartet, wenn dann Farbe und Helligkeit erreicht eben so lange zählen bis speichern, dann Ende der speicher Sache, geht erst wieder los wenn wieder Tastendruck.
So besser verständlich?
Das ist ja auch kein Klavier wo man standig Hell ändert oder Farbe ändert, aber bei jedem Tasten zu speichern find ich auch übertrieben.

Das ist ja auch nur meine Idee das zu lösen, wenns bessere Vorschläge giebt immer her damit.

Kampi
27.08.2012, 21:03
Das ist ja auch kein Klavier wo man standig Hell ändert oder Farbe ändert, aber bei jedem Tasten zu speichern find ich auch übertrieben.



Nene ich meinte nicht bei jedem Tastendruck sondern viel mehr das du es so einstellst wie du haben möchtest und dann einen seperaten Taster zum Speichern hast (oder eine Tastenkombination aus Tastern).

kollimann
27.08.2012, 21:19
Nee, per Taster speichern = ausgeschlossen, da 4 Taster für 6 Funktionen und nicht meine Anwendung sondern "Anwender" Anwendung !
Das muss der allein für sich erledigen der Atmega.................

Ich dacht halt es gibt eine Möglichkeit zu errechnen wieviel mal er in 1 Sekunde durch die Loop rennt, zumindest in etwa, sprich er zählt den Wert x bis 1Mio oder bis 1Bio in 1 Sekunde.

Es ist doch Wurscht ob der nun nach 30Sekunden oder nach 40 oder 50 speichert.
Ich such doch nur einen Anhaltswert wenn ich schreibe

wert = 0
Do
incr wert
loop

bei wieviel steht wert nach 1 Sekunde in etwa, das ich dann wert 0 setzen kann und sekunde +1 mache.

ich dacht das kann man berechnen.
so nach dem Motto
"wenn nichts dazwischen kommt" schaff ich es bei 4Mhz auf 1,5Mio durchläufe pro Sekunde.
Da nehm ich 1Mio und gut ist.

Achso, ich hab kein Oszi zum messen.

Besserwessi
27.08.2012, 22:20
Die Zeit für einen Schleifendurchlauf würde ich so auf vielleicht 0.1 ms schätzen, also rund 10000 Durchläufe je Sekunde . Nachmessen geht ganz gut in der Simulation per Einzelschritt - das ist deutlich einfacher und auch genauer als mit dem Oszilloskop.