mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fast PWM bei ATMEGA8 will nicht


Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,
ich habe ein Problem mit dem Fast PWM Modus (Mode 14)
Normalerweise sollte der Counter bis ICR1 zählen und dann wieder von 
null beginnen. Wichtig für mich ist eigentlich nur das Einstellen von 
ICR1 für eine bestimmte Frequenz. Leider zählt der Counter viel weiter 
als er sollte und zählt dann wieder runter. Ich finde leider den Fehler 
nicht. Getestet habe ich das ganze nur als Simulation mit dem aktuellen 
AVR Studio.
Wo könnte der Fehler liegen?
/Initialisierung vom PWM Modul
  bit_set(TCCR1A,COM1A1);  // OC1A nicht invertierendes PWM

  DDRB = 255;    // PORTB (PB1,OC1A) als Ausgang

  ICR1 = 128;

  bit_clear(TCCR1A,WGM10);
  bit_set(TCCR1A,WGM11);  // 8-Bit PWM (Timer1); Fast PWM
  bit_set(TCCR1B,WGM12);  // TOP-Wert in ICR1
  bit_set(TCCR1B,WGM13);  


  bit_set(TCCR1B,CS10);  // Takt = T_clk / 1


  OCR1AL = 50;  

Autor: Mike J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Igor Metwet

// Fast PWM 8-bit (WGM12,10 = Mode 5)  Clear On Compare match
  TCCR1A  = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM10);
  TCCR1B  = (1<<CS10) | (1<<WGM12); // kein Prescaling + PWM Mode 5

Im Hauptprogramm den Interrupt abfangen.

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versteh ich nicht ganz. Was meinst du mit Interrupt abfangen?
PWM sollte doch ohne weiteren Code alleine laufen. Ist ja Hardware-PWM.

PWM-Mode 5 bringt mir nichts, da ich den TOP-Wert einstellen muss, um 
meine gewünschte Frequenz zu erhalten.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Ahnung wiso es immer wieder Leute gibt, die irgendeinen Mist 
erzählen, der garnix mit der Frage zu tun hat. Naja, ist halt so...

@Igor
Abgesehen dass bit_set() etwas unüblich ist, (und ich jetzt mal davon 
ausgehe, dass es das macht was der Name sagt), dann sollte es eigentlich 
funktionieren.

Noch ein Hinweis am Rande:
OCR1AL = 50;
Das ist nicht ganz das was du vermutlich vorhast. OK, in dem Fall schon, 
aber generell kann sowas ein schöner Fehler sein, denn es wird auch das 
Highbyte mitgeschrieben. Und da man selten weiß, mit welchem Wert es 
gerade belegt ist, schreibt man irgendwas mit. In diesem Fall wurde das 
Highbyte aber zuletzt hier beschrieben:
ICR1 = 128;
Da dieser Wert <256 ist, ist es 0. Also macht es das was du vorhast.

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke dir.
bit_set() passt schon:
#define bit_set(var,bitnr)   ((var) |= 1 << (bitnr))    // Einzelnes Bit setzen

Ich habe die Register aber auch im AVR-Studio im Auge behalten.
Dass das High-Byte beschrieben wird, obwohl ich nur das Low-Byte 
beschreibe ist mir jetzt neu. Ist das generell so bei den 16Bit 
Registern? Gibts dann auch ne Möglichkeit, wie ich nur das Low-Byte 
beschreiben kann, ohne das High-Byte anzufassen?

Wenn sonst alles richtig ist, gehe ich mal davon aus, dass AVR-Studio 
hier ein Problem mit der Simulation hat. Muss dann wohl doch einen 
Hardware-Aufbau machen..

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Igor Metwet wrote:

> Dass das High-Byte beschrieben wird, obwohl ich nur das Low-Byte
> beschreibe ist mir jetzt neu. Ist das generell so bei den 16Bit
> Registern? Gibts dann auch ne Möglichkeit, wie ich nur das Low-Byte
> beschreiben kann, ohne das High-Byte anzufassen?

Nein, es werden beide immer zusammen geschrieben, siehe Datenblatt 
"Accessing 16-bit Registers" (beim mega8 auf Seite 79). Das ganze ist 
halt eine Kompromisslösung um 16bit Register auf einem 8bit CPU einfach 
ansteuern zu können.

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke für die Infos!!

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.