- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Uhr an Timer2 vom Atmgea32 bei 16.000.000Hz

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    460

    Uhr an Timer2 vom Atmgea32 bei 16.000.000Hz

    Hallo Zusammen,
    ich brauche für ein neues Projekt eine Uhr auf meinem Mega32.
    Timer 1 ist leider schon belegt, bzw. wird später für ne andere Funktion gebraucht, wozu ich einen 16 Bit Timer brauche.

    Daher kommt eigentlich nur Timer 2 in Frage. Der Mega32 ist auf der RN-Control und hat nen 16000000Hz Quarz.

    Nun habe ich mir überlegt, ich teile 16000000 erstmal durch 256 (Prescale). Dann komme ich auf 62500.
    Ich lasse meinen 8 Bit Timer von 5 an zählen, so komme ich auf 250 Schritte, also 62500/250= 250.

    Jetzt erstelle ich eine Variable die ich in der ISR von Timer 2 um 1 erhöhe.
    Zusätzlich wird hier der Timer wieder auf 5 gestellt.

    In meiner normalen Do Loop schleife lasse ich jetzt sobald die Variable auf 250 ist sie zurück auf 0 setzen und erhöhe meine Sekunden um 1.

    Dann noch über ein paar If Than befehle bei 60s zurück auf 0 und die Minuten +1.

    Das läuft alles soweit gut, nur bekomme ich extreme Abweichungen. Der Mega32 hängt pro Minute mehrere Sekunden hinter der Zeit. Woran kann das liegen?

    Ich programmiere auf nem alten 95 Rechner ohne Internet, daher ist es schwer den Code hier rein zubekommen, werde ihn aber versuchen morgen auf cd zu brennen und dann hier reinzustellen


    Ich hoffe ihr versteht mein Probelem und könnt mir helfen

    Viele Grüße
    Dominik

  2. #2
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    72
    Beiträge
    11.077
    Hallo!

    Zitat Zitat von Dominik009 Beitrag anzeigen
    Der Mega32 hängt pro Minute mehrere Sekunden hinter der Zeit. Woran kann das liegen?
    Es liegt sicher an zu langer und variabler Ausführungszeit der ISR.
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  3. #3
    Hardware-Entwickler
    Gast
    Mein Vorschlag:
    - Prescaler von 1024 verwenden, daraus ergibt sich eine Frequenz von f_Timer = 15625 Hz
    - CTC Mode benutzen, Timer Compare Match bei OCR2 = 125-1
    - TIMER2_COMP Interrupt aktivieren, die ISR wird nun 125mal die Sekunde aufgerufen
    - in der ISR eine Variable inkrementieren, und bei 125 zurücksetzen und eine Minute ist um

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    460
    Hallo,
    An der ISR kann es natürlich liegen, das wird es auch wahrscheinlich sein.
    leider verstehe ich die Idee vom Hardware-Entwickler nicht so ganz.prescaler auf 1024 ok, aber weiter???

    Was bedeutet ctc bei orc2 = 125-1?
    Und was genau meinst du mit timer2_comp interrupt?

    Hättest du oder vielleicht wer anders ein paar Zeilen Code die das zeigen?


    Im ctc Modus errechne ich ja den Vergleichswert wie folgt:
    Quarz-Frequenz/prescaler/2/gewünschte-frequenz

    Bei mir also 16000000/1024/2/1 = 7812,5 also zu groß für nen 8 Bit timer
    was meinst du mit 125-1?


    Viele grüße
    Dominik
    Geändert von Dominik009 (20.12.2013 um 01:10 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Zitat Zitat von Hardware-Entwickler Beitrag anzeigen
    ...
    - TIMER2_COMP Interrupt aktivieren, die ISR wird nun 125mal die Sekunde aufgerufen
    - in der ISR eine Variable inkrementieren, und bei 125 zurücksetzen und eine Minute ist um
    Die Minute hat bei mir 60 Sekunden. Ist ja egal, da zählt man eben weiter wenns bis zur Minute reichen soll; nur das ist dann der Unterschied zwischen unit8_t und uint16_t.
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Dominik,
    deine Lösung und die von Hardware-Entwickler liegen von der Berechnung her nicht weit auseinander.
    Bei dir: Prescale 256, Timer läuft nach 250 Ticks über, Zähler läuft bis 250 == 256 * 250 * 250 = 16M
    Bei ihm: Prescale 1024, Timer matched nach 125 Ticks, Zähler läuft bis 125 == 1024 * 125 * 125 =16M
    Seine ISR wird nur halb so oft pro Sekunde aufgerufen, verbraucht also weniger Prozessorzeit.

    Wichtiger ist der Unterschied mit CTC Mode und Timer vorladen. Bei deiner Art bist du in Teilen von der Ausführungszeit der ISR abhängig. Speziell bei kleinen Prescale Werten ergeben sich dadurch signifikante Abweichungen.
    Anders der CTC Mode. Der Timer läuft praktisch komplett in HW, inklusive Zurücksetzen. In der ISR änderst du nichts am Timer.
    Leider wird deine Art in allen Tutorials, Foren und auch in der Bascomhilfe immer als erstes gezeigt und scheint auch besser verständlich zu sein. Aber ich würde dir raten, grundsätzlich darauf zu verzichten.

    Der CTC Modus funktioniert in Bascom so:
    Config Timer2 = Timer, Prescale = 1024, Clear_Timer=1, Compare = Toggle
    Compare2 = 124 '125 Ticks, weil der Timer bei 0 anfängt (deshalb 125 - 1), du kannst auch OCR2 = 124 schreiben
    On Compare2 Timer_Isr
    Enable Compare2

    Allerdings glaube ich nicht, dass dadurch mehrere Sekunden pro Minute zu erklären sind.
    Zeig doch mal dein ganzes Programm.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.188
    Was bedeutet ctc bei orc2 = 125-1?
    Und was genau meinst du mit timer2_comp interrupt?
    Ich denke das Problem sind hier die Begrifflichkeiten.
    CTC bedeutet Clear Timer at Comparematch und heisst, wenn das entsprechende TCNT Register den Wert des Comparematchregisters erreicht wird es in der Hardware sofort wieder auf 0 gesetzt. Beispiel Comp 2 Register hat den Wert 127, TCNT2 erreicht 127 und wird sofort auf 0 gesetzt.

    zu 2. So ein Timer kann nicht nur bei einem Überlauf einen Interrupt produzieren, sondern auch wenn das TCNT Register den Wert eines Comparematchregisters erreicht. Dadurch hat man bei der Wahl der Prescaler mehr Möglichkeiten den gewünschten Teilerfaktor zu erreichen.

    Grundsätzlich bevorzuge ich große Prescaler, weil sich damit normalerweise eher seltener Interruptaufrufe ergeben.

    Wenn dein 16 Bit Timer frei läuft kannst Du sogar dort noch deine Uhr mit einbauen.

    Du gibst dort den Comparematch Interrupt frei und zählst zum Comparematchregister innerhalb dieses Interrupts den Wert für den nächsten Zeitabschnitt dazu.
    Dadurch kommt es immer wieder zu festen Zyklen zu einem Comparematch Interrupt.

    Zusätzlich würde ich Dir empfehlen eine zusätzliche Vergleichs- " Uhr " wie eine Real Time Clock ( RTC ) oder DCF 77 als Vergleich zu benutzen, weil sonst Deine Uhr nach längerer Zeit falsch gehen wird. Die Zeitbasis ist ja vom Controllerquarz abhängig, der auch nich zu 100% genau ist.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    460
    Hallo,
    erstml danke für die zahlreichen Antworten.
    bessere Grade den Code aus, doch leider nimmt er die Zeile:
    On Compare2 ISR_von_timer2 nicht an (error 117)

    Kann ich anstelle von compare2 auch timer2 schreiben?

    Gruß
    Dominik
    Geändert von Dominik009 (20.12.2013 um 12:39 Uhr)

  9. #9
    RN-Premium User Stammmitglied
    Registriert seit
    26.01.2005
    Ort
    Leipheim / Donau
    Beiträge
    53
    Hallo Dominik009,

    Timer2 ist optimal für einen Uhrenquarz an TOSC1 und TOSC2,
    du teilst den Takt durch 128 gibt den OVL Interrupt frei und lässt den Timer einfach loslaufen
    und bei jedem Überlauf wird ein Interrupt ausgelöst und 1 Sekunde ist abgelaufen du musst nur eine Variable incrementieren.
    Ich muss dazu sagen ich mache sowas immer im Assembler, ich weis nicht wie sich die Laufzeiten in Bascom verlängern.
    Mehr info findest du im Datenblatt unter Timer2.

    nfg ihle

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    460
    Vielen Dank für den Code!
    Auch vielen Dank für den Tipp mit dem Quarz. Kann ich den weiterhin den normslen 16000000hz Quarz nehmen und den Uhrenabsatz zusätzlich? Werde ich bei meinem nächsten Projekt mal testen, habe jetzt leider keinen passenden Quarz und extra einen einzeln bestellen ist auch blöd


    @for_ro,
    Das Programm läuft dank deinem code, jedoch zu langsam.
    Ich würde sagen, gefühlt läuft sie etwa halb so langsam wie ne richtige Uhr, also +eine Sekunde auf dem Mega sind +2 Sekunden in echt
    woran kann das liegen?

    Wenn ich richtig rechne stimmt im Code evtl. Was nicht.
    16000000/1024/2/125 = 62,5
    also muss ich entweder in die ISR 62,5 packen, was logischerweise nicht geht.

    Also muss 62,5-1=61,5
    und das ändert an der Geschwindigkeit der Uhr leider nichts

    Gruß
    Dominik
    Geändert von Dominik009 (20.12.2013 um 18:26 Uhr)

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Problem mit Alarm bei Selbstbau-Uhr
    Von joho63 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 23.11.2013, 13:15
  2. 2.000.000 °C per Laser
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 2
    Letzter Beitrag: 12.02.2012, 20:10
  3. Akku mit 1.000.000 Ladezyklen?
    Von Kobolt im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 5
    Letzter Beitrag: 12.11.2011, 19:25
  4. Probleme mit Timer2 bei AtMega644
    Von sebi87 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 29.09.2011, 07:58
  5. Timer2 als interne Uhr im powerdown Modus
    Von slavezero im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 07.04.2007, 11:01

Berechtigungen

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

12V Akku bauen