Atmel Mega128 & Timer1C als PWM Out im CTC mode

Gast #976686
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
Gast #1015872
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
Gast #1018657
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;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren