Hallo zusammen, ich bin geradew dabei meinen Code vom Mega32 nach Mega328 umzustellen (wollte das Arduino Board mal ausprobieren) und hänge nun daran das ich den Timer von meinem Mega32 auf den 328 protieren möchte. Ich bin mir halt nicht 100%tig sicher aber eigentlich sollte es doch so stimmen ? Timer in fast PWM-Mode, set oc0 on compare match, clk/1 => 16MHz div 256 => 62,5kHz Beim Mega32 funktioniert der init mit TCCR0 |= (1<<WGM01) | (1<<WGM00) | (3<<COM00) | (1<<CS00); das nun auf den 328 angepasst ist ja TCCR0B |= (1<<WGM01) | (1<<WGM00) | (3<<COM2A0) | (1<<CS00); ist das nun so richtig oder hab ich mich da verhauen ? Gruß Mario
>das nun auf den 328 angepasst ist ja >TCCR0B |= (1<<WGM01) | (1<<WGM00) | (3<<COM2A0) | (1<<CS00); Wie kommst du darauf? - WGM00 und WGM01 sind in einem anderen Register - du meinst wahrscheinlich COM0A0 ('Compare output', Timer 0, Einheit A, Bit 0), das ist auch in einem anderen register. Aber immerhin fast die richtigen Bits ;)
Argh Natürlich, Tippfehler Aber dann sollte es doch korrekt sein ? Gruß Mario
Und was ich noch vergessen habe, beim Mega32 benutze ich OC0 (PB3 beim Mega32) als PWM Kanal, kann ich beim Mega328 OC1 (PB1 beim Mega328) als PWM benutzen oder muss ich hier zwingend einen der Pins vom PortD wie z.B PD7 = AIN1/OC0 wie beim Mega32 benutzen ? Gruß Mario
Besorg dir das Datenblatt für deinen atmega328! Wenn du die PWM über OC0A machen willst, dann ist das Pin PD6. Wenn du die PWM auf dem Pin PB1 haben willst, dann ist das OC1A, d.h. ein anderer Timer. Die OC-Ausgänge sind fest mit bestimmten Pins verdrahtet, das kann man nicht ändern. Ein grundsätzlicher Unterschied zwischen dem Atmegs32 und den AtmegaX8 (X ist 4, 8, 16 oder 32) ist, dass die X8-er zwei PWM-Kanäle für jeden der drei Timer haben, immer -A und -B.
Jo da stehts drin und ich habs übersehen, danke nochmal (PCINT22/OC0A/AIN0) PD6 schäm
Also irgenwie bekomme ich das mit dem Timer nicht wirklich auf die Reihe, wie wäre die richtige umsetzung vom Mega 32 ? Ich bekomme den Timer einfach nicht auf dem Mega328 zum laufen, der hängt sich total auf Wie gesagt M32 funzt mit DDRB |= (1<<PB3); //-- Timer in fast PWM-Mode, set oc0 on compare match, clk/1 => 16MHz div 256 => 62,5kHz ---------------- TCCR0 |= (1<<WGM01) | (1<<WGM00) | (3<<COM00) | (1<<CS00); //-- Überlauf alle 16µsek => 62,5kHz TIMSK |= (1<<TOIE0); wie muss das auf dem M328 heissen ? Danke im vorraus Gruß Mario
Ich versteh nicht, was daran so schwer ist, sich die Dinge aus dem Datenblatt zusammenzusuchen. Aus der Waveform Generation Mode Bit Tabelle Fast PWM: WGM01 und WMG00 müssen auf 1 Du willst den Pin OC0A bei Compare Match setzen, also invertierte PWM Aus der für Fast PWM Mode zuständigen Tabelle: COM0A1 und COM0A0 müssen gesetzt werden Du willst einen Vorteiler von 1 Aus der Clock Select Tabelle: CS00 muss auf 1 Jetzt wissen wir, welche Bits zu setzen sind. In welchen Registern sind die Bits? Ein Blick in die jeweilige Register Übersicht sagt uns: TCCR0A: COM0A0 und COM0A1 sowie WGM01 und WGM00 TCCR0B: CS00 Und natürlich muss auch noch der Output Pin, welcher PD6 ist, auf Ausgang gestellt werden. Also
1 | DDRD |= ( 1 << PD6 ); |
2 | TCCR0A = ( 1 << COM0A0 ) | ( 1 << COM0A1 ) | ( 1 << WGM01 ) | ( 1 << WGM00 ); |
3 | TCCR0B = ( 1 << CS00 ); |
4 | |
5 | OCR0A = 127; // PWM mit halber Kraft |
Beim Portieren portiert man niemals irgendwelche Biteinstellungen sondern Funktionalität. Welche Funktionalität hatte ich am Quellprozessor? Dann Datenblatt rausholen: Welches ist die gleichwertige Funktionalität am Zielprozessor? Wie müssen am Zielprozessor die Einstellungen dafür sein? Ist in Summe eine Sache auf 10 Minuten. Du werkelst jetzt schon 24 Stunden daran herum. Das Datenblatt ignorieren hat sich noch nie bezahlt gemacht. Du bist dadurch nicht schneller.
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.