- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: Timer Stoppuhr ist ungenau

  1. #11
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    Anzeige

    Praxistest und DIY Projekte
    wie das? wenn du angenommen 20 takte bräuchtest, um den irq aufzurufen, dann sind die 20 takte mit einem schnelleren takt viel schneller abgearbeitet, oder?

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Ja, aber die Timervorgabe stimmt dann auch nicht mehr.
    Wieviel schneller soll der Takt denn sein? Ist es nicht einfacher 20 Takte von der Timervorgabe abzuziehen?

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    Na das beim ändern der Taktfrequenz die timerwerte geändert werden müssen dürfte ja wohl klar sein, oder?

    irgendwo habe ich mal gelesen, wieviel takte Bascom braucht, um einen irq aufzurufen, ich glaube es waren 12 oder so. aber bei 16mhz stelle ich mit vor das das ziemlich lange dauern dürfte bis man die abweichung reel messen kann...

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Beiträge
    663
    Naja, ich habe aber ja 1 Mhz. Wenn er pro Sekunde 12 Takte abweicht, wären dass in 5min: 300 * 12 = 3600 Takte, naja gut - das sind noch nicht die 2 Sekunden ;-(

    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Nimm doch einfach einen anderen Wert für Timervorgabe.
    Änder den Wert etwa (+- ein paar hundert um zu sehen was passiert) und wenn du meinst jetzt läuft sie relativ genau, lass die Uhr eine Stunde laufen und überprüfe wie groß die Abweichung dan ist.

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Beiträge
    663
    Das hab ich schon gemacht Nur ich dachte vielleicht gibt es eine elegantere Lösung

    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Hallo die elegantere Lösung hat Dir schon der Sprinter genannt :

    Du betreibst Timer1 besser in einem anderen Modus:
    Clear Timer on Compare Match und bedienst nicht den Overflow-Interrupt, sondern den Compare Match Interrupt.

    Dadurch übernimmt die Hardware das Neusetzen von Timer 1 und nicht wie in deinem Beispiel die Software.
    Du verbrätst ja Zeit, bis du nach dem Interrupt wirklich dein Timer1-Wert neu schreibst.
    Gruß Sebastian

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Beiträge
    663
    Ja, hab noch nie von gehört oder so - hätte jemand Beispiel-Code?

    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

  9. #19
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    So würde es in C aussehen, ein paar defines fehlen, die aber selbsterklärend sind. Übersetzen nach BASIC verbleibt als Hausaufgabe

    Code:
    void timer1_init()
    {
    #if defined (__AVR_AT90S2313__)
        // Timer1 ist Zähler
        TCCR1A = 0;
        // Timer1 läuft mit voller MCU clock
        TCCR1B = _BV (CS10) | _BV (CTC1);
    #elif defined (__AVR_ATmega8__)
    	 // Mode #4 für Timer1 (Manual S. 97)
    	 // und volle MCU clock
        TCCR1A = 0;
        TCCR1B = _BV (WGM12) | _BV (CS10);
    #else
    #error Dont know how to setup timer1
    #endif
    
    	// PoutputCompare für gewünschte Timer1 Frequenz
    	OCR1A = (unsigned short) ((unsigned long) F_CPU / INTERRUPTS_PER_SECOND-1);
    
    	// OutputCompare-Interrupt für Timer 1
       TIMSK |= _BV (OCIE1A);
    }
    
    SIGNAL (SIG_OUTPUT_COMPARE1A)
    {
    }
    Disclaimer: none. Sue me.

  10. #20
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.02.2005
    Beiträge
    663
    Zitat Zitat von SprinterSB
    So würde es in C aussehen, ein paar defines fehlen, die aber selbsterklärend sind. Übersetzen nach BASIC verbleibt als Hausaufgabe

    Code:
    void timer1_init()
    {
    #if defined (__AVR_AT90S2313__)
        // Timer1 ist Zähler
        TCCR1A = 0;
        // Timer1 läuft mit voller MCU clock
        TCCR1B = _BV (CS10) | _BV (CTC1);
    #elif defined (__AVR_ATmega8__)
    	 // Mode #4 für Timer1 (Manual S. 97)
    	 // und volle MCU clock
        TCCR1A = 0;
        TCCR1B = _BV (WGM12) | _BV (CS10);
    #else
    #error Dont know how to setup timer1
    #endif
    
    	// PoutputCompare für gewünschte Timer1 Frequenz
    	OCR1A = (unsigned short) ((unsigned long) F_CPU / INTERRUPTS_PER_SECOND-1);
    
    	// OutputCompare-Interrupt für Timer 1
       TIMSK |= _BV (OCIE1A);
    }
    
    SIGNAL (SIG_OUTPUT_COMPARE1A)
    {
    }
    Na da hab ich ja was vor mir (hab keine Ahnung von C)
    Ich glaube aber, ich lasse den Code so, denn ich habe eben ein 7,3728 Quarz eingebaut um den AVR extern zu takten. Jetzt geht die Uhr so genau, dass man auf 5min keine Abweichungen "sehen" kann. Das reicht für meine Zwecke ja aus

    Gruß, Björn
    Nur tote Fische schwimmen mit dem Strom...

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests