ATTiny85 Timer CTC kommt scheinbar nicht mit

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • ATTiny85 Timer CTC kommt scheinbar nicht mit

      Hallo Gemeinde,

      ich versuche eigentlich etwas sehr einfaches (dachte ich zuerst).
      Für einen Mischer brauche ich eine Oszillatorfrequenz von ca. 8,7 kHz, Rechteck genügt.
      Ich dachte, ich nehme einen ATTiny85 (davon habe ich einige hier) und schreibe in kleines Programm das den Timer0 im CTC-Mode nutzt.
      Hier mal der Code:

      BASCOM Source Code: Rechteckgenerator

      1. ' Dieses Programm soll 8,7kHz am PortB.0 erzeugen.
      2. ' Timer0 im CTC-Mode
      3. $regfile = "ATTiny85.dat"
      4. $crystal = 1000000
      5. $hwstack = 32
      6. $swstack = 10
      7. $framesize = 10
      8. Config Portb.0 = Output 'Ausgang
      9. Config Timer0 = Timer , Prescale = 1 , Clear Timer = 1
      10. Ocr0a = 119 ' Frequenz wird hier eingestellt
      11. On OC0A ISR_Timer0_OC0A ' OC0A-Interrupt konfigurieren
      12. Enable OC0A ' OC0A-Interrupt zulassen
      13. Enable Interrupts
      14. Do
      15. nop
      16. Loop
      17. ' ISR-Routine
      18. ISR_Timer0_OC0A:
      19. Toggle Portb.0
      20. Return
      Display All
      Ich habe es nicht geschafft, Frequenzen über ca. 4,3 kHz zu erzeugen.
      Nach einigen Versuchen ist mir aufgefallen, dass sich die Frequenz über den Wert Ocr0a im Bereich 119 bis 255 zwar ändern lässt, unter 119 ändert sich aber nichts mehr.

      Hat jemand eine Idee, woran das liegt bzw. was ich sonst noch machen könnte?
    • Hallo @Bastlbeda

      Ja das wird eng bei nur einem 1MH Takt, dass du per ISR-Routine die 8,7kHz heraus bekommst.

      Ich sehe da 2 Möglichkeiten, wie es klappen wird.

      1. Möglichkeit
      Die ISR mit NoSave konfigurieren und nur die Register sichern und wiederherstellen, die verändert werden.
      Welche Register das sind, das bekommt man mir dem Simulator raus.

      Alternativ das Toggeln in der ISR gleich per Assembler machen

      2. Möglichkeit (die bessere Variante)
      Anstelle der ISR kann man sich die Frequenz auch per Hardware erzeugen lassen.
      Ausgabe wäre dann an einem OCxx Pin.
      Dafür musst du den Timer mit Compare_A=Toggle konfigurieren. (Den Pin natürlich als Ausgang konfigurieren)
      Da der Pin dann nur toggelt, musst du die doppelte Frequenz per CTC einstellen.

      In deinem Fall OC0A = (1000000/8700/2) -1 = 56
      Die Ausgabe dann an OC0A-Pin.
    • SUPER!!! DANKE!!!

      Vorschlag 2 war die Lösung. Ist zwar sehr ungenau, aber mit herumspielen (Ocr0a = 58) komm ich dann auf schöne 8,770 kHz.

      Gleich die nächste Frage:
      Ich habe auch probiert, den ATTiny mit 8 MHz zu betreiben und wollte das eine Fusebit H (Divide clock by 8) ändern. Seit dem kann ich nicht mehr lesen oder beschreiben.
      Gibt´s irgendeine Schritt für Schritt anleitung für Idioten wie mich, wie man in Bascom die Fusebits setzt ohne den Controller gleich unbrauchbar zu machen?

      Ich habe nämlich vor, diesen Rechteckgenerator mit einem externen Quarz (3,93216 MHz) zu betreiben und dann mit Prescale 1 und CTC-DIV 226 laufen zu lassen. Damit käme ich auf quarzstabile 8,699,46 kHz.

      Ich trau mich jetzt aber nicht mehr ohne Hilfe an die Fusebits ran
    • Hallo @Bastlbeda
      Ich habs mal so für mich gelöst.
      Einstellbar über Poti

      BASCOM Source Code

      1. $regfile = "ATTiny85.dat"
      2. $crystal = 8000000
      3. $hwstack = 32
      4. $swstack = 32
      5. $framesize = 40
      6. Config Portb.0 = Output 'Ausgang
      7. Dim Analog as word
      8. Dim Timer_Vorgabe as Byte
      9. Config Adc = Single , Prescaler = Auto , Reference = AVCC
      10. Start Adc
      11. Config Timer0 = Timer , Prescale = 8
      12. On Timer0 Takt
      13. Enable Timer0
      14. ' Alle Interrups freigeben
      15. Enable Interrupts
      16. Timer_Vorgabe = 57
      17. ' Einmal aufrufen
      18. Gosub Takt
      19. Do
      20. Analog = Getadc(3)
      21. Analog = Analog/4
      22. Timer_Vorgabe = Analog
      23. Loop
      24. ' ISR-Routine
      25. Takt:
      26. Load Timer0 , Timer_Vorgabe
      27. Toggle Portb.0
      28. Return
      Display All
      Ist natürlich nicht so sicher wie direkt über die Hardware
    • Zu Post 12:

      An Pin5, also Portb.0, der ist ja der OCOA.
      Aber daran liegt es nicht. Bei dem jetzt funktionierendem Tiny kann ich immer wieder neu schreiben.
      Bei dem anderen habe ich nur das Fusebit gesetzt und noch kein Programm drauf geschrieben. Seit dem lässt er sich nicht mehr beschreiben
    • Wenn ich jetzt an deiner Stelle wäre, würde ich mal die Signale abprüfen und die Spannung VCC und die am Reset-Pin.
      Ob da alles ok ist.

      Wenn ja, bleibt ja nichts anderes als das ganze mir einem weiteren auszuprobieren.
      Ich würde dabei aber erst das Programm für die 8MHz ändern und dann rein spielen, und dann das Fise "Divide by 8" disablen.

      Noch ein Rat.
      Mach mal vor der Zeile "Config Portb.0 = Output" noch ein "Wait 1" rein.
      Das ist nur zur Sicherheit, damit der Programmer evtl nach einem handischen Reset noch reagiert.
    • Bastlbeda wrote:

      Kann es sein, dass die USBASP (Chinaware) die Fusebits nicht sauber schreiben können?

      Womit programmierst du?
      Ob die USBASP die Fises richtig setzen kann ich dir nicht sagen. Aber denkbar.

      Ich verwende hier gerne den Programmer von Mcselec. Der tut schon seit über 10 Jahre seinen Dienst ohne Mucken.
      Neuerdings habe ich noch dem AVR-ISP MK2 Pprogrammer, der mir auch gut gefällt.

      Mit den beiden Programmern hatte ich noch nie Schwierigkeiten, auch nicht mit Fusebits setzen/lesen etc.

      Aber aufpassen muss man immer wenn man an den Fuses was ändert.
      Vor allem, wenn verschiedene Fuses angesprochen werden.

      Ich pflege daher gerne immer erst das eine Fuse zu proggen, dann das 2.
      Nie beide auf einmal ändern und dann proggen lassen. Da hatte ich schon böse Überraschungen erlebt.
    • Mitch64 wrote:

      Wenn ich jetzt an deiner Stelle wäre, würde ich mal die Signale abprüfen und die Spannung VCC und die am Reset-Pin.
      Ob da alles ok ist.
      Ich denke, das kann ich auslassen. Ich tausche ja nur den Tiny. Bei dem anderen passt je alles

      Meinst du so?

      Source Code

      1. $regfile = "ATTiny85.dat"
      2. $crystal = 8000000
      3. $hwstack = 32
      4. $swstack = 10
      5. $framesize = 10
      6. Wait 1
      7. Config Portb.0 = Output 'Ausgang
      8. Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Toggle
      9. Ocr0a = 58 ' Frequenz wird hier eingestellt
      10. Do
      11. nop
      12. Loop
      Display All
      Das erst programmieren und danch das Fusebit setzen?