PWM mit Timer 0 auf ATmega32

Gast #176964
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
Gast #176965
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
Gast #176966
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
Gast #176967
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
Gast #176968
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren