- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 19

Thema: Timer1 ISRs Genauigkeit

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Was genau meinst du mit "Preloader neu gesetzt"? Wenn du den Timer "von Hand" vorlädst, hast du eh nur durch Glück einen genauen Zeitabstand zwischen den Interrupts. Benutze den CTC-Mode.
    MfG
    Stefan

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wie schon gesagt, besser ist der CTC Modus. Mit Preload in der ISR kriegt man nur gleichmäßige Zeiten, wenn man einen hohen Prescaler hat. Mit 2 ISRs muss der Prescaler für eine ISR und den Anfang der anderen reichen. Da wird dann auch ein Prescaler von 64 schon knapp, bei 256 als Prescaler sollte es aber reichen.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    Hi,

    okay, also ich habs jetzt geschafft den T1 im CTC modus alle Sekunde in den Compare Match Vector springen zu lassen.

    Den anderen Timer (T0) betreibe ich bisher noch "klassisch" über den Überlauf. Der T0 funktioniert aber nur dann, wenn ich den T1 unkonfiguriert lasse.

    Gibt's dafür irgendeinen Grund wieso T1 im CTC Modus die anderen Timer affektiert?

    Merci,
    Simon

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    Hab den "Fehler" gefunden. Offensichtlich muss man den Timer, der im CTC Modus laufen soll in der Reihenfolge vor jenen Konfigurieren, die "normal" laufen. Verstehe ich zwar nicht aber das hat das Problem irgendwie gelöst...
    Ciao,
    Simon

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Offensichtlich muss man den Timer, der im CTC Modus laufen soll in der Reihenfolge vor jenen Konfigurieren, die "normal" laufen.
    Ne, muss man nicht.
    Du hast einen Fehler in deinem Code. Da du den ja aber nicht zeigst, kann ich dir auch nicht sagen welchen genau. Aber wenn ich raten soll, würde ich sagen, dass sich die beiden Timer ein Interrupt-Enable-Register teilen, und du bei der Konfiguration des einen Timers dieses mit einem "=" beschreibst, und beim anderen mit einem "|=".
    MfG
    Stefan

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    Hi,
    alles klar.
    Stimmt, Code sollte ich mal posten. Werde ich heute Abend nachholen, sorry.
    Besten Dank soweit,
    Simon

  7. #7
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    Hi,
    etwas verspätet, aber trotzdem. Ihr hattet Recht, es lag am Code und einer fehlenden Veroderung im TIMSK-Register. Jetzt geht's:
    Code:
       //Timer0 so Langsam wie möglich
       TCCR0 |= (1<<CS02) | (1<<CS00); //Prescaler=1024
       TCNT0 = 0;
       TIMSK |= (1<<TOIE0);
    
      //timer 1 auf sekundentakt
      TCCR1B = ( (1 << CS12) | (1 << CS10)| (1 << WGM12) ); // Prescaler auf 1024 und CTC mode akivieren
      OCR1A = 15625; // wert für 1s vorladen 
      TIMSK |= (1 << OCIE1A) ; // Output Compare Interrupt aktiveren
    Ich habe eine andere Frage, und zwar kann ich den Timer2 ja ebenfalls im CTC Modus laufen lassen. Jetzt ist es so, dass ich Frequenzen im Bereich von 60Hz bis 10kHz rausgeben möchte. Der AVR ist mit einem 16MHz Quarz getaktet. Ich dachte Anfangs, ich könnte das einfach so realisieren:
    Code:
      //setze Timer2 in den CTC Modus und lasse jede µs ISR auslösen.
      TCCR2 |= (1<<CS20) | (1<<WGM21);      // Prescaler von 1 | CTC-Modus
      OCR2  = 8;                              // Vergleichswert für 1µs Periode
      TIMSK |= (1<<OCIE2);                   // Interrupts aktivieren und damit Timer starten
    Im ISR Vector hatte ich dann vor, den Port immer wenn eine gewisse Periode erreicht wurde zu togglen:
    Code:
    ISR(TIMER2_COMP_vect) 
    {
        T2count++;
        if (T2count == T2period)
        {
          MOT_A_PORT ^= (1<<MOT_A_C_PIN);
          MOT_B_PORT ^= (1<<MOT_B_C_PIN);
          T2count = 0;
        }
    }
    Nachdem ich das ausprobierte ging das zwar, aber mir fiel auf, dass egal was ich für einen Wert in OCR2 schreibe, ich keinen Einfluss habe. Nach Überlegungen bin ich drauf gekommen, dass es sein kann, dass alles quasi zu schnell läuft, sprich viele ISRs verschluckt werden, da die Ausführung und Einsprung in die ISR ja wieder Zyklen kostet.
    Deswegen wollte ich mir diese Form der Realisierung abschminken. Hättet ihr einen klugen Lösungsansatz, mit dem ich quasi ausgehend von der gewünschten Frequenz den passenden Prescaler und Vorladewert quasi "autodetecten" lassen könnte? (Die Formeln zur Berechnung aus dem Datenblatt kenne ich, aber das Ganze kam mir zu unelegant vor...)

    Besten Dank,
    Simon

Ä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
  •  

Labornetzteil AliExpress