Forum: Compiler & IDEs PWM mit Timer 0 auf ATmega32


von Tommy (Gast)


Lesenswert?

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

von Stefan Kleinwort (Gast)


Lesenswert?

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

von Tommy (Gast)


Lesenswert?

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

von Stefan Kleinwort (Gast)


Lesenswert?

> 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

von Jörg Wunsch (Gast)


Lesenswert?

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.

von Tommy (Gast)


Lesenswert?

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