attiny861 und timer0

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • attiny861 und timer0

      Ich wollte auf die Schnelle eine Kurzzeituhr bauen, habe aber Probleme. Ähnliches, allerdings mit anderem MC und anderer Anzeige, habe ich schon mehr oder weniger problemlos zum Laufen gebracht. Jetzt bin ich ratlos und hoffe auf Eure Hilfe.
      Am BP-Anschluss der LCD-Anzeige soll eine Frequenz zwischen 50 und 100 Hz liegen. Den Timer habe ich deshalb für 62 Hz ausgelegt, gemessen werden aber ca. 7 Hz. Wenn ich den prescaler auf 64 verändere, bekomme ich ca. 28 Hz. Wo liegt mein Fehler?
      Wahrscheinlich sind noch andere Ungereimtheiten im Programm, aber vorerst komme ich ja nicht weiter.
      michl
      Dateien
      • kurzzeit.bas

        (3,35 kB, 10 mal heruntergeladen, zuletzt: )
    • michl schrieb:

      gemessen werden aber ca. 7 Hz.
      Da stimmt was mit deinem Systetakt nicht (Fuses) ??
      Wenn du, wie ich vermute, einen Quarz angeschlossen hast, und die DIV8 Fuse ist gesetzt,
      kann es so sein. 1000000/8/256/63 = 7,75 . Das entspricht i.e. deinem Messwert.
      Ist zwar nur eine Vermutung, würde ich aber abchecken, ob die angegebenen 1MHz auch
      wirklich in deinem Controller tickern.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Vielen Dank.
      Dekaman: Die Fuses habe ich ausgelesen: RC-Oszi=8 MHz, Div=8 gesetzt. Also müssten 1 MHz Systemtakt stimmen.
      dlmsc: Bisher hatte ich nie die Timervorgabe in der Sub angegeben, aber das sagt natürlich nichts. Ich werde den Vorschlag gleich ausprobieren ->
      Jetzt erhalte ich 30 Hz, auch wenn ich die Konstante zwischen 2 und 8 ändere. Habe ich eventuell beim ADC etwas falsch gesetzt, was hier Einfluss hat? Den attiny861 benutze ich das erste Mal.
      michl
    • @michl
      Wenn Fuses und Frequenz stimmen, bleibt eigentlich nur noch dein Programm übrig.
      Ganz langsam zum mitschreiben.
      $crystal = 1000000 : Also 1MHz Taktfrequenz
      Config Timer0 = Timer , Prescale = 256
      On Timer0 Takt
      Load Timer0 , 63
      Enable Timer0
      Timer0 ist als Timer configuriert und tickt mit 3906,25Hz (1MHz / 256)
      Nach 63 Takten löst der Timer einen Interrupt aus (ISR Takt)
      In der ISR togglest du den Pin (Portb.3 = Not Portb.3 )
      Dann springst du aus der ISR zurück.
      Der Timer hat in der Zwischenzeit schon wieder bei 0 mit zählen angefangen.
      Du hast ihm ja nicht gesagt, das er wieder bei 193 ( Load Timer0 , 63) anfangen soll.
      Also zählt der Timer0 jetzt immer bis 255 und löst dann den nächsten ISR aus.
      rein rechnerisch ist das dann so.:
      crystal / prescaler/ Timer ISR / Toggle
      1000000/256/256/2 = 7,63 Hz

      Du solltest also in der ISR Takt als erstes Load Timer0 , 63 eintragen.
      Dann ergibt sich folgende Rechnung: 1000000/256/63/2 = 31 Hz
      Du siehst, es ist nur die halbe Frequenz. Entweder Load auf 31 verringern,
      oder einen anderen Prescaler verwenden.
      Das überlasse ich jetzt dir.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • @'Dekaman
      jetzt habe ich in der ISR "load timer0, 63" als serste Zeile eingesetzt und bekomme 126 Hz. Also habe ich den Wert auf 126 verdoppelt und die Fequenz stimmt. Das "load timer0, 63" am Anfang habe ich ganz weggenommen. Das würde ja bedeuten, dass der Timer nicht bei 193 beginnt, sonder bei 130?
      Ich gestehe, dass das für mich nicht nachvollziehbar ist. Ich habe bestimmt schon über 10 Schaltungen gebaut, allerdings mit anderen MCs, in denen der Timer als Taktgeber arbeitete und stets nur unter der config-Zeile "load timer0, x" eingesetzt. Und immer ging es.
      Vielen Dank für die Unterstützung.

      michl
    • michl schrieb:

      in denen der Timer als Taktgeber arbeitete und stets nur unter der config-Zeile "load timer0, x" eingesetzt. Und immer ging es.
      Das Load Timer0, xx musst du immer noch in der ISR oder auch an einer anderen Stelle (wenn der Timer unterschiedliche Werte haben muss) im Programm einfügen, sonst läuft der Timer nur einmal mit dem vorgeladenen Wert und danach zählt er immer von 0 - 255.
      Jeder Timer zählt ja von 0 - 255 oder von 0 - 65536 (Timer1) und nach einem Durchlauf fängt er von vorne an. Wenn du jetzt einen Timer vorlädst zählt er ab dem vorgeladenen Wert bis zum Ende und würde dann ohne erneutes vorladen wieder bei 0 beginnen.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Es könnte aber der ctc- modus gewesen sein. Da wird nur der compare-Wert einmalig angegeben. Wenn es dann so eingestellt wurde, dass der timer bei Erreichen automatisch bei 0 wieder beginnt, dann verhält es sich so.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------