www.mikrocontroller.net

Forum: Compiler & IDEs PWM mit Timer 0 auf ATmega32


Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.