Hallo zusammen,
ich werde hier seit Stunden nicht schlau.
Ich betreibe den tiny2313 mit 8MHz int.
Ich würde jetzt gerne einen Pin mit 40kHz togeln lassen.
Ich krieg einfach keine Formel hin, mit der ich das Problem lösen kann,
also den passenden Prescaler und den Wert, mit dem ich den Timer
vorbelegen muss, damit dieser 80000/sekunde mein Interupt auslöst.
Das muss ja auch ohne PWM gehen, oder nicht?
Kann mir bitte jemand von euch helfen und mir erklären, wie man sowas
ermittelt.
Trotz mehrerer Brichte im Internet komme ich nicht drauf.
Danke
Marc
Kenne die tiny nicht aber genauer als mit einem PWM Modus
(hardwareseitig) gehts nicht. Vorladen ist nicht so toll, gibts bei
denen kein FastPWM oder so wo man einfach den TOP Wert setzt?
Tiny hat nen Timer mit OutputCompare Funktion die ist dafür Ideal.
Du stellst den dann auf ClearOnCompare, Toggle Port on COmpare und schon
erzeugt er dir die Frequenz.
Ausrechnen kannst du das so:
Du hast die Taktfrequenz = X Mhz.
Die Teilst du durch den Vorteiler (z.B. 1024) was deine
TimerZählfrequenz ergibt also Y = X / Vorteiler.
Nun weißt du das dein Timer in einer Sekunde um Y erhöht wird.
Zusammen mit deiner gewünschten Frequenz kannst du dir jezt den
Comparewert ausrechen, nocheinmal durch 2 teilen (durch das toggeln
verdoppelt sich ja die Frequenz) und schon bist du fertig :)
Im Datenblatt ist mein ich aber auch ne Formel angegeben. Seite 99 in
meinem Datenbaltt was ich auf dem Rechner habe...
Hallo Läubi,
das klingt wirklich gut, aber hast du mal ein kurzes Beispiel, wie du
das mit "ClearOnCompare, Toggle Port on COmpare" meinst.
Ich komme das nicht zurecht, bzw. finde diese Befehle nicht unter
Bascom.
Wenn ich sogar "ClearOnCompare" in Google angebe ist die einzige Suche
Dein BEitrag hier ;o)
Wäre es möglich, ein Codeschnipsel reinzusetzen, wie der aus 8MHz 40kHz
macht?
Grüße
Marc
@spess53: Danke, aber CTC wird von Bascom nicht unterstützt
ja Bascom ist scheinbar nicht alles, wenn du wissen willst was ein Tiny
kann solltest du das Datenbank vom Tiny lesen, zur not musst du dann in
Bascom halt assembler einsetzen wenn es nicht anders geht.
CTC ist schon das richtige Stichwort, du mußt unter Bascom dan halt ggf
die Register per hand beschreiben. Soweit ich weiß kann man Assembler
befehle direkt in Bascom verwenden.
@Marc: Versuche dich davon loszulösen, was BASCOM unterstützt und lese
das Datenblatt und setze die Register händisch ohne über BASCOM
Funktionen zu gehen.
Marc schrieb:
> @spess53: Danke, aber CTC wird von Bascom nicht unterstützt
Das glaub ich nicht.
Die Option "CLEAR TIMER = 1" macht genau das: Wenn der Zählerstand einen
Compare A Match auslöst, wird der Timer auf 0 zurückgesetzt.
Wir nennen das CTC, weil es auch Atmel so nennt. BASCOM benutzt manchmal
einfach nur eigene Begriffe. Die Funktionalität ist aber dieselbe.
Hallo Marc!
Ich habe soetwas mal für einen ATmega8 gemacht.
Hier wird Timer1 im 16Bit-Modus verwendet.
Initialisierung:
'*** Timer 1 einstellen
'Vorteiler auf 1
Set Tccr1b.cs10
Reset Tccr1b.cs11
Reset Tccr1b.cs12
'Toggle OC1A on Compare Match
Reset Tccr1a.com1a1
Set Tccr1a.com1a0
'Waveform Generation Mode --> Mode 4; CTC
'WGM13 = 0
'WGM12 = 1
'WGM11 = 0
'WGM10 = 0
Reset Tccr1b.wgm13
Set Tccr1b.wgm12
Reset Tccr1a.wgm10
Reset Tccr1a.wgm11
Im Programm:
Ocr1ah = WertH
Ocr1al = WertL
Set Tccr1b.cs10 'CTC ein
Config Portb.1 = Output
Das komplette Programm findest du unter:
Beitrag "Melodieklingel BASCOM ATmega8"
Gruß
Guido
Hallo,
da die Rechnerei ja öfter auftritt...
Ich halte es bei CTC so:
Takt/ 2x Zielfrequenz 8000000/ 80000 = 100
Wenn es nicht ganzzahllig ist, geht es nicht genau auf die Frequenz.
Jetzt die 100 nacheinander durch die verfügbaren kleineren Prescaler
teilen, bis ein ganzzahliger Wert ruaskommt.
100/ 64 = 1,5.. is nicht
100 / 32
..
100 / 4 = 25 geht.
Prescaler 4, Counter auf 25-1 = 24, 8Bit-Counter reicht.
Geht am übersichtlichsten finde ich.
Gruß aus Berlin
Michael
Der 8bit Timer0 ginge auch dafür, laut Bascom Hilfe scheint er nicht
direkt unterstützt zu werden, muss also durch Beschreiben der
entsprechenden Register konfiguriert werden.