• Hallo TT-Modellbahner, schön, dass du zu uns gefunden hast.
    Um alle Funktionen nutzen zu können, empfehlen wir dir, dich anzumelden. Denn vieles, was das Board zu bieten hat, ist ausschließlich angemeldeten Nutzern vorbehalten. Du benötigst nur eine gültige E-Mail-Adresse und schon kannst du dich registrieren.
    Deine Mailadresse wird für nichts Anderes verwendet als zur Kommunikation zwischen uns.
    Die Crew des TT-Boardes

AVR und die Timer

flicflac

Foriker
Beiträge
894
Reaktionen
1 1
Ort
Minden / NRW
Ich mal wieder an die µC Experten.
Nun habe ich mich an mein Frustthema Timer gewagt und versucht mit einfachen Mitteln diesen Wirrwar zu begreifen.

Frage hat sich erledigt, man sollte Timer 0 und Timer 1 nicht mischen :baseball: :baseball:

Mein Angebot bleibt...

Zwei Kisten Pils gäbe ich demjenigen der mir Timer und PWM begreiflich macht.


THX
flic
 
Ich würde mir erst mal das entsprechende Datenblatt von Atmel's Seite besorgen und aufmerksam studieren, dazu, falls verfügbar, das entsprechende User Tutorial. Ich selbst habs nicht so mit den AVR, bin eher 51er. Aber das ist wohl wie Glaubensfreiheit....
 
Ich nehme an, du hast dir das AVR-GCC Tutorial schon durchgelesen, oder? Wenn nicht, 'Timer' als Filter setzen, und du bekommst drei Artikel zum Thema. Vielleicht helfen sie dir weiter.
Zusatz: Hier gibts auch ein paar Informationen in deutsch.


Thorsten
 
flic:
Es gibt zwei (drei beim 16Bit-Timer) Timerregister in denen Du einstellen kannst in welchem Modus der Timer laufen soll. (ob als Timer oder als Counter oder für PWM)
Grob gesagt zählt der Timer bei Phasenkorrekter PWM (am einfachsten zu realisieren) mit vorgegebener Frequenz hoch. Beim Überlaufen des Timercounterregisters beginnt der Timer von &hFF (255) auf &h0 (0) runter zu zählen, dann gibts wieder ein Flag und das Teil zähl erneut auf &hFF hoch und so weiter und so fort.
Das sähe in einem Diagramm etwa so aus

&hFF
/\/\/\/\/\
&h0

In einem weiteren Register stehen die Werte bei denen die Hardware-PWM den Pin des Timers einfach nur umschaltet. Da der Timer immer hoch und runter zählt ergibt sich im Bezug auf das oben stehende "Diagramm" eine Phasenkorrekte PWM.
Fang am besten mit dem Timer0 an und arbeite Dich stück für Stück durch die Bedienungsanleitung der AVR. Das ist etwas mühselig, bringt aber was.
Mir fehlt im grad die Zeit um das Dir etwas ausführlicher zu beschreiben.
Das feine an der Hardware-PWM ist das man mittem im Programmablauf die Werte für die PWM ohne eine Interrupt- oder Subroutine ändern kann. Der neue Wert wird erst aktiv wenn der Timer erneut von &h0 nach &hff zählt.
In Dresden bist Du am 21.11. nicht zufällig beim Stammtisch anwesend? Das ganze ließe sich nämlich mit nem Laptop, einem STK500 (wenn's geht) und einem Oszi am leichtesten Erklären.

Tante Edit trägt Daten des Attiny2313 nach:
Das TimerCounterRegister0 TCNT0 vergleicht ständig seinen eigenen Wert mit denen der beiden OutptCompareRegister OCR0A und OCR0B. Bei einer Übereinstimmung zwischen TCNT0 und OCR0x wird das OutputCompareRegisterFlag OCRF0x gesetzt, löst damit (wenn aktiviert) beim nächsten Timerzyklus einen Interrupt aus und setzt sich danach automatisch zurück sobald die IRQ-Routine ausgeführt wird. Ähnlich läuft es bei der PWM nur das hier kein Interrupt ausgelöst, sondern der zum Register gehörende Pin umgeschaltet, ein oder ausgeschaltet wird. Eben je nachdem wie man die beiden unten beschriebenen TimerCounterControlRegister (TCCR0x) einstellt.
Wichtig für die Verwendung der Hardware-PWM sind folgende Register:

TCCR0A = &B0101--01 (an Stelle der Punkte müssen keine Werte festgelegt werden da sie intern überschrieben werden, vergessen darfste dir aber logischer Weise nicht, die ersten beiden Bit's legen die Art der PWM fest, hier &B------01 für Phasecorrect-PWM)
TCCR0B = &B00--0101 (die ersten 3 Bit (101) geben den Prescalerwert vor - hier fclk/1024)
OCR0A
OCR0B wie bei OCR0A die Werte reinschreiben die das Tastverhältnis der PWM festlegen - von 0/1 -> AUS = &B00000000 über 1/255 -> = &B00000001 bis 1/1 -> = &B11111111 geht alles.

Kannst Du im Falle des Attiny2313 alles im Datenblatt ab Seite 63 bis Seite 111 im feinsten technischen Englisch nachlesen und prinzipiell auf alle anderen 8-Bit AVR übertragen. :allesgut:
Es empfielt sich auch die Bezeichnungen und Funktionen der einzelnen Bit's in den Registern aufzuschreiben um die Übersicht zu behalten weil man sich sonst nen Wolf in der PDF rauf und runter scrollt. ;)
Die 16-Bit-Timer besitzen ein drittes TCCR und die OCR unterteilen sich in OCR1AH, OCR1AL, OCR1BH und OCR1BL (High, Low)
 
@E-Fan
Danke für deine Mühe. :respekt:
Im Moment kämpfe ich noch, werde aber bestimmt noch Fragen haben.
Dresden steht derzeit noch in den Sternen. Da spielen außer dem "Dabei sein wollen" leider noch die Faktoren Zeit, Kosten, Termine und family eine Rolle.
10 min Konversation wären bestimmt informativer als 10 Stunden Datenblatt studieren und verzweifeltes Probieren.

flic
 
Zeit? Du meinst Freizeit?
Was is'n das? :gruebel:
Falls Du überhaupt kein Land siehst versuchs mit der Bascom-Demo und wühl Dich durch folgende Befehle:

Config a as Byte
Config b as Byte
Config Port...

Config Timer...
Enable Timer...
Start Timer...


Do
OCR0A = a
OCR0B = b
inc a (a wird um eins vergrößert -> "Lampe" wird heller)
decr b (b wird um eins verkleinert)
waitms 100 (0,1s warten)
Loop

End


Ich müsst mich auch erst wieder reinfummeln, aber im Moment schaff ich es nicht (siehe Frage im zweiten Satz)
 
Zurück
Oben