Timer/Counter - G. Heinrichs´ Homepage

Download Report

Transcript Timer/Counter - G. Heinrichs´ Homepage

4. Attiny-Veranstaltung








Organisatorisches
Timer/Counter-Register
Zählen, Takten, PWM
Übung
Mittagspause
D/A-Wandler
Übung (auch: Komparator und A/D-Wandler)
Ergebnisse/Diskussion...
A
V 1.3 - Copyright 2010 by G. Heinrichs
Registermodell
Pin T0 nicht mit
Taster T0
verwechseln!
A
Drehzahlmesser
Unser Attiny soll
Drehzahlen ermitteln.
Dazu sollen Signale von
Lichtschranken oder
Tastern für 10 Sekunden
gezählt werden. Diese auf
1 Minute hochzurechnen
ist dann keine Kunst
mehr...
Zählen - konventionell
Enable INT0
Config INT0 = Falling
Enable interrupts
On int0 zaehlen
zaehler
PortD.6
Wait 10
PortD.6
Portb =
End
= 0
= 1
= 0
zaehler
zaehlen:
zaehler = zaehler + 1
return
(Signal an INT0)
(Zählbeginn anzeigen)
(10 s warten)
(Zählende anzeigen)
Zählen mit dem Timer/Counter
TCCR0B = &B00000110
Config
(externer
Timer0Takt
= counter,
über T0,
fallende Flanke,
edge = starten)
Falling
TCNT0 = 0
Timer0
(Zähler= des
0 T/C auf 0)
PortD.6 = 1
Wait 10
Portd.6 = 0
TCCR0B = 0
PortB = TCNT0
end
...
(Zählbeginn anzeigen)
...
(10 s warten)
...
(Zählende anzeigen)
Stop
(T/C Timer0
stoppen)
(stoppen)
PortB
(Zählerstand
= Timer0ausgeben)
(ausgeben)
...
TCCR0B
Bedeutung
&B00000110
Ext., fallende Flanke
&B00000111
Ext., steigende Flanke
&B00000000
T/C stoppen
A
Overflow-Interrupt
Unser Attiny soll bei jedem 10.
Signal also einen Alarm auslösen!
Overflow-Interrupt I
Overflow-Interrupt II
Tccr0b = &B00000110
Tcnt0 = 246
TIMSK.TOIE0 = 1
SREG.7 = 1
'ext. Takt, fallende Flanke, starten
'Preset!!! 10 Takte bis zum Overflow
'Overflow-Interrupt ermöglichen
'Interrupts global ermöglichen
On Ovf0 Alarm
'Wenn Overflow-Interrupt...
' Oder: On Timer0 Alarm
Do
loop
'Hauptprogramm
Alarm:
Tcnt0 = 246
Portb = 255
Waitms 10
Portb = 0
Return
'Interruptroutine
'Preset neu einstellen!
'Blitz!
Attiny als Signalgeber
Unser Attiny soll nun selbst
regelmäßige Signale
geben. Schleifen mit
Warte-Befehlen sind zwar
möglich, halten den
Mikrocontroller aber von
anderen Aufgaben ab.
Auch hier kann der
Timer/Counter helfen.
Interner Taktgeber
Taktgeber einstellen - Prescale
TCCR0B
&B00000000
&B00000001
&B00000010
&B00000011
&B00000100
&B00000101
&B00000110
&B00000111
Bedeutung
Timer0 anhalten
Timer0 = Clock
Timer0 = Clock/8
Timer0 = Clock/64
Timer0 = Clock/256
Timer0 = Clock/1024
Takt über T0, fallend
Takt über T0, steigend
Frequenzgenerator für 440 Hz
Portb.0 über TOV0-Interrupt toggeln
TOV0-Frequenz muss 880 Hz betragen
Systemfrequenz (Clock): 4 000 000 Hz
Wähle: Prescale = 64
Dann: Timerfrequenz = 4 000 000 Hz / 64 = 62 500 Hz
TCNT0 muss jeweils 62 500 / 880 = 71,02 Signale
bis zum Overflow zählen
Also: Preset = 256 – 71 = 185
A
PWM – Was ist das?
PulsWeitenModulation
PWM mit dem Attiny
Fast-PWM konfigurieren

Timer einschalten und Prescale wählen
 Vergleichswerte OCR0A und OCR0B eingeben
 Fast-PWM-Mode wählen (sorgt für Sägezahn-Kurve):
•
•
•

TCCR0A.WGM01 = 1
TCCR0A.WGM00 = 1
TCCR0B.WGM02 = 0
Reaktion einstellen
•
•
•
•
TCCR0A.COM0A1 = 1
TCCR0A.COM0A0 = 1
TCCR0A.COM0B1 = 1
TCCR0A.COM0B0 = 0
Das Pulsverhältnis wird
über den Vergleichswert
OCR0A eingestellt.
PWM - Programm
Tccr0a.wgm01 = 1
Tccr0a.wgm00 = 1
'PWM an OC0A (PortB.2)
Tccr0a.com0a1 = 1
Tccr0a.com0a0 = 1
Ocr0a = 200
Tccr0b = &B00000101
'FAST PWM
'Tccr0b.wgm02 standardmäßig auf 0
'Compare Match, clear OC0A at TOP
'erster Vergleichswert
‚Timer-Takt ist 4 MHZ/1024
Do
Inputbin Vergleichswert
Ocr0a = Vergleichswert
Loop
'Vergleichswert empfangen
A
D/A-Wandler
Ideen:
PWM an OC0A (Typ High  Low)
 Tiefpassfilter benutzen
 Sollspannung ~ Vergleichswert OCR0A

A/D-Wandler
Das
machen
Sie mal
selbst!
A