mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Soft-PWM


Autor: Bene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe eben mit dem Soft-PWM Programm aus dem Tutorial rumgespielt. 
Ich möchte die auf 100 Hz definiert PWM-Frequenz erhöhen und erhalte 
dabei immer folgende Fehlermeldung:

../soft_pwm_test.c:129: warning: integer overflow in expression


Ausschnitt aus dem Code:
// Timer 1 Output COMPARE A Interrupt
ISR(TIMER1_COMPA_vect)
{
    static uint8_t pwm_cnt=0;
    uint8_t tmp=0;

    OCR1A += (uint16_t)T_PWM;  <== Zeile 129 <== <== <== <== <==

    if (pwm_setting[0] > pwm_cnt) tmp |= (1<<0);
    if (pwm_setting[1] > pwm_cnt) tmp |= (1<<1);
    if (pwm_setting[2] > pwm_cnt) tmp |= (1<<2);
    if (pwm_setting[3] > pwm_cnt) tmp |= (1<<3);

    PWM_PORT = tmp;                         // PWMs aktualisieren
    if (pwm_cnt==(uint8_t)(PWM_STEPS-1))
        pwm_cnt=0;
    else
        pwm_cnt++;
}

Kann mir jemand einen Tip geben?

Gruß

Bene

Autor: Mikes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OCR1A ist ein 8 Bit register!

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

Bewertung
0 lesenswert
nicht lesenswert
Bene wrote:

> ../soft_pwm_test.c:129: warning: integer overflow in expression

Das bedeutet nichts anderes, als dass in einer konstanten Berechnung der 
Zahlenbereich überschritten wurde.

>     OCR1A += (uint16_t)T_PWM;  <== Zeile 129 <== <== <== <== <==

Aha. Dann sehen wir uns einfach mal an, was T_PWM ist.

#define T_PWM (F_CPU/(F_PWM*PWM_STEPS))

wobei
#define F_CPU 8000000L
#define F_PWM 100
#define PWM_STEPS 256

die einzige Integer-Berechnung die in der T_PWM Formel vorkommt, ist 
F_PWM*PWM_STEPS

Mit deinen gewählten Werten ergibt sich also, dass F_PWM*PWM_STEPS einen 
Wert größer als 32767 ergibt. Und damit ist das ausserhalb des 
int-Bereiches bei 16 Bit. Du könntest zb. den Compiler zwingen die 
Berechnung nicht in int, sondern in long durchzuführen. Dazu genügt es, 
wenn eine der beiden Zahlen eine Long-Zahl ist. Also zb

#define F_PWM 100L

Autor: Mikes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz
Und was bringt Dir das, wenn OCR1A doch nur die untersten 8 Bit addiert?

Autor: Bene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank

hab was gelernt und es funktioniert.

Gruß

Bene

Autor: Mikes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry vergessen:

... und speichert.

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

Bewertung
0 lesenswert
nicht lesenswert
Mikes wrote:
> @Karl Heinz
> Und was bringt Dir das, wenn OCR1A doch nur die untersten 8 Bit addiert?

Du irrst.
OCR1A ist ein 16 Bit Register, bestehend aus OCR1AH und OCR1AL


Selbst wenn es ein 8 Bit Register wäre:
Ist uninteressant, der Compiler kann das sowieso nicht prüfen, da der 
neue Wert des Reigsters unter anderem auch vom alten Wert abhängt. Eine 
Warnung wie die oben angegebene wird vom Compiler normalerweise nur dann 
ausgegeben, wenn alle beteilgten Operanden konstant sind. Und bei += 
sind sie das nun mal nicht.

Ausserdem: Auch eine konstante Berechnung, die nur aus int besteht, kann 
durchaus ein Ergebnis liefern, welches in einen uint8_t passt.

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.