- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 19

Thema: Timer1 ISRs Genauigkeit

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #10
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Bin für Kritik natürlich offen.
    Ok, dann lege ich mal los.

    * Warum ist i ein uint32_t? uint8_t würde reichen.

    * Warum das uint32_t bei prescale[]? uint16_t würde reichen.
    (wenn du das änderst, muss aber auch die Zeile der nenner-Berechnung geändert werden)

    * Warum ist prescale[] eine automatic- und keine static-Variable?

    * Wozu soll die Funktion round() da gut sein? "16000000/nenner" ist eine Integer-Division und hat immer ein ganzzahliges Ergebnis. Da gibt es für round() rein gar nichts zu runden.

    All diese Punkte produzieren keinen Fehler, drücken aber auf die Performance. Was allerdings ein Fehler ist, ist dass du bei der OCR-Berechnung für den CTC-Modus ein "-1" vergisst.

    Noch was: Du scheinst 0 für "Erfolg" und 1 für "Fehler" zu verwenden. Das finde ich etwas ungeschickt, weil es genau entgegen der boolschen Logik ist (0 = False, 1 = True). Ich würde auch nicht den Prescaler-Wert speichern, sondern den Index, denn den kann man im restlichen Code dann direkt verwenden.

    So in etwa würde die Funktion bei mir aussehen:
    Code:
    uint8_t autodetect (uint8_t *ocr, uint8_t *pre, uint16_t freq) {
     
        static uint16_t prescale[] = {1,8,32,64,128,256,1024}; //mögliche  Values für Timer2 lt Datenblatt...
    
        for (uint8_t i = 0; i < 7; i++) {
            uint32_t nenner = 2UL * prescale[i] * freq;
            if (nenner >= (F_CPU/256)) {
                *ocr = ((F_CPU+(nenner/2)) / nenner) - 1;
                *pre = i + 1;
                return 1;
            }
        }
    
        return 0;
    }
    Und im restlichen Code dann:
    Code:
        uint8_t prescaler_index;
        uint8_t ocr_value;
        if (!autodetect(&ocr_value,&prescaler_index,isr_frequency))
            return 0;
        TCCR2 |= (prescaler_index<<CS20);
        OCR2 = ocr_value;
    Geändert von sternst (08.04.2011 um 01:04 Uhr)
    MfG
    Stefan

Ähnliche Themen

  1. Positionierung Genauigkeit <1mm
    Von thomas0906 im Forum Sensoren / Sensorik
    Antworten: 17
    Letzter Beitrag: 08.06.2009, 20:39
  2. Timer 1 Genauigkeit
    Von asunn im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 27.06.2008, 22:51
  3. GPS-Kompass - Genauigkeit?
    Von Jon im Forum Elektronik
    Antworten: 13
    Letzter Beitrag: 10.04.2008, 23:13
  4. Genauigkeit der Int RC Oszialtoren
    Von The Man im Forum Assembler-Programmierung
    Antworten: 7
    Letzter Beitrag: 10.04.2008, 21:22
  5. Genauigkeit von Profilen...
    Von sonic im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 13
    Letzter Beitrag: 25.06.2004, 12:15

Stichworte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress