Forum: Compiler & IDEs Prob beim Timercode Mega32 nach Mega328


von Mario K. (lastyle)


Lesenswert?

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

von Jörg G. (joergderxte)


Lesenswert?

>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 ;)

von Mario K. (lastyle)


Lesenswert?

Argh Natürlich, Tippfehler

Aber dann sollte es doch korrekt sein ?

Gruß Mario

von Mario K. (lastyle)


Lesenswert?

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

von Jörg G. (joergderxte)


Lesenswert?

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.

von Mario K. (lastyle)


Lesenswert?

Jo da stehts drin und ich habs übersehen, danke nochmal

(PCINT22/OC0A/AIN0) PD6

schäm

von Mario K. (lastyle)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.