- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 7 von 7

Thema: Hilfe! Uhr läuft zu schnell?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied Avatar von HPM
    Registriert seit
    16.02.2005
    Ort
    D-98744
    Beiträge
    78

    Hilfe! Uhr läuft zu schnell?

    Hallo Forumler,

    habe eine (ich denke kleine) Frage!

    Ich habe einen Mega8 dazu benutzt eine Funkuhr zu bauen.

    Ich verwende die dcf.lib von:
    copyright = W.Krueger
    comment = DCF 77 Decoder
    libversion = 1.00
    date = 05.03.2006

    mit dem Code:
    Code:
    '-------------------------------------------------------------------------------
    ' Allgemein Grundeinstellung
    '-------------------------------------------------------------------------------
    $regfile = "m8def.dat"                                      'Prozessor AT Mega8
    $crystal = 4000000                                          '4MHz-Takt extern
    
    
    '-------------------------------------------------------------------------------
    ' DCF-Funkuhr Grundeinstellung
    '-------------------------------------------------------------------------------
    $lib "dcf77.lib"                                            ' einrichten für M8
    $external Dcf77                                             ' und Eingangssignal!
    Declare Sub Dcf77
    Config Timer0 = Timer , Prescale = 1024                     'Timer für 40Hz (25ms)
    Const Startwert = 158
    Timer0 = Startwert
    On Timer0 Tim0_isr                                          'Überlauf alle 25ms
    Enable Interrupts
    Enable Timer0
    Die Uhr läuft mit 4MHz tadellos!

    Jetzt habe ich einen 16MHz Quarz eingesetzt
    und den Code in:

    $crystal = 16000000

    geändert.

    Problem: Meine Uhr läuft jetzt viel zu schnell!

    Wo muss ich noch Änderungen vornehmen, um die Uhr in normaler Geschwindigkeit laufen zu lassen?
    Viel Spaß im Forum
    MfG Peter

    Rechtschreibfehler sind geistiges Eigentum des Verfassers.... wer sie findet darf sie aber behalten

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    soweit ich das etz sehe zählt der timer mit startwert 158 also bis 97 quasi.
    4MHz/1024(prescale)=3906,25Hz das geteilt durch 97 und du bist bei deinen 40,27Hz. wenn er jetzt 4 mal so schnell taktet, ergibt sich 161,1Hz, das sind etwa 6,2ms. (anstelle der 25ms)

    wenn du den timer doppelt so lange laufen lässt (also mit startwert 61), solltest du anstelle der 25ms auf etwa 12,5ms kommen.

  3. #3
    Benutzer Stammmitglied Avatar von HPM
    Registriert seit
    16.02.2005
    Ort
    D-98744
    Beiträge
    78
    Hallo robocat ,

    vielen Dank , erst mal für die schnelle Antwort!

    Ich werden das Mal probieren!
    Melde mich noch mal
    Viel Spaß im Forum
    MfG Peter

    Rechtschreibfehler sind geistiges Eigentum des Verfassers.... wer sie findet darf sie aber behalten

  4. #4
    Benutzer Stammmitglied Avatar von HPM
    Registriert seit
    16.02.2005
    Ort
    D-98744
    Beiträge
    78
    Hallo robocat ,

    hab Deine Berechnungen in die Programmierung übernommen und die Uhr ist langsamer gelaufen. Ich habe sie aber nicht auf 1Hz bekommen, ewta so 2Hz!

    Ich hab dann statt den 16MHz Quarz einen 8MHz Quarz eingesteckt.
    Jeztz läuft sie sekundengenau mit 8MHz!

    Woran liegt denn das nun wieder ???
    Viel Spaß im Forum
    MfG Peter

    Rechtschreibfehler sind geistiges Eigentum des Verfassers.... wer sie findet darf sie aber behalten

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    ich habe von Bascom keinen schimmer, aber der a8 bleibt sich ja gleich.

    timer0 ist ein 8 bit-timer, kann also maximal von 0 bis 255 zählen (256 schritte, errechenbar mit "2 hoch 8". der zähler startet hier aber nicht bei 0, sondern bei 61, zählt also nur 195 schritte.
    ausserdem wird der Quarztakt noch durch den prescaler geteilt, prescale ist hier 1024. einen noch größeren prescaler hat der a8 nicht.

    es ergibt sich also folgende frequenz:

    quarztakt/(prescale-faktor*schrittzahl)=8000000/(1024*195)=40,06Hz

    die dauer eines schrittes ist t=1/frequenz, also hier 0,02496 sekunden.
    das sind halbwegs genau die 25ms, die du benötigst.

    der langsamste takt mit 8-bit-timer bei 16 MHz wäre (etwa) 16,4ms. um auf 25ms zu kommen, müsstest du also den 16bit timer verwenden.

    kurz gesagt ist die dauer eines schritts bei gleichem code bei halber frequenz logischerweise doppelt so lang.

    kurz noch eine frage an die bascom-kundigen:
    im datenblatt zählt timer0 von 0 bis zum compare-match. hier scheint das andersherum zu sein (zählt vom startwert bis 255), sonst würde meine rechnung ja nicht stimmen. ist das programmspezifisch oder eine eigenschaft von bascom?

    wenn etwas nicht stimmt, korrigiert mich bitte.

    gruesse von der katze

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo HPM,

    für den 16 MHz Quarz brauchst du den 16-Bit-Timer.

    Da nimmst du dann z.B. Prescale = 256 und Timer-Startwert = 63974

    Viel Erfolg!

    Dirk

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Zitat Zitat von robocat
    kurz noch eine frage an die bascom-kundigen:
    im datenblatt zählt timer0 von 0 bis zum compare-match. hier scheint das andersherum zu sein (zählt vom startwert bis 255), sonst würde meine rechnung ja nicht stimmen. ist das programmspezifisch oder eine eigenschaft von bascom?
    Das liegt nicht an Bascom, sondern am Mega8. Sein timer0 hat nämlich keine compare-unit. Er kann nur ganz simpel vor sich hin zählen, bis er überläuft. Man muss daher im Overflow-interrupt das Zählregister mit dem passenden Wert laden, um eine bestimmte Periodendauer zu erhalten.

    @HPM: wenn der Zählbereich von Timer0 bei 16Mhz nicht ausreicht, zähl doch einfach die Zeit nur in jedem zweiten Interrupt weiter... [der passende Startwert für 12,5ms wäre 61]

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress