PWM mit ATMega8

Gast #1689108
Hallo
Will mit meinem Atmega8 PWM verwenden! Nur funktioniert das bis jetzt 
nicht... Kann mir jemand sagen was ich hier falsch mache?
1
#include <avr/io.h>
2

3
int main(){
4
  DDRB = (1<<PB1);
5
  TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<WGM11) | (1<<WGM10); 
6
  TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS12);
7
  OCR1A = 0x00FF;  
8
  while(1){}
9
}
Was ich mir dabei denke:
-WGM müsste denn PWM mode auswählen
-COM ob das Signal inverted wird oder nicht
-CS den Prescaler
-OCR den TOP value
Falls etwas nicht stimmt verbessert mich bitte!
Hoffe ihr könnt mir helfen!
Gast #1689145
Hi

>ich hab gedacht für Channel A ist das OCR1A!?

Du hast im Mode15 nur einen PWM-Kanal. Dabei ist OCR1A der Höchstwert 
des Zählers (Top) und OCR1B der Compare-Wert. Wenn du 2 Kanäle haben 
willst, solltest du Mode14 nehmen.

MfG Spess
Gast #1689267
Hi

>ich muss nur noch meinen vergleichswert eintragen und der zählt dann
>quasi als hoch und runter?

Der muss aber kleiner als der OCR1A-Wert sein.

MfG Spess
Gast #1691553
OK aber was ist dann der Unterschied zwischen TOP und Compare value? ich 
hab gedacht beim TOP value wird immer die Spannung an OC1 gändert? 
Welcher Pin wird dann eig bei Mode 15 verwendet? OC1A oder OC1B?
Gast #1691566
Ich habs jetzt auch mal so versucht:
1
#include <avr/io.h>
2

3
int main(){
4
  DDRB = (1<<PB1);
5
  TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<WGM11) | (1<<WGM10);
6
  TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS12);
7
  OCR1A = 0xFFFF;  
8
  OCR1B = 0x00FF;
9

10
  while(1){}
11
}
funktioniert aber auch nicht...
#1691572
einsteiger schrieb:
> OK aber was ist dann der Unterschied zwischen TOP und Compare value? ich
> hab gedacht beim TOP value wird immer die Spannung an OC1 gändert?


Der TOP Wert (Top = Obergrenze) ist der Wert, bis zu dem der Timer 
zählt.

Für eine PWM brauchst du 2 spezielle Zählerstände. Bei einem der beiden 
wird der Pin auf 1 geschaltet, beim anderen auf 0.

Bei allen Fast-PWM Modi ist es so, das der eine spezielle Zählerstand 
der Übergang vom höchsten möglichen Timerwert auf 0 ist. Den andern 
speziellen Zählerstand gibst du in einem Register vor.

Der Timer zählt also laufend (jetzt nur als Beispiel)
1
  0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, ...

und während der Timer zählt, sorgt die PWM Logik dafür, dass der Pin 
entsprechend dem Zählerstand auf 0 oder 1 gesetzt wird. Hat dein 
Verrgl4eichsregister den zb den Wert 3, dann ergibt sich
1
  Timer: 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, ...
2
  Pin:   1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, ...

steht das Vergleichsregister auf 7, dann hast du
1
  Timer: 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, ...
2
  Pin:   1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, ...

wie du siehst, ist der Ausgang jetzt länger auf 1 als zuvor.
Mit dem Vergleichsregister legst du also fest, wie lange der AUsgang auf 
1 geht und wie lange auf 0.

Aber wer sagt eigentlich, dass der Timer immer nur bis 8 zählen soll? 
Niemand. Und genau da kommt der TOP Wert ins Spiel. In diesem Beispiel 
wäre der TOP Wert 8 gewesen. Du kannst ihn aber auch auf von mir aus 12 
setzen. Mit einem Vergleichswert von wieder 3, ergibt sich dann
1
  Timer: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4, 5, ...
2
  Pin:   1, 1, 1, 1, 0, 0, 0, 0, 0, 0,  0,  0,  0, 1, 1, 1, 1, 0, 0, ...

> Welcher Pin wird dann eig bei Mode 15 verwendet? OC1A oder OC1B?

Steht alles im Datenblatt.
Gast #1691631
Ok das mit OCR1A und OCR1B hab ich begriffen! Aber warum funktioniert 
mein Programcode dann nicht!? Hab an den OC1A eine LED gehängt und den 
Code wie oben bereits gezeigt draufgespielt!?
#1691646
Du hast gesetzt WGM10, WGM11, WGM12, WGM13

Laut Datenblatt ist das Modus 15

Modus 15 bedeutet:
  TOP Wert:        OCR1A
  Vergleichswert:  OCR1B   (muss so sein, weil A ja schon für TOP
                            gebraucht wird)

OCR1A setzt du.
Aber wo setzt du OCR1B?
Wo schaltest du den OC1B Pin auf Ausgang?
Wo teilst du dem Timer mit, dass der den OC1B Pin ansteuern soll?

Falls du es jetzt immer noch nicht begriffen hast:
Du kannst nicht den A-Kanal nehmen. OCR1A fungiert als TOP Wert und ist 
damit automatisch aus dem Rennen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.