Forum: Mikrocontroller und Digitale Elektronik Atmel Mega128 & Timer1C als PWM Out im CTC mode


von olby2 (Gast)


Lesenswert?

Hallo Leute,

ich stehe vor einem großen Problem, ich möchte gerne den PinB.7 (OC1c)
im CTC Modus mit Timer 1 nutzen.
Ich habe aber größte Probleme damit !

Auf Timer 3 , OC3a geht es einwandfrei.



ich habe versucht das Problem mit diesem Code vor Augen zu führen, da 
der Timer einfach stehen bleibt und seinen Dienst beim Überlauf versagt.

Timer1 bleibt einfach stehen?! spielen noch andere Register eine Rolle ?
Hab ich die Register in der falschen Reihenfolge gesetzt ?
Mir gehen nach mehreren Tagen an diesem Problem die Ideen aus.
Ich hoffe, Ihr könnt mir helfen.

Bascom AVR Code für den AVR Mega128 :
1
hwstack = 64
2
$swstack = 64
3
$framesize = 64
4
$regfile = "m128def.dat"
5
$crystal = 16000000                                         'enter the used clock of your actual microcontroller
6
$baud = 38400
7
8
Dim Timer1reload As Integer
9
Dim Test As Integer
10
11
Config Portb.7 = Output                                     ' PWM out
12
13
'Config Timer1 = Timer , Prescale = 64 , Compare C = Toggle ' 2. Achse
14
'On Compare1c Compare_1c_int
15
'On Ovf1 Overf_1_int
16
'Enable Compare1c                                            ' Enable the use of Timer2
17
'Start Timer1
18
   
19
20
21
Tccr1a = &B00000100                                         ' Compare Output Mode for Channel C
22
Tccr1b = &B00001011                                         ' ctc Mode 4 , 64 * precaler
23
Tccr1c = &B00000000                                         'Bit 5 – FOCnC: Force Output Compare for Channel C
24
Etifr = &B00000001                                          'Bit 0 – OCF1C: Timer/Counter1, Output Compare C Match Flag
25
Etimsk = &B00000001                                         ' Bit 0 – OCIE1C: Timer/Counter1, Output Compare C Match Interrupt Enable
26
27
Ocr1ch = 42                                                 ' capture Register high
28
Ocr1cl = 42                                                 ' capture Register low
29
30
31
Config Timer3 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Toggle       ' 1. Achse
32
'On Compare3a Compare_3a_int                                 ' When Timer3 = Compare3A register
33
Enable Compare3a                                            ' Disable the use of Timer3
34
Start Timer3
35
Compare3a = 500                                             ' Load the TimerLimit value into the Compare1A (OCR1A) register
36
37
38
Timer1reload = 2000
39
Enable Interrupts
40
41
Do
42
  Ocr1ch = Timer1reload
43
  'Compare1c = Timer1reload
44
45
  Compare3a = Timer1reload
46
47
  Decr Timer1reload
48
49
50
  Print Chr(27) ; "[21;1H" ; " Timer1reload       " ; Timer1reload ; "           " ; Test
51
  Print Chr(27) ; "[22;1H" ; "Tccr1a    Tccr1b  Tccr1c  Ocr1ch  Ocr1cl  PwmXn     Timer"
52
  Print Chr(27) ; "[23;4H" ; Tccr1a ; "       " ; Tccr1b ; "        " ; Tccr1c ; "       " ; Ocr1ch ; "      " ; Ocr1cl ; "      " ; Pwm1c ; "      " ; Timer1 ; "       "
53
  Print Chr(27) ; "[24;4H" ; Tccr3a ; "       " ; Tccr3b ; "        " ; Tccr3c ; "       " ; Ocr3ah ; "      " ; Ocr3al ; "      " ; Pwm3a ; "      " ; Timer3 ; "       "
54
55
Waitms 10
56
57
58
Loop
59
60
End
61
62
' interruptroutinen zum test
63
Compare_3a_int:
64
   Incr Test
65
   Toggle Porta.1
66
Return
67
68
Overf_1_int:
69
   Incr Test
70
   Reset Etifr.0
71
   Toggle Porta.1
72
Return
73
74
Compare_1c_int:
75
   Incr Test
76
   Toggle Porta.1
77
Return


vielen dank für eure Hilfe

cu
olby2

von Carsten (Gast)


Lesenswert?

Hallo Olby,

hast Du das Problem lösen können?

Habe das gleiche Problem mit einem ATMEGA8 mit dem  Timer1 (16 bit) und 
kommen schon seit Stunden nicht weiter :-(((.

Der Timer1 funktioniert im Fast-PWM- aber nicht im CTC-Mode. Eigentlich 
sollte der Counter doch zählen, sobald er über die 
TCCR1-Register-Einstellungen einen Takt erhält, oder? Das funktioniert 
im CTC-Mode irgendwie nicht dauerhaft.


--> Hat schonmal jemand im CTC-Mode ein PWM-Signal erzeugen können???
Ich wäre für einen Codebeispiel sehr dankbar.

Gruß
Carsten

von Carsten (Gast)


Lesenswert?

Hallo,

mein Problem ist gefunden. Es lag am Compiler, der unter bestimmten 
Umtständen anstandslos defekte hex-Files produziert hat, mit denen der 
uC nicht gearbeitet hat 8-o.

PWM im CTC-Mode ist beim ATMEGA8 unkritisch. Folgende Zeilen genügen, um 
an PB1 ein PWM-Signal zu erhalten:


void main(void)
{
  DDRB = 0xFF; // Output PWM
  TCCR1A |= (1<< COM1A0);
  TCCR1B |= (1<< WGM12) | (1<<CS11);
  OCR1A = 0x00FF;
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.