Mal in Code-Tags setzen...
Code:
;Projekt: Projekttiny 13 Datum: 13.04.2013
; Datei: CTC-MOD2-0A.asm
; Mode 2 = CTC (Takt nur für Outp. PB0=OC0A)
; je kleiner der Wert im Compare-Reg. OCR0A, je höher die Frequ.
; Beispiel: 1,2MHz / 2 x N x (1+OCR0A) = 1,2/202 = 5,94 KHz
; N = Prescale im Beispiel 1
; sichtbares Impuls- Pausenverhältnis über Skop immer 1:1
.include "tn13def.inc"
.def akku = r16
; Takt an PB0 (Pin OC0A) Periode = 0,168 ms
ldi akku,(1<<COM0A0) | (1<<WGM01)
out TCCR0A,akku
ldi akku,(1<<CS00) ; no Prescale
out TCCR0B,akku
.equ Wert=100 ; Wert für OCR0A | an PB0 (OC0A)
ldi akku,(1<<PB1) | (1<<PB0)
out DDRB,akku ; PB1+PB0 = Output
ldi akku,Wert ; Wert für OCR0A laden =100
out OCR0A,akku ; und in Output Compare Register A laden
loop: rjmp loop ; Endlosschleife
.EXIT
Soll ich das jetzt kommentieren?
Als WGM hast Du CTC bis OCR0A gewählt (der 8-Bit-Timer läuft dann also im single-slope, aber eben nicht mehr von 255, sondern von OCR0A auf 0 über.)
Als COM für Kanal A hast Du toggeln bei compare match gewählt (was auch dem Überlaufpunkt entspricht). Deswegen auch das Puls-Pause-Verhältnis 1:1.
Der Timer ist mit Vorteiler=1 an den Systemtakt gekoppelt, läuft also effektiv mit Systemtakt.
Je größer der Teiler, desto langsamer der Timertakt. Desto kleiner die effektive Timerfrequenz, und somit auch die effektive Überlauffrequenz. Klar.
Je größer der OCR0A-Wert, desto weiter muß der Timer bis zu (jedem) Überlauf zählen. Also sinkt auch da die Überlauffrequenz.
Das alles geschieht komplett im Hintergrund (abgesehen von der Initialisierung). Den Controller selbst schickst Du danach in eine leere Endlosschleife (der tut nix mehr). Interrupts sind auch keine aktiviert...
Im Eröffnungspost war ja noch das Auslösen eines Interruptes gefordert - da würde sich hier der Output Compare Match A Interrupt anbieten.
Da Du mit dem CTC keinen(!) PWM gewählt hast, läßt sich Kanal B so auch nicht als PWM verwenden (Du kannst den Pin eben beim compare match setzen/löschen/toggeln lassen (ok, in Software könnte man die jeweilige komplementäre Aktion beim Überlauf (in der ISR) ausführen lassen, aber das ist dann halt kein reiner Hardware-PWM mehr).
Analog zum CTC kann der frequenzkorrekte fast-PWM (bis OCR0A) verwendet werden. Das ist WGM=7. Dann kann Kanal B als PWM verwendet werden, OCR0A legt dann mit dem Prescaler die PWM-Frequenz (=Timerüberlauffrequenz) fest, OCR0B den dutyCycle. Nebenbei kann der OCR0A-Interrupt dann in festen Intervallen Interrupts (Zeitbasis für Dein Hauptprogramm) erzeugen (falls man sowas braucht).
Fragen?...->...Fragen!