- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 4 von 4

Thema: Wie berechne ich die Timerzeit (Prescale,...)???

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26

    Wie berechne ich die Timerzeit (Prescale,...)???

    Anzeige

    E-Bike
    Hallo
    Habe ein Testprogramm, in dem ein Timer jede Sekunde einen Befehl ausführt. Leider verstehe ich nicht, wie sich die Zeit dieser Sekunde berechnet. Der Prescale-Befehl teil soweit ich das verstanden habe den Systemclock durch die entsprechende Zahl, hier 256. Der Systemclock ist denke ich die Quarzfrequenz, also 16MHz. 16Mhz/256= 62500.
    Wie komme ich mit der timervorgabe von 3036 auf die eine Sekunde, bis zum erreichen des Timers?? Kann mir jemand die berechnung erklären?

    So sehen Teile des Programms aus:

    Config Timer1 = Timer , Prescale = 256
    Const Timervorgabe = 3036

    Der Timer wird dann folgendermaßen aufgerufen:

    On Timer1 Timer_irq
    Enable Timer1
    .
    .
    .
    Timer_irq:
    Timer1 = Timervorgabe
    Impulseprosekunde = Zaehlerirq0
    Zaehlerirq0 = 0
    Return

    Danke für die Hilfe!

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Der Timer hat am Eingang den Quarztakt von 16MHz. Dieser wird mit dem Prescaler (Vorteiler) nochmals verringert (nur bei jedem 256sten Takt zählt der Timer weiter). Das hast du ja schon selbst herausgefunden.
    Bei Prescaler 256 wird dein Timer also mit 16 000 000 Hz/ 256 = 62500 Hz getaktet.

    Ein 16bit-Timer kann von 0 bis 65535 zählen, also 65536 Schritte. Daher läuft er bei 62500Hz Eingangstakt 62500/65535 = 0,95367mal pro Sekunde über, was einer Periode von 1,0485Hz entspricht. So viel willst du aber nicht haben. Also musst du in der ISR den Timer mit einem Wert vorladen, damit er nicht bei 0 beginnt, sondern bei einem größeren Wert.
    Du willst 1Hz erreichen. Dafür muss der Timer quasi den Takt durch 62500/1= 62500 teilen, also schon alle 65200 Takte einen Interrupt auslösen. Damit er dies macht, wird er mit 65536-62500= 3036 vorgeladen. Dann zählt er immer von 3036 bis 65535 durch, und zwar in genau einer Sekunde.

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich hab mir da mal ein Excel-Sheet für die Berechnung gemacht, vielleicht hilft dir das was zum Verständnis.

    MHZ, Zielfrequenz und Timer-Type füllt man aus, dann gibt rechts keine, eine oder mehrere Lösungen

    Beispiel 16 MHZ Quarz, 1000 Hz sollen es werden (1 mS) Zähler 256 (=8Bit)
    Angehängte Dateien Angehängte Dateien
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Ich empfehle den Modus "Clear Timer on Compare (CTC)".
    Es entfällt das Nachladen und die Ungenauigkeit aus der PUSH Orgie von Bascom, wenn es eine ISR betritt.
    Bascom unterstützt das leider nur mäßig, einfach die Register von Hand setzen.

    Wenn es genau 1 Sekunde sein soll und 8Mhz Taktfrequenz reichen, empfehle ich den async-Modus mit ext. 32khz-Quarz von Timer2.
    Code:
    Config Timer2 = Timer , ASYNC = 1 , Prescale = 128

Berechtigungen

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

12V Akku bauen