Abendgruß, wollte den Timer1 eines ATTiny461, laut Datenblatt 10Bit_timer, mit ca.400 vorladen und bekomme die Fehlermeldung in Bascom, dass nur Byte-Werte zugelassen sind. Dass heißt bis max. 255! Darauf habe ich ein kleines Programm kreiert, um das mal auszuprobieren. Also Taktfrequenz 8MHz ohne Teiler (Divide Clock by 1), Prescaler = 1024 und im Interrupt des Timer toggle ich einen Ausgang. Dann bekomme ich eine Frequenz von 15,4Hz angezeigt! Das wäre bei mir dann ein 8Bit-Timer!?!? Liege ich da falsch? Danke im Vorraus
Irgendwie kommt mir das bekannt vor. Hatten wir nicht erst vor kurzem jemanden, der auf die gleiche Einschränkung von Bascom gestoßen war?
Ja, hatten wir so ähnlich: lässt sich umstellen 8 <-> 10 bit (aber keine Ahnung, wie unter Bascom): Accuracy: The Timer/Counter1 is a 10-bit Timer/Counter module that can alternatively be used as an 8-bit Timer/Counter. The Timer/Counter1 registers are basically 8-bit registers, but on top of that there is a 2-bit High Byte Register (TC1H) that can be used ... Beitrag "ATTiny461 Timer0 = 16Bit-Timer?"
Muss man die oberen zwei Bit nicht eh getrennt und vor den unteren acht in ein anderes Register schreiben? Das dürfte doch nicht von der Programmiersprache abhängen. Datenblatt: "To do a 10-bit write, the high byte must be written to the TC1H register before the low byte is written. For a 10-bit read, the low byte must be read before the high byte."
Ja, K. Hilde hat Recht, für Vergleiche (compare match) etc. muss TC1H geschrieben werden. Für TCNT1 gilt 'The Timer/Counter1 is realized as a 10-bit up/down counter'. Ganz simpel - Systemtakt/1024 /2 auf PB3 (in Assembler):
1 | sbi DDRB,3 ; OC1B |
2 | puti TCCR1A,(1<<COM1B0) ; toggle |
3 | puti TCCR1B,(1<<CS10) ; /1 |
Ok und danke, hatte ich nicht gefunden. Werde dann mal im Datenblatt mir speziell die Register vornehmen und es darüber versuchen! Danke und schönen Abend noch Theo
War leider falsch, brachte 15.7 kHz - nochmal, jetzt sind's (die gewünschten) 3.9 kHz:
1 | sbi DDRB,3 ; OC1B |
2 | puti TC1H,3 |
3 | puti OCR1C,255 |
4 | puti TCCR1A,(1<<COM1B0) ; toggle |
5 | puti TCCR1B,(1<<CS10) ; /1 |
Erläuterung, der Einfachheit halber Normal Mode: 'the counter counts from BOTTOM to TOP (defined as OCR1C) then restarts from BOTTOM'; 'initial value' von OCR1C ist 255 (0xFF), deshalb fehlte im ersten Beispiel der Faktor 4; durch das Setzen von TC1H auf 3 (0x03) wird TOP=1023 (0x3FF), folglich 1024 Zählschritte: 8.0 MHz / 1024 = 7813 kHz. Das 'toggeln' teilt nochmal durch 2, also: 3906 kHz.
Danke S. Landolt! Habe mir mal den Beitrag angesehen. D.h. der Timer0 könnte sogar ein 16Bit-Timer werden. Bascom schreibt normalerweise bei anderen Chips problemlos auch im Word-Format. Aber hier denke ich, muß man wohl die High- und Low-Bite-Variante verwenden und nur in den Registern.
K. Hilde meinte:
> Das dürfte doch nicht von der Programmiersprache abhängen.
Mag sein, aber wenn ich das hier sehe, frage ich mich, wie dieses
TC1H-Verfahren in Bascom abgebildet ist:
1 | On Timer0 Ontimer0 'Interrupt-Routine für Timer0 - Überlauf |
2 | Config Timer0 = Timer , Prescale = 1 |
3 | Enable Timer0 |
4 | Enable Interrupts |
5 | LED Alias Portb.0 |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.