PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CTC Mode



Thorsten
21.09.2006, 18:52
Hi,

so langsam bin ich hier am Verzweifeln, wahrscheinlich
hab ich irgendwo im Datenblatt was überlesen.
Hier meine Aufgabenstellung:

Ich möchte mit einem Mega8 einen 56kHz Takt mit
Timer1 im CTC Mode erzeugen.

Also hab ich folgendes eingestellt:


/* "Toggle OC1A on Compare Match"*/
TCCR1A = (1<COM1A0);
/* kein Prescaler, der Counter wird mit vollen
Prozessortakt betrieben und CTC Mode aktivieren */
TCCR1B = (1<<CS10) | (1<<WGM12);
OCR1A = 1000;


PB1 ist auch auf Ausgang gestellt. Wenn ich den Interrupt
TIMER1_COMPA_vect in TIMSK aktiviere kommt der Interrupt auch vernüftig und ich kann in diesem den
Pin Togglen, aber das sollte so doch auch automatisch gehen.

vielen Dank schonmal für die Hilfe
Thorsten

edit: Die 1000 sind natürlich zu viel, hab ich erstmal zum
Testen eingestellt.

Kaiser-F
21.09.2006, 20:26
Meines Wissens nach geht das bei CTC-Mode nicht...
CTC ist nur für "interne" Anwendung gedacht...

Wenn der OCR1A oder so angesteuert werden soll, dann musst einen
PWM-Mode wählen.

Thorsten
21.09.2006, 20:37
Hi,

Tabelle 36 auf Seite 97 im Datenblatt sagt eigentlich das es gehen sollte,
oder hab ich das Falsch verstanden?
Ich probier mal nen Pwm Mode.

mfg
Thorsten

robocat
21.09.2006, 21:23
ich hatte neulich ein ähnliches problem, allerdings in assembler und mit 33kHz. wenn du es dir umstrickst auf c dürft es aber gehen:

.NOLIST
.INCLUDE <m8def.inc>
.LIST


; MCU Takt für diverse Berechnungen festlegen
.equ tosc = 1000000

; Ausgabefreq festlegen
.equ fout = 33000

; Timer 1 Ladewert
.equ ladewert = (tosc / (2 * fout)) - 1

.CSEG
.org 0


; Interupt Vektoren
rjmp init ; Reset Handler
reti ; IRQ0 Handler
reti ; IRQ1 Handler
reti ; Timer2 Compare Handler
reti ; Timer2 Overflow Handler
reti ; Timer1 Capture Handler
reti ; Timer1 CompareA Handler
reti ; Timer1 CompareB Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART RX Complete Handler
reti ; UDR Empty Handler
reti ; USART TX Complete Handler
reti ; ADC Conversion Complete Handler
reti ; EEPROM Ready Handler
reti ; Analog Comparator Handler
reti ; Two-wire Serial Interface Handler
reti ; Store Program Memory Ready Handler


init:
ldi r16, high(RAMEND); Stackpointer initialisieren
out SPH, R16
ldi r16, low(RAMEND)
out SPL, R16

ldi r24, 255
out DDRB, r24 ; Port B als Ausgang
out DDRD, r24 ; Port D auch
out PORTC, r24 ; Pullups von Port C aktivieren
; (-> damit hat dieser einen definierten Pegel
; und nicht osziliert sinnfrei rum)




ldi r17, (1<<COM1A0) ; Timer 1 konfigurieren (Mode 4 -> CTC)
ldi r16, (1<<WGM12)|(1<<CS10)
out TCCR1A, r17
out TCCR1B, r16

ldi r16, high(ladewert)
out OCR1AH,r16
ldi r16, low(ladewert)
out OCR1AL,r16


; in r16, TIMSK ; Diese auskommentierten Zeilen sind hier unnötig,
; ori r16, (1<<OCIE1A) ; ich habe sie nur drinne gelasen um zu zeigen,
; out TIMSK, r16 ; wie ich es machen würde

sei ; Interrupts aktivieren
loop: ; hauptschleife
ldi r24, 160
out PORTD, r24

ldi r24, 0
out PORTB, r24 ; PD5+6 auf HIGH

ldi r17, 0x09 ; delay loop, 1Hz
WGLOOP0:
ldi r18, 0xBC
WGLOOP1:
ldi r19, 0xC4
WGLOOP2:
dec r19
brne WGLOOP2
dec r18
brne WGLOOP1
dec r17
brne WGLOOP0
nop

ldi r24, 64
out PORTD, r24 ; PD5+6 auf HIGH

ldi r24, 1
out PORTB, r24 ; PD5+6 auf HIGH

ldi r17, 0x09 ; delay loop, 1Hz
WGLOOP3:
ldi r18, 0xBC
WGLOOP4:
ldi r19, 0xC4
WGLOOP5:
dec r19
brne WGLOOP5
dec r18
brne WGLOOP4
dec r17
brne WGLOOP3
nop

rjmp loop
in der hauptschleife werden jeweils 2 ports für eine sekunde geschalten, derweil erzeugt OC1A ( am atmega 8 ) ein 33kHz signal.

vielleicht hilfts..(mir hat damals "Hanni" geholfen)

gruesse von der katze

Thorsten
21.09.2006, 21:38
Hi,

ja das Hilft mir schon weiter, die Timerregister konfigurierst du ja
genauso wie ich. Morgen werde ich wohl mal einen anderen Prozessor und
mal ein minimal Assembler Programm testen, nicht das da noch irgendwo im
C-Code was schiefläuft, aber alles andere geht ja. Mal abwarten.
Zumindest weiß ich das es so gehen muss.

Vielen Dank
Thorsten

Kaiser-F
22.09.2006, 10:44
HI,
OK ich hab mich getäuscht, sorry... Aber eine Frage, hast du den
entsprechenden PIN als Ausgang geschalten?

Thorsten
22.09.2006, 11:55
Jup, der ist als Ausgang geschaltet, wie gesagt wenn ich den zugehörigen
Compare Match Interrupt aktiviere gehts auch, nur nicht automatisch. Aber
genau das möchte ich gern.
Ich werd sobald ich heut Abend zu Hause bin mal das Miniprogramm probieren,
wenn das nicht geht mach ich das ganze halt im Interrupt.

mfg
Thorsten