www.mikrocontroller.net

Forum: Compiler & IDEs Verständnisproblem PWM


Autor: Attila (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Anfängerfrage:

Meines Erachtens müsste der Wert fade nach 255 "Vorgängen" bei 0x00 
verweilen. Dem ist aber nicht so. Warum?

#ifdef TIMER2_OVF_vect
#endif

  int  fade=0xFF;

  ISR (TIMER2_OVF_vect)
    {
    OCR2=fade;
    fade--;
    }

Autor: fade (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dem ist nicht so, weil du bei int fade problemlos 1 von 0 abziehen 
kannst und dann -1 in fade steht...

Bei

  ISR (TIMER2_OVF_vect)
    {
    OCR2=fade;
    if (fade > 0) fade--;
    }

sähe das anders aus.

Autor: joerg66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

globale Variablen, die innerhalb einer ISR verwendet werden, müssen 
grundsätzlich als volatile definiert werden:

volatile int fade=0xFF;

Anderfalls ändert sich der Wert bei der Ausführung innerhalb der ISR 
nicht.

Autor: Attila (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich bitte weiter etwas dilletantisch fragen darf: Wieso versteht 
OCR2 denn -1? Was passiert denn da genau?
Der Timer zählt von 0 bis 255. Also kann OCR2 Werte zwischen 0 und 255 
annehmen.
Ich gebe fade ja den Wert 255 "mit". Dann wird fade bei jedem Intterrupt 
, also wenn Timer 2 bei 255 angekommen ist, eins kleiner. Nach 255 
Durchläufen müsste fade den Wert 0 haben. Was passiert denn dannach?

Autor: Attila (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus der blinkenden LED auf meinem Schreibtisch schliesse ich dass fade 
seinen Wert wohl ändert. Bei fade++ wird die LED immer heller bis sie 
von dunkel wieder anfängt und bei fade-- wird sie immer dunkler um bei 
ganz Hell wieder anzufangen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://de.wikipedia.org/wiki/Integer_(Datentyp)
oder C-Buch in den ersten 30 Seiten bei den Datentypen

fade = 1;    // Inhalt von fade: 1 = 0x0001 (bei 16-Bit Integern)
OCR2 = fade; // Inhalt von OCR2: 1 = 0x01
fade--;      // Inhalt von fade: 0 = 0x0000
OCR2 = fade; // Inhalt von OCR2: 0 = 0x00
fade--;      // Inhalt von fade: -1 = 0xFFFF im Zweierkomplement
OCR2 = fade; // Inhalt von OCR2: 255 = 0xFF
             // = niederwertigstes Byte des Zweierkomplements

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Attila schrieb:
> Wenn ich bitte weiter etwas dilletantisch fragen darf: Wieso versteht
> OCR2 denn -1?

Was erwartest du denn? Daß OCR2 sich denkt "Hä, was soll ich denn mit -1 
machen? Das ignoriere ich mal."?

> Was passiert denn da genau?

Nun

> Der Timer zählt von 0 bis 255. Also kann OCR2 Werte zwischen 0 und 255
> annehmen.

Ja.

> Ich gebe fade ja den Wert 255 "mit".

Also in Bits: 0000000011111111

An dein OCR2 werden die unteren 8 Bit davon übergeben,
das ergibt 11111111

> Dann wird fade bei jedem Intterrupt , also wenn Timer 2 bei 255
> angekommen ist, eins kleiner. Nach 255 Durchläufen müsste fade den Wert 0
> haben.

Also 0000000000000000, in OCR2 kommt 00000000.

> Was passiert denn dannach?

fade bekommt den Wert -1, also 1111111111111111. OCR2 bekommt wieder die 
unteren 8 Bit, also in diesem Fall 11111111.

Autor: joerg66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Rolle spielt eigentlich OCR2 in dem Programm? Für den 
Overflow-Interrupt ist das Register vollkommen irrelevant. Vermute, dass 
der Timer-Compare-Interrupt ebenfalls läuft.

In welchem Modus läuft der Counter? Fast Mode PWM?

Autor: Attila (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oooooooooook!!! Aha! Verstanden! Vielen Dank!

Ich hatte schlichtweg erwartet dass das was ich da geschrieben habe erst 
garnicht funktioniert. Das nach dem Abzählen von 255 meine Led einfach 
nicht mehr leuchtet weil OCR2 bei 0x00 "hängen bleibt". Nicht das der 
OCR denkt" Hä -1? Das ignoriere ich mal!" sondern: " Hä 0-1? Kann ich 
nicht und daher gilt 0-1=0!" Ist der Programierer schliesslich selber 
schuld wenn er den Wertebereich von integer zahlen überschreitet.

Aber jetzt ist alles vorerst klar! Vielen Dank!

Autor: Hc Zimmerer(mizch) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es passiert dasselbe wie wenn Du hochzählst:  bei 9 geht es mit 0 weiter 
und es gibt einen Übertrag.  So macht es der Timer auch.  Selbst für den 
Übertrag ist gesorgt.  Beim Runterzählen passiert dasselbe:  Nach 0 
kommt 9 und es gibt einen Unterlauf in die nächsthöhere Stelle.

Ob es unter 0 mit -1 oder mit 255 (8 Bit) weitergeht, ist reine 
Betrachtungssache.  Genauer gesagt, ist es durch den Zahlentyp 
vorgegeben.  Ist er unsigned, folgt (bei 8 Bit Breite 255), ist er 
signed, folgt -1.  Das Bitmuster im Zähler ist beide Male dasselbe.  Du 
entscheidest, welche Bedeutung das Bitmuster 0xff hat.

Autor: Jörg Tilders (joerg66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry,

muss mich korrigieren. OCR2 spielt je nach ATmega-Typ doch eine Rolle 
beim Overflow Interrupt. Hatte letztens mit einem ATmega32A zu tun. Hier 
ist TOP immer 0xFF. Beim 324/644 kann TOP verändert werden.

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.