Hilfe bei Konfiguration von PWM bei Timer1

OP #2434909
Lesenswert?
• ▲
▼
Hallo,

ich möchte mittels Timer 1 zwei PWMs erzeugen.( µc läuft mit externem 8 
MHz Quraz).
Sie soll im modus WGM14 laufen.

Wenn ich das Datenblatt richtig verstanden hab funktioniert doch dieser 
Modus so, dass der Timer bis erreichen von ICR1 durchläuft. Bei 
erreichen von ICR1 wird dann noch ein Overflow flag gesetzt und der 
Timer beginnt bei "0". Während des inkrementieren vom Timer wird immer 
mit den Werten in
OCR1A bzw. OCR1B verglichen und bei erreichen wird je nach Konfigurtion 
entweder der PIN OC1A / OC1B auf low gelegt.
Das stimmt doch so oder?

Zu Testzwecken habe ich einfach eine LED an PIN PB1(OC1A) bzw. PB2(OC1b) 
geklemmt. Leider tut sich da garnix.



HIer mein C-Code:
1
volatile int pwm_period = 20000; // Variable zu Einstellung der PWM Periodenzeit ( in µs)
2

3

4

5
ISR (TIMER1_OVF_vect)
6
  
7
  {
8
    //Update der Compare Register für die PWM Erzeugung
9
  
10
      OCR1A = servo1_out;
11
      OCR1B = servo2_out;
12
  }
13

14

15

16
//Hauptschleife
17
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
18

19
DDRB |=(1<< PB1);  //Ausgang Servo Signal 1 ( OC1A)
20
DDRB |=(1<< PB2);  //Ausgang Servo Signal 2 ( OC1B)
21

22

23
// Konfig Timer1 für PWM
24
  
25
  TCCR1A &=~((1<<COM1A0)); // PIN OC1A auf low bei erreichen von OCR1A
26
  TCCR1A |=(1<<COM1A1);
27
  
28
  TCCR1A &=~((1<<COM1B0)); // PIN OC1B auf low bei erreichen von OCR1B
29
  TCCR1A |=(1<<COM1B1);
30
  
31
  TCCR1A &=~((1<<WGM10)); //WGM Mode 14 -> FAST PWM, TOP = ICR1
32
  TCCR1A |=(1<<WGM11);
33
  TCCR1B |=(1<<WGM12);
34
  TCCR1B |=(1<<WGM13);
35
  
36
  
37
  ICR1 = pwm_period; // PWM Periodendauer definieren
38
  
39
  
40
  TCCR1B &=~((1<<CS12)); // Prescaler 1/8 CPU Clock
41
  TCCR1A |=(1<<CS11);
42
  TCCR1B &=~((1<<CS10));
43
  
44
  TIMSK |= (1<<TOIE1); // Overlfow ISR erlauben
45
  
46
  OCR1A = servo1_out;
47
  OCR1B = servo2_out;
48

49

50
//+++++++++++++++++++++++++++++++++++++++++++++++++++++


Hoffe ihr könnt mir helfen, denn leider seh ich meinen Fehler nicht.
OP #2435102
Lesenswert?
• ▲
▼
Naja hab erwartet das die LEDS schwach leuchten.

Muss dazu sagen das die Variablen serv1_out / servo2_out mit 1500 
vorbelegt sind.

Demnach hätt ich meiner meinung nach ne pwm mit ti  =1500 µs , tp = 
18500µs , t-periode  = 20000µs.

Dies sollte ich mit meinem blossem auge sehen.
OP #2435138
Lesenswert?
• ▲
▼
M. H. schrieb:
> TCCR1B &=~((1<<CS12)); // Prescaler 1/8 CPU Clock
>   TCCR1A |=(1<<CS11);
>   TCCR1B &=~((1<<CS10));



Hallo!

So hab den Fehler gefunden.
Hatte das CS11 Bit im falschen Register gesetzt.

Unten seht ihr das richtige Register.

Nun leuchten auch meine LEDs :-).

1
TCCR1B &=~((1<<CS12)); // Prescaler 1/8 CPU Clock
2
TCCR1B |=(1<<CS11);
3
TCCR1B &=~((1<<CS10));

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.