www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM mit ATMega8


Autor: einsteiger (Gast)
Datum:

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

int main(){
  DDRB = (1<<PB1);
  TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<WGM11) | (1<<WGM10); 
  TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS12);
  OCR1A = 0x00FF;  
  while(1){}
}
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!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Und wo ist dein Compare-Wert (OCR1B)?

MfG Spess

Autor: einsteiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab gedacht für Channel A ist das OCR1A!?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie gehts nun weiter wenn man mal fragen darf

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>wie gehts nun weiter wenn man mal fragen darf

Wie soll es weitergehen? Wenn man es richtig macht, funktioniert es.

MfG Spess

Autor: frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich muss nur noch meinen vergleichswert eintragen und der zählt dann 
quasi als hoch und runter?

wenn ich es simuliere klappt es irgwie nicht

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Der Simulator hat einige Probleme mit PWM bei 16-Bit Timern. Im 
vorliegenden Fall scheint das der Fall zu sein.

MfG Spess

Autor: einsteiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: einsteiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs jetzt auch mal so versucht:
#include <avr/io.h>

int main(){
  DDRB = (1<<PB1);
  TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<WGM11) | (1<<WGM10);
  TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS12);
  OCR1A = 0xFFFF;  
  OCR1B = 0x00FF;

  while(1){}
}
funktioniert aber auch nicht...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)
  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
  Timer: 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, ...
  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
  Timer: 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, ...
  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
  Timer: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4, 5, ...
  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.

Autor: einsteiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Raiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss mal wirklich den  Karl heinz Buchegger (kbuchegg) loben. Deine 
Erklärung ist echt gut und vorallem auch verständlich. Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.