Hallo... ich habe ein Probelm beim Versuch ein PWM Signal mit dem Timer 0 des Atmega 32 zuerzeugen. Als Programm hab ich folgendes formuliert: #include <avr/io.h> int main (void) { //Port B als Ausgang definieren DDRB = 0xFF; //fast PWM, kein prescaler, low bei Comparematch high bei overflow TCCR0 = (1 << WGM01) | (1 << WGM00) | (1 << COM01); //zum Test Compare-Register->Tastverhältnis 50% OCR0 = 0x7f; //Timer mit CPU Takt loslegen lassen TCCR0 = (0 << CS02) | (0 << CS01) | (1 << CS00); //Endlosschleife for(;;); } Das Ergebnis dieser Routine läßt sich einfach zusammenfassen: Es passiert überhaupt nix! HAb das ganze dann mal umgestrickt und das PWM Signal per Software über ISRs realisiert und da ging es. Also Pin B3 bei Timer0 Overflow setzen und bei Comparematch rücksetzen. Hab auch schon den Controller gewechselt, aber alles ohne Erfolg. Bin für jeden Hinweis dankbar. Tommy
hier setzt Du die Bits: TCCR0 = (1 << WGM01) | (1 << WGM00) | (1 << COM01); Und hier löscht Du sie wieder: TCCR0 = (0 << CS02) | (0 << CS01) | (1 << CS00); So habe ich es vor Kurzem gemacht: TCCR0 = (_BV(WGM00) | _BV(WGM01) | _BV(COM01) | _BV(COM00) | _BV(CS01)); OCR0 = 0xC0; Alles klar? Stefan
Also heißt das, daß ich mit der Schreibweise: Register_X = (1 << Bit_Y); Register_X = (1 << Bit_Z); mit der Zweiten Zeile die erste, also das Bit_Y wieder lösche? (Kann mich daran erinnern, soetwas schon mal gelesen zu haben...) wie sieht's mit: Register_X = (1 << Bit_Y); Register_X |= (1 << Bit_Z); aus? Verhindert dies das Überschreiben? THX
> Register_X |= (1 << Bit_Z); > aus? Verhindert dies das Überschreiben? So ist es. _BV() soll wohl übrigens Bit-Value heissen und macht genau das, was Du mit 1 << Bit_Z machst, nur kürzer. Stefan
Wobei es natürlich Quatsch ist, erstmal ein Register mit ein paar Bits zu beschreiben, um paar Zeilen später noch ein paar Bits hinzuzufügen. Sicher, es gibt gute Gründe, warum man ,,gelegentlich mal ein Bit'' setzen will, aber hier liegt kein solcher vor, d. h. man generiert kürzeren Code (nämlich ein einziges OUT), wenn man alles in eine Anweisung schreibt.
Du hast natürlich recht, aber diese Aufteilung resultierte daraus, dass ich zu beginn zwei Subroutinen im Programm hatte, die es mir einfach ermöglichten den Timer zu starten und zu stoppen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.