-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Uhr an Timer2 vom Atmgea32 bei 16.000.000Hz

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    459

    Uhr an Timer2 vom Atmgea32 bei 16.000.000Hz

    Anzeige

    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
    66
    Beiträge
    10.970
    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
    Benutzer Stammmitglied Avatar von Hardware-Entwickler
    Registriert seit
    18.12.2013
    Ort
    BaWü
    Alter
    27
    Beiträge
    44
    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
    459
    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 02:10 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    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.112
    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
    1.892
    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
    459
    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 13:39 Uhr)

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von Dominik009 Beitrag anzeigen
    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
    Nein, der Timer2 Interrupt ist bei Bascom der OVF2, also der Überlauf. Du brauchst den Compare.
    Du verwendest einen Mega32, richtig? Welche Bascom Version hast du?

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    459
    Jo, ich hab nen mega32 und Bascom 1.11.9.0

Seite 1 von 3 123 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, 14: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, 21:10
  3. Akku mit 1.000.000 Ladezyklen?
    Von Kobolt im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 5
    Letzter Beitrag: 12.11.2011, 20:25
  4. Probleme mit Timer2 bei AtMega644
    Von sebi87 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 29.09.2011, 08:58
  5. Timer2 als interne Uhr im powerdown Modus
    Von slavezero im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 07.04.2007, 12:01

Berechtigungen

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