PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmel Mega128 & Timer1C als PWM Out im CTC mode



olby2
02.09.2008, 11:19
Hallo Leute,
ich komme einfach ohne eure Hilfe bei meinem Problem icht weiter.
Ich möchte den Pin B.7 als Ausgang mit einer variablen Frequenz belegen.

Ich möchte also den Timer 1, Ausgang C im CTC Modus betreiben, doch dieser mag nicht so wie gewünscht - der gleiche Pin mit dem 8bit Timer Timer2 funzt einwandfrei.




Config Portb.7 = Output
Config Timer1 = Timer , Prescale = T2prescale , Clear Timer = 1 , Compare C = Toggle ' 2. Achse
On Compare1c Compare_1c_int
Enable Compare1c ' Enable the use of Timer2
Start Timer1
Compare1c = 4200
Ocr1ch = 42
Tccr1a = &B00000100 ' Compare Output Mode for Channel C
Tccr1b = &B00001011 ' 256 precaler
Tccr1c = &B00100000
'###### Hauptprogramm
.
.
.
If Achse2 = Halt Then
'Start Timer1
'Disable Compare1c
Tccr1b = &B00001000

Porta.5 = 1
Porta.4 = 0

Else
Porta.5 = 0
Porta.4 = 1
Start Timer1
If Timer1reload > 30000 Then Timer1reload = 30000
If Timer1reload < 20 Then Timer1reload = 20
Compare1c = Timer1reload
Ocr1ch = Timer1reload
'Enable Compare1c
Tccr1b = &B00001011
End If
'###################
ISR Routine : nur zum Test , interrupt brauche ich eigentlich nicht.


Compare_1c_int:
Incr Test
Toggle Porta.1
Return




Ich habe schon die Register vom Timer3a ausgeleden ( derfunzt im CTC Mode ) und verglichen, die entsprechenden Änderungen gemacht

Tccr1a = &B00000100 ' Compare Output Mode for Channel C
Tccr1b = &B00001011 ' 256 precaler
Tccr1c = &B00100000


ich habe mittlerweile gelesen, dass der Timer1C nicht mit High-Level Code zu erreichen ist - hab auch schon in der def - Datei geschaut - stimmt wohl.

Ich mache wohl was in der Reihenfolge falsch oder nehme falsche Register.

vielen dank für eure Hilfe.

olby2

olby2
04.09.2008, 21:24
ich habe mittlerweile das Programm entkernt und auf das Wesentliche reduziert, doch das Problem hab ich noch nicht lösen können, habe aber versucht mit diesem Code zu erkennen was da passiert .
Der Timer1 zählt runter und bleibt bei 0 einfach stehen ?!



$hwstack = 64
$swstack = 64
$framesize = 64

$regfile = "m128def.dat"
$crystal = 16000000 'enter the used clock of your actual microcontroller
$baud = 38400

Dim Timer1reload As Integer
Dim Test As Integer

Config Portb.7 = Output ' ein paar LED´s zur Kontrolle

'Config Timer1 = Timer , Prescale = 64 , Compare C = Toggle ' 2. Achse
'On Compare1c Compare_1c_int
'On Ovf1 Overf_1_int
'Enable Compare1c ' Enable the use of Timer2
'Start Timer1

Tccr1a = &B00000100 ' Compare Output Mode for Channel C
Tccr1b = &B00001011 ' ctc Mode 4 , 64 * precaler
Tccr1c = &B00000000 'Bit 5 – FOCnC: Force Output Compare for Channel C
Etifr = &B00000001 'Bit 0 – OCF1C: Timer/Counter1, Output Compare C Match Flag
Etimsk = &B00000001 ' Bit 0 – OCIE1C: Timer/Counter1, Output Compare C Match Interrupt Enable

Ocr1ch = 42 ' capture Register high
Ocr1cl = 42 ' capture Register low


Config Timer3 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Toggle ' 1. Achse
'On Compare3a Compare_3a_int ' When Timer3 = Compare3A register
Enable Compare3a ' Disable the use of Timer3
Start Timer3
Compare3a = 500 ' Load the TimerLimit value into the Compare1A (OCR1A) register


Timer1reload = 2000
Enable Interrupts

Do
Ocr1ch = Timer1reload
'Compare1c = Timer1reload

Compare3a = Timer1reload

Decr Timer1reload


Print Chr(27) ; "[21;1H" ; " Timer1reload " ; Timer1reload ; " " ; Test
Print Chr(27) ; "[22;1H" ; "Tccr1a Tccr1b Tccr1c Ocr1ch Ocr1cl PwmXn Timer"
Print Chr(27) ; "[23;4H" ; Tccr1a ; " " ; Tccr1b ; " " ; Tccr1c ; " " ; Ocr1ch ; " " ; Ocr1cl ; " " ; Pwm1c ; " " ; Timer1 ; " "
Print Chr(27) ; "[24;4H" ; Tccr3a ; " " ; Tccr3b ; " " ; Tccr3c ; " " ; Ocr3ah ; " " ; Ocr3al ; " " ; Pwm3a ; " " ; Timer3 ; " "

Waitms 10


Loop

End

' interruptroutinen zum test
Compare_3a_int:
Incr Test
Toggle Porta.1
Return

Overf_1_int:
Incr Test
Reset Etifr.0
Toggle Porta.1
Return

Compare_1c_int:
Incr Test
Toggle Porta.1
Return


warum bleibt der Timer einfach stehen ?

kann mir jemand einen entscheidenden Tipp geben ?

vielen dank

olby2