www.mikrocontroller.net

Forum: Compiler & IDEs pwm atmega 32


Autor: Jörg Stäudle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe mich an folgendem Problem festgebissen und komme im Forum und
mit Datenblatt nicht weiter. Irgendwas habe ich nicht verstanden.
Ich will ein pulsweitenmoduliertes Signal am Pin B4 (OC0)des Atmega 32
ausgeben. Dazu habe ich eine LED angeschlossen.
Das kontinuierliche Hellerwerden der LED geht, das Brennen mit z.B.
halber Stärke geht nicht. (Habe auch Quelltexte aus diesem Forum
ausprobiert)
Kann mir bitte jemand auf die Sprünge helfen (auch wenn's eventuell
schon mal irgendwo stand?)
Danke, Jörg

Details:
Folgender Quelltext geht, die LED wird heller:
#include <avr/io.h>
#include <avr/delay.h>

int main (void)
{
  DDRB=0xff;
  PORTB=0x00;
  int i;

  TCCR0 = (_BV(WGM00) | _BV(COM01) | _BV(COM00) | _BV(CS00));
  while(1)
   {for (i=0;i<255;i=i+1)
     {OCR0=i;
      _delay_loop_2(20000);}}
}

Folgender Quelltext geht nicht, die LED brennt immer mit maximaler
Helligkeit:
#include <avr/io.h>

int main (void)
{
  DDRB=0xff;
  PORTB=0x00;
  int i;

  TCCR0 = (_BV(WGM00) | _BV(COM01) | _BV(COM00) | _BV(CS00));
  while(1)
   {OCR0=0x00;} //LED sollte aus sein, genausowenig geht 0x10...
}

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich wird Dein while(1) einfach wegopimiert. Versuche mal:
...
OCR0 = 0;
while(1);
}

Autor: Jörg Stäudle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,
danke für deine Antwort, aber daran liegt's nicht. Ich hab's schon
ausprobiert. Auch mit for - Schleife tut sich nichts.
Ich komme einfach nicht weiter, vor allem weil genau der Quellcode so
in einigen Beiträgen hier auch steht und bei mir geht er halt nicht.
Vielleicht muss ich dazusagen, ich benutze ein selbergebautes
Programmierkabel (pony - stk 200), aber das tut einwandfrei. Und der
atmega 32 ist auf einem Breadboard gesteckt.
Viele Grüße, Jörg

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

erstmal : Deine Frage könnte man in "asking smart questions" als
Beispiel für eine vernünftig gestellte Frage abdrucken. Kompliment.

Eine kleine Frage : War das ein Schreibfehler in Deinem Startpost oder
hast Du die Led wirklich an PB 4 hängen ?! Mein Datenblatt sagt : PB3
ist der OC0 Pin. Der Pin PB 4 ist der SS- -Pin des SPI.
Ansonsten habe ich keinen Plan, was da schief gehen könnte :-(.

MfG, Daniel.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

hier noch mal - das lässt mir keine Ruhe ! ;-)

Auf Seite 75 des Datasheets zum ATmega32 steht was zu den Extremwerten
von OCR0. Du verwendest eine invertierte Phase-correct PWM. WGM1:0 = 1
und COM1:0 = 3. Das führt dazu, dass bei einem Wert von 0x00 (=BOTTOM)
der Ausgang immer high ist. Auch der Wert 0x10 stellt dann keine so
gewaltige Änderung dar (~96% Einschaltdauer). Probier doch einfach mal
ein paar andere Werte für OCR0 die sich wirklich von 0x00 und 0xFF
unterscheiden (z.B. 0x40 oder 0x80). Wenn das alles nix bringt gibt es
zwei Möglichkeiten :

1. Ein Oszilloskop nehmen und einfach mal schauen, was sich wirklich an
dem Pin tut.
2. Sich das File aus dem Projektordner raussuchen, in welchem der
Compiler den Assemblerquelltext Deines Projekts gespeichert hat. Da
kann man dann auch nachschauen, welche Werte der Code den Registern
zuweist und ob vielleicht irgendetwas verloren gegangen ist. Das ist
aber eher unwahrscheinlich - die Probleme liegen bei illegalen
Wegoptimierungen meistens im C-Code.

An der Arbeit habe ich meine AVR-Entwicklungsumgebung nicht da - sonst
würde ich es testen.

MfG, Daniel.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur : 0x10 führt natürlich nicht zu 96% Einschaltdauer sondern zu
93,75% Einschaltdauer. Ich hatte 0x10 als 10 gelesen ;-).

MfG, Daniel

Autor: Jörg Stäudle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Daniel,
vielen Dank für deine Hilfe, PB3 habe ich schon verwendet.
Aber wie gesagt, ich hatte was noch nicht verstanden, bei 0xFF ist die
LED aus, juhu.
(Also führe ich mir das Datenblatt nochmal zu Gemüte.)

Vielen Dank auf jeden Fall, Jörg

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.