Hi,
laut Datenblatt sollte der attiny861 einen 10bit-Timer/Counter1 haben.
Nur bekomme ich ihn beim besten Willen nicht dazu, weiter als bis 255 zu
zählen.
Ich habe den Code zu Testzwecken komplett abgespeckt, eigentlich zähle
ich nur noch (langsam) und gebe den Wert aus:
> CLKPR = (1<<CLKPS1)| (1<<CLKPS1);
Was soll da wirklich stehen?
Und wenn ich Ahnung von c hätte, wüsste ich, ob das funktioniert:
> uint8_t tmphigh;> tmp |= (tmphigh<<8);
der alte Hanns schrieb:>> CLKPR = (1<<CLKPS1)| (1<<CLKPS1);> Was soll da wirklich stehen?
Das ist eigentlich egal, so ist es nur 4x-Prescaler, warscheinlich
dachte ich mal an (1<<CLKPS0)|(1<<CLKPS1) für 8x-Prescaler. Der 4x war
aber genug um die Zahlen auf dem LCD lesbar zu bekommen.
der alte Hanns schrieb:> Und wenn ich Ahnung von c hätte, wüsste ich, ob das funktioniert:
Das funktioniert.
der alte Hanns schrieb:> Und wenn ich Ahnung von c hätte, wüsste ich, ob das funktioniert:>> uint8_t tmphigh;>> tmp |= (tmphigh<<8);
Da tmphigh nur 8 Bit hat, wird (tmphigh<<8) auch nur 8 Bit haben ;-)
Dietrich L. schrieb:> Moritz A. schrieb:>> Hier setzt Du CLKPCE:>>> CLKPR = (1<<CLKPCE);>> und hier löschst Du CLKPCE gleich wieder:>>> CLKPR = (1<<CLKPS1)| (1<<CLKPS1);
Ja, das gehört so.
> To avoid unintentional changes of clock frequency, a special write procedure> must be followed to change the CLKPS bits:> 1. Write the Clock Prescaler Change Enable (CLKPCE) bit to one and all other> bits in CLKPR to zero.> 2. Within four cycles, write the desired value to CLKPS while writing a zero to> CLKPCE.
Wieso schaut ihr eigentlich alle so genau auf das
Clock-Prescale-Register und nicht auf den eigentlichen Timer?
Werner M. schrieb:> der alte Hanns schrieb:> Da tmphigh nur 8 Bit hat, wird (tmphigh<<8) auch nur 8 Bit haben ;-)
Ich bin mir da nicht sicher, es könnte sein, dass << generell als int
ausgeführt wird. Moritz hat schon Recht, das funktioniert in der Praxis.
Wie es in der Theorie definiert ist, weiß ich nicht, da müsste man sich
mal durch den C-Standard wühlen...
The Timer/Counter Output Compare Register C contains data to be
continuously compared with Timer/Counter1, and a compare match will
clear TCNT1. This register has the same function in Normal mode and PWM
modes.
Folglich muss zu Beginn OCR1C auf $3FF gesetzt werden.
der alte Hanns schrieb:> The Timer/Counter Output Compare Register C contains data to be> continuously compared with Timer/Counter1, and a compare match will> clear TCNT1. This register has the same function in Normal mode and PWM> modes.>> Folglich muss zu Beginn OCR1C auf $3FF gesetzt werden.
Oh man, das ist aber echt gut versteckt.
Ich habe mich mal kurz gewundert, dass es zwar OCR1C gibt, aber keine
OC1C/!OC1C-Pins. Dass dieser entscheidende Fakt dann da so versteckt in
der Beschreibung drinsteht.
Danke für den Hinweis, so tut es. Und die erste Antwort war auch nicht
zu knapp, ich saß bloß nicht die ganze Zeit mit dem Finger auf F5 am
Rechner :)
Grüße
Moritz
> ich saß bloß nicht die ganze Zeit ...
Es war immerhin eine Stunde.
Kann der Compiler, in Analogie zu z.B. ADCW, nicht so etwas wie TCNT1W
bzw. OCR1CW?
der alte Hanns schrieb:> Kann der Compiler, in Analogie zu z.B. ADCW, nicht so etwas wie TCNT1W> bzw. OCR1CW?
Habe ich nichts gefunden, aber das ist ja auch etwas "komplizierter", da
es ja keine "16bit-Register" aus zwei 8bit-Registern sind, sondern bit
9+10 für alle Timer-Register aus TC1H gelesen werden, sobald das
Register beschrieben wird, bzw andersherum beim Lesen.
Aus diesem Grund müssen auch zB Interrupts, sofern die Routinen
ebenfalls TC1H verwenden, für den Zugriff deaktiviert werden – sonst
kann in TC1H ein falscher Wert stehen.
Moritz A. schrieb:> Habe ich nichts gefunden, aber das ist ja auch etwas "komplizierter", da> es ja keine "16bit-Register" aus zwei 8bit-Registern sind
Auch ein 16-Bit-Zugriff (der ja prinzipiell in Ordnung wäre, da die
oberen 8 Bits von TC1H unbenutzt sind) geht nicht, weil die beiden
8-Bit-Register nicht an aufeinanderfolgenden Adressen liegen.
Schon klar, die Frage war auch eher provokant gemeint, denn:
Da schrieb mir doch mal einer, man könne mit c einfach losrennen, wo
sich andere mit Assembler auf allen Vieren fortbewegten. Und nun bleibt
man doch an solchen HW-Nicklichkeiten hängen.
der alte Hanns schrieb:> Da schrieb mir doch mal einer, man könne mit c einfach losrennen, wo> sich andere mit Assembler auf allen Vieren fortbewegten. Und nun bleibt> man doch an solchen HW-Nicklichkeiten hängen.
Da wäre man mit Assembler aber genauso hängengeblieben ;)