- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 7 von 7

Thema: Atmega8 "Timer" selber erstellen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.08.2007
    Beiträge
    36

    Atmega8 "Timer" selber erstellen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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
    Geändert von kollimann (27.08.2012 um 19:14 Uhr)

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    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.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    08.08.2007
    Beiträge
    36
    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.

  5. #5
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von kollimann Beitrag anzeigen
    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).
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    08.08.2007
    Beiträge
    36
    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.
    Geändert von kollimann (27.08.2012 um 20:38 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

Ähnliche Themen

  1. Wie kann ich ein "code snippet" für AVR-Studio erstellen?
    Von Boomi** im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 06.05.2012, 10:30
  2. Roboter selber über "Gehirnschnittstelle" gesteuer
    Von Andree-HB im Forum Sensoren / Sensorik
    Antworten: 14
    Letzter Beitrag: 13.09.2010, 18:22
  3. Getriebeschrittmotor "selber bauen"
    Von guybrush im Forum Motoren
    Antworten: 7
    Letzter Beitrag: 19.06.2010, 10:52
  4. "frequenzumrichter" ähnlich l298 selber bauen
    Von heduobacht im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 01.09.2006, 09:01
  5. Touchscreen Controller selber bauen mit "ADS7846E"
    Von amd2408 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 12.05.2005, 15:00

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad