Timer1 ist ein 10-Bit Timer/Counter, kann also bis maximal 1023 zählen...
Entweder Du setzt den Prescaler höher oder Du benutzt den 16-Bit Timer0.
Gruß,
askazo
Hallo,
Ich seh momentan das Problem nicht, evtl. kann mir mal jemand die Augen öffnen.
Ich habe einen Attiny861A mit 8MHz, ich benutze den Timer1 um eine Frequenz von 1 Hz zu erzeugen.
Leider läuft der Timer viel zu schnell. Was habe ich falsch gemacht?
-der Attiny861A wird von meinen mySmartUSB MK2 -Programmer als Attiny861 erkannt. (ohne A, lässt sich aber trotzdem beschreiben)
-im Chip habe ich 8Mhz ohne Teiler durch 8
-Timerwerte habe ich mit rnAVR berechnet. "Const Timervorgabe = 34286" will er nicht, ich muß die Timervorgabe als Word dimensionieren. (hatte ich auch noch nicht)
-mit Wait 1 passt das Timing Augenscheinlich
-macht Bascom einen unterschied zwischen Attiny861 und Attiny861A?
Hier mal mein Testcode:
Danke für Eure HilfeCode:$regfile = "attiny861.dat" $crystal = 8000000 $hwstack = 40 $swstack = 16 $framesize = 32 Config Timer1 = Timer , Prescale = 256 Config Pinb.4 = Output Led3 Alias Portb.4 Led3 = 1 On Timer1 Timer_irq 'Const Timervorgabe = 34286 'Fehler: Value doesn't fit into Byte Dim Timervorgabe As Word Timervorgabe = 34286 Enable Timer1 Enable Interrupts Do Loop Timer_irq: Timer1 = Timervorgabe Toggle Led3 'Wait 1 Return
mfG
Mario
Timer1 ist ein 10-Bit Timer/Counter, kann also bis maximal 1023 zählen...
Entweder Du setzt den Prescaler höher oder Du benutzt den 16-Bit Timer0.
Gruß,
askazo
Hallo askazo,
danke für deine Antwort.
mmmmh... ich dachte Timer1 ist der 16Bit Timer und Timer0 ein 8Bit Timer.
Hab im Datenblatt nur folgendes gefunden.
Also ist dann Timer0 der 16Bit Timer?• Peripheral Features
– One 8/16-bit Timer/Counter with Prescaler
– One 8/10-bit High Speed Timer/Counter with Prescaler
• 3 High Frequency PWM Outputs with Separate Output Compare Registers
• Programmable Dead Time Generator
mfG
Mario
Edit: mit Timer0 nimmt Bascom schonmal "Const Timervorgabe = 34286". Läuft aber immernoch viel zu schnell.
Code:$regfile = "attiny861.dat" $crystal = 8000000 $hwstack = 32 $swstack = 32 $framesize = 32 Config Timer0 = Timer , Prescale = 256 Config Pinb.4 = Output Led3 Alias Portb.4 Led3 = 0 Enable Timer0 On Timer0 Timer_irq Const Timervorgabe = 34286 Enable Interrupts Do Loop Timer_irq: Timer0 = Timervorgabe Toggle Led3 'Wait 1 Return
Geändert von dj_cyborg (29.07.2013 um 11:40 Uhr)
Kann es sein, dass Du nur das 22-seitige Datenblatt hast? Nimm mal die volle Prise (klick da). Und lies bei Kapitel 11 und 12.... ich dachte Timer1 ist der 16Bit Timer und Timer0 ein 8Bit Timer ... im Datenblatt nur folgendes gefunden ...
Ciao sagt der JoeamBerg
Deine Timerberechnung ist erstmal korrekt. Deine IRQ wird alle 1.09 sec aufgerufen. Jedenfalls theoretisch...
Was heisst denn der Timer läuft zu schnell? Wie schnell wird die IRQ aufgerufen?
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Hallo oberallgeier,
vielen Dank für deine Antwort und deinen Link.
Also wenn ich das richtig verstanden habe muß ich den Timer0 vom 8Bit-Mode auf 16Bit-Mode umschalten?!
Sowas hatte ich bis jetzt leider noch nicht. Es sind ja Codeschnipsel in C aufgeführt aber wie mache ich das in Bascom?
Danke
mfG
Mario
- - - Aktualisiert - - -
Hallo DanielSan,
Danke für deine Antwort.
also die ToggleLed leuchtet fast durchgehend. Bei 1Hz sollte sie ja gemütlich Blinken.
Der Timer0 scheint wohl beim Attiny861A ein paar Eigenheiten zu haben.
mfG
Mario
Hi Mario,
gern geschehen. Leider kann ich Dir mit Bascom nicht (weiter) helfen, ich schreibe meine Programme in C und Spuren von Assembler. Aber es wird sich schon jemand finden. Ich würde halt (in Bascom) versuchen, die Befehle von C nach B zu "übersetzten" - das MUSS gehen.
Ich will jetzt nicht für Dich die beiden Timerabschnitte durcharbeiten, aber es gibt sicher einen Timer der "per default" läuft. Und den könntest Du ja dann nehmen . . . . OHNE Verrenkungen.... muß ich den Timer0 vom 8Bit-Mode auf 16Bit-Mode umschalten ...
Übrigens: hast Du die CKDIV8-Fuse ausgeschaltet? ABER - bitte unbedingt davor den Abschnitt 6.2.7 Default Clock Source lesen - denn der tiny861A hat da ein paar Unartigkeiten eingebaut (wozu MUSST Du denn unbedingt diesen nehmen??)
Ciao sagt der JoeamBerg
Nein, brauchst nicht durcharbeiten hast mir schon sehr geholfen.
Ich werde jetzt wohl den 8Bit Timer nehmen, mal sehen ob er zu schnell für meinen Schrittmotor ist.
Bisher hatte ich nur MC's bei denen der Timer0 = 8Bit und der Timer1 = 16Bit waren, deswegen hatte ich mir darüber gar keine Gedanken gemacht.
Den Teiler hatte ich schon rausgenommen, das overclocking spielt denke ich nur bei niedriger Betriebsspannung eine Rolle. (<2,7V).
Da ich nicht im Besitz eines Oszilloskop bin, stelle ich gern zum Test den Timer auf 1Hz, um zusehen ob der grundsetzlich erstmal richtig arbeitet.
Danke nochmal
mfG
Mario
Im Datenblatt (S.76) stehen ja die Modes von Timer0. Der ist schonmal der richtige der kann auch 16-bit. Du musst das Register TCW0 auf 1 setzen. Wie man das in Bascom macht? Ehrlich gesagt gaaanz sicher bin ich mir nicht aber versuchs mal so:
Das rote hab ich hinzugefügt. Damit setzt du die Register manuell. Bascom kennt egtl nur Timer0 = 8bit, Timer1 = 16bit und Timer2 = 8bit.Code:$regfile = "attiny861.dat" $crystal = 8000000 $hwstack = 32 $swstack = 32 $framesize = 32 Config Timer0 = Timer , Prescale = 256 ' Timer0 konfigurieren Tccr0a = &B1000_0000 Tccr0b = &B0000_0101 Config Pinb.4 = Output Led3 Alias Portb.4 Led3 = 0 Enable Timer0 On Timer0 Timer_irq Const Timervorgabe = 34286 Enable Interrupts Do Loop Timer_irq: Timer0 = Timervorgabe Toggle Led3 'Wait 1 Return
Ich übernehme aber keine Verantwortung falls was schief geht!
Gruß Daniel
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Tausend Dank Daniel,
Jetzt Blinkt die Led deutlich langsamer .
Nur leider zu langsam die Led toggelt etwa im 5sekunden Takt
mfG
Mario
Lesezeichen