Hallo Stefan,
Hallo Simon,
ich habe euren Thread hier interessiert verfolgt.
Den ocr_Wert über eine Funktion zu bestimmen ist für meinem Fall zu aufwendig. Ich brauche keine so weite Bandbreite an möglichen Frequenzen. Bei mir wechselt nur die Taktfrequenz vom ATMega. Ich wollte also den ocr_Wert mit einer Präprozessor #define berechnen. Und habe folgenden Code verwendet:
Der aber fehlerhaft sein muss. Ich erhalte als Frequenz ca. 14hz, was bei einem Quarz mit 7,3728Mhz auf einen ocs_Wert von 255 schließen läßt.Code:.... // CTC-Modus TIMSK |= (1 << OCIE0); // ocr_Wert setzen #define ocr_Wert ((F_CPU/(2 * 1024 * 50))-1) // #define ocr_Wert 71 #if ((Vergleichswert > 256) || (Vergleichswert < 0)) #error "Fehler bei der Initialisierung Timer0!" #endif OCR0 = ocr_Wert; ....![]()
Der übrigen Code ist aber richtig und funktionsfähig. Wenn ich #define ocs_Wert 71 schreibe (wie auskommendiert) erhalte ich exakt die gewünschten 50hz an einem Ausgangspin.
Das Problem hat vermutlich was mit der Berechnung zu tun: Weil der GCC warning: integer overflow in expression für die Zuweisung OCR0 = ocr_Wert; auswirft.
Präpozessor #defines sind reine Textersetzungen und keine eigenen Berechnungen. So weit klar. Aber der Ausdruck wird/sollte doch vom Compiler als Konstante gesehen werden und auch so gehändelt werden. Wird aber offensichtlich nicht. Des im Ausdruck mit uint16_t gerechnet wird, ist ebenfalls klar. Aber das Ergebniss ist doch eine uint8_t und müsste zu OCR0 passen. Habe ich mir jedenfalls so gedacht, was aber wie gesagt offensichtlich falsch ist. Auch alle Versuche den Ausdrucken Typen zu zu weisen, haben nichts gebracht.
Was mache ich dann da noch falsch? Hätte jemand eine Idee?
@Stefan:
Die Wirkung von 2UL * habe ich zwar verstanden, die Hintergründe aber nicht wirklich. Wo kann man sich da mal schlau lesen? Hättest Du einen Tip für mich.
Auf alle Fälle schon mal vielen Dank.
mfg
Uwe
Lesezeichen