Interrupt Zeiten - Rechenfehler gesucht..

OP Persönliche Seite #3099364
Hi,

da ich gerade mit einem anderen Codeschnipsel nicht weiter komme, wollte 
ich Mal meine "Uhr" auf Genauigkeit überprüfen.
Es handelt sich dabei um einen PIC mit 8Mhz
1
else if (TMR0IE && TMR0IF)
2
    { //Timer0 ist nicht aktiv, wenn die MPU schläft.
3
        //8-bit - Timer --> 8000000/256 = 0,000032s bei 1:1
4
        //Aktueller Prescaler: 1:2 -->0,000064s -->Faktor 15625 ==1s
5
        //TMR0 Überlauf ISR
6
        //3125== 0,2s
7
        clock_64us++;
8
        if (clock_64us >= 3125)
9
        {
10
            clock_64us = 0;
11
            clock_200ms++;
12
            if (clock_200ms >= 5)
13
            {
14
                clock_200ms = 0;
15
                clock_1s++;
16
                LED_AN;
17
                if (clock_1s >= 60)
18
                {
19
                    clock_1s = 0;
20
                    clock_1min++;
21
                }
22
            }else
23
                LED_AUS;
24
        }
25
        TMR0IF = 0;
26
    }

Im Quellcode sind schon einige Berechnungen, doch ich glaube ich habe 
mich orgendwo verhauen, denn die LED sollte ja zwischen 2 AN-Zyklen 
ziemlich genau 1Sek haben. Optisch nehme ich jedoch den 5-fachen Wert 
war.

Hier meine Rechnung im Detail:
8000000Hz = 0,000000125 /Sek

Da es sich beim Timer0 um einen 8bittigen handelt, den ich auf den 
Prescaler 2 eingestellt habe folgere ich:
8000000/256/2 = 15625 Überläufe /Sek

Oder anders "zähle bis 15625" und 1 Sek ist um
Da der Wert so schön durch 5 teilbar ist unterteile ich es noch Mal in
"zähle bis 3125" und 200ms sind um.

info:
1
volatile uint16_t       clock_64us = 0;
2
volatile uint8_t        clock_200ms = 0;
3
volatile uint8_t        clock_1s = 0;
4
volatile uint8_t        clock_1min = 0;

Wo habe ich mir den dicken Fehler eingehandelt?

main() sowie alle anderen Interrupts habe ich zu testzwecken geleert, so 
dass ein Interrupt Verschlucken ausgeschlossen sein sollte. Watchdog 
etc. sind ebenfalls alle aus.

Laut datenblatt läuft der Timer0 mit Fosc. Sollte das ein Fehler sein 
und er läuft tatsächlich nur mit FOSC/4?


Grüße Oekel

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.