www.mikrocontroller.net

Forum: Compiler & IDEs PWM mit ATMEGA8


Autor: Andre (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich weiss das es bereits einige Beitraege zum Thema PWM gibt aber ich 
konnte nirgends herausbekommen warum mein Programm nicht macht was es 
soll.

Ziel ist eigentlich ganz einfach die Helligkeit einer an den PWM Ausgang 
angeschlossenen LED mit zwei Tastern zu veraendern indem die Taster 
bewirken das sich der compare Wert aendert.

An dem Ausgang tut sich leider garnix, weder in der Simulation noch in 
der Realitaet. Das sieht fuer mich aus als waere irgend etwas noch nicht 
"enabled" aber ich dachte mit sei() und dem freischalten des compare 
match interrupts waere ich fertig mit "enablen".

Anscheinend bin ich das aber nicht.

Wenn mir jemand sagen kann warum der angehangene code nicht funktioniert 
waere ich sehr dankbar.

Andre

Autor: Elektrikser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist denn deine Interrupt-Service-Routine (ISR)? Machst du da nichts? 
Du brauchst doch nur die demo.c (examples bei WINAVR) ansehen und für 
deine Zwecke abändern.

Gruß Elektrikser

Autor: irgendein Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>TCCR2= (1<<WGM20)|(1<<COM21)|(1<<CS20);

Phase correct, toggle on Compare,no prescaling

>TIMSK= (1<<OCIE2);
Dadurch wird der Controller resetet, weil keine ISR vorhanden ist. 
Entweder weglassen oder ISR schreiben.
(Default-ISR-Vector ist der Reset-Vektor...)

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also das Beispiel hab ich mir angesehn aber ich wuerde gern verstehen 
warum mein code nicht funktionioert und das kann ich dort nicht so 
richtig entnehmen.

Das TIMSK=(1<<OCIE2); habe ich herausgenommen (und kann auch in der 
Simulation sehen das der Controller nicht mehr resettet wird) aber am 
PWM Ausgang (was laut Datenblatt PB3 ist, welchen ich auch als Ausgang 
geschaltet habe) tut sich nix. Nach wie vor weder in der Simulation noch 
auf meinem Testboard.

Es muss also nach wie vor irgend etwas falsch sein.

Brauche ich eine ISR ?? Wenn ja was soll darin geschehen ich dachte die 
PWM wird vom Controller erzeugt wenn man alles so eingestellt hat wie 
ich das getan habe.

Danke schonmal fuer weitere Hinweise.

Andre

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eine ISR brauchst Du nicht, (auch kein sei)

was geht denn an deinem Programm nicht,
die Verstellung der PWM oder geht gar keine PWM?

Autor: irgendein Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest eine ISR dazu benutzen, darin eine LED zu togglen (ein- und 
aus zu schalten). Dann weisst du wenigstens, dass dein Timer läuft.

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die Verstellung der PWM hab ich noch nicht testen koennen weil am 
PWM Ausgang garnix erst raus kommt (dann kann ich nicht sehn ob es beim 
druecken der taster heller oder dunkler wird).

Der Timer sollte funktionieren weil ich sehen kann das dieser in der 
Simulation zaehlt. Nur an PB3 tut sich nix, absolut garnix.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich dein Pgm ohne die Freigabe vom Interrupt simuliere
und auf F10 bleibe, dann krieg ich sehr wohl einen blinken
PB3 Pin.

Hinweis: halte F10 und halte es gedrückt, und dann beobachte mal
was OCR2 macht.
Das was du da mit dem PortC aufführst ist ziemlicher
Unsinn. Aber eins nach dem anderen.

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das stimmt ich sehe PB3 nun auch, wahrscheinlich hab ich nicht lange 
genug zaehlen lassen oder so.
Wenn ich OCR2 beobachte macht es im Prinzip was es soll, es wird auf 7E 
gesetzt (vorrausgesetzt ich toggle PINC 0 und 5 auf 1 weil auf dem Board 
ware das ja auch 1) allerdings tut es das nicht sofort sondern erst nach 
aettlichen Durchlaeufen der Schleife

Ich hab 3 weitere fragen:

1. Warum leuchtet die LED auf meinem Board nicht (laut simulation sollte 
das ja eigentlich gehen?)

2. Kann es sein das der Simulator die Register nicht gleich 
aktualisiert? Bei der initialisierung von OCR2 ganz am anfang zum 
Beispiel, da bin ich an dem Schritt schon vorbei mit der Simualtion aber 
das OCR2 Register an der Seite aendert sich erst nach einer Weile nicht 
direkt bei dem Schritt (was ich erwartet haette)

3. Wieso ist das mit PORTC unsinn? ich will die beiden Pins ja als 
Eingang nutzen (ich rate mal und sage das das der standard wert ist und 
man das nicht 0 setzen muss sondern nur aendern muss wenn es ein Ausgang 
sein soll?)

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> tut es das nicht sofort sondern erst nach
> aettlichen Durchlaeufen der Schleife

Wenn du mal ins Datenblatt schaust, dann steht da
dass OCR2 beim phase correct PWM Modus (den Modus den
du verwendest) erst dann verändert wird, wenn der
Counter den TOP Wert erreicht hat.

-> OCR2 setzen, bevor du den Timer in den PWM Modus
umschaltest.


Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wieso ist das mit PORTC unsinn?

Weil ich Tomaten auf den Augen habe :-)
Ich hab nicht mitgekriegt, dass deine Taster
low aktiv sind

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK dann macht die Simulation jetzt genau was sie soll (bzw hat sie schon 
vorher aber jetzt versteh ich es ;)).

Aus irgend einem Grund passiert aber auf meinem Testboard (MyAVR board) 
nix. Das board an sich ist in Ordnung da ich schon andere Sachen drauf 
versucht hab die funtioniert haben.

Die LED ist auch ganz, wenn ich sie auf high setze manuell dann leuchtet 
sie. Aber warum kommt nix aus PB3??

Auch laut Oszi tut sich an PB3 absolut nix.

Was kann der Grund sein??

Autor: Daniel Held (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich muß mich mal einklinken.
Du willst PB3 als Ausgang nutzen, mit >DDRB|=(1<<3); wird das aber 
nichts.
Probier doch mal das:
DDRB  = (1 << DDB3);
damit sollte es besser klappen.
Wenn Du eine 3 auf das Register schiebst behandelst Du nur Bit0 und 
Bit1, weil hexadezimal.

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also laut GCC Tutorial macht das keinen Unterschied.
Zitat:

"Für den Compiler sind die Ausdrücke (1<<PC7), (1<<DDC7) und (1<<PINC7) 
identisch: (1<<7) (genauer: der Präprozessor ersetzt die Ausdrücke 
(1<<PC7),... zu (1<<7))."

Und wenn das falsch waere duerfte ja die Simulation ebenfalls nicht 
funktionieren, was sie ja aber tut.

Danke trotzdem. Hat sonst noch jemand irgend eine Idee was das Problem 
sein koennte? Es muss doch moeglich sein eine so einfache Anwendung zum 
laufen zu bringen... das ist irgendwie frustrierend.

Andre

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab hier nochmal den code:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>


#define F_CPU  3686411

int main (void)
{
OCR2 = 0x7F;
TCCR2= (1<<WGM20)|(1<<COM21)|(1<<CS20); //pwm anschalten und einstellen 
ob beim hochzaehlen an und beim runterzaehlen aus gemacht wird oder 
andersrum
DDRB|=(1<<3);
DDRC&=~((1<<0) | (1<<5));
PORTC|=(1<<0) | (1<<5);
sei();


  while (1) {
  if (!(PINC & (1<<0)) && (OCR2 >= 5))
    {
    OCR2=OCR2-5;
    }
  if (!(PINC & (1<<5)) && (OCR2 <= 250))
    {
    OCR2=OCR2+5;
    }
  }
}

Kann den vielleicht mal jemand genau so auf seinen ATMEGA8 laden, eine 
LED  mit PB3 verbinden und mir sagen ob sich da irgend etwas tut?

Waere wirklich nett, also schonmal vielen Dank

Andre

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ich bin hier auch ein neuling und will mir auch gerade eine PWM 
zusammen basteln.

Ich habe es auf meinen ATMEGA8 geladen die angeschlossene LED an Port B 
3 leuchtet. wo muß ich die taster anschliesen? damit sich was verändert?

Danke an die Profis

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfach an den mega8 anschließen, ist doch logisch

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ich ihn anschließen muß ist mir klar aber an welchen Port und 
welcher Pin?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> das ich ihn anschließen muß ist mir klar aber an welchen Port
> und welcher Pin?

An den Port und an die Pins, die dein Programm abfrägt.
Ist doch auch logisch.

Und bevor du weiterfragst: Nein, hier weiss niemand welche
das sind. Du hast das Programm geschrieben, also musst du
das wissen.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe das bprogramm nicht geschrieben, wollte mit diesem programm nur 
eine eigene idea testen!!!

ist aber schon ok! frage auch nicht mehr weiter!

Autor: AVR-Jünger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wo muß ich die taster anschliesen?

PC0 und PC5.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael wrote:
> ich habe das bprogramm nicht geschrieben, wollte mit diesem programm nur
> eine eigene idea testen!!!

Ehrlich?
Welche Idee?
Welches Programm?

Du brauchst doch nur das Programm durchforsten, wo mittels
PINx irgendwelche Eingänge abgefragt werden. Das x gibt
dir dann den Prozessor-Port an dem die Taster angeschlossen sind.
Und die Art und Weise wie das Ergebnis dieser Abfrage
weiter benutzt wird, sagt dir dann an welchen Prozessor-
Pins die Taster hängen müssen.

Wenn du dich an PWM versuchst, solltest du schon soweit
programmieren können, dass dich so eine Analyse nicht vor
gröbere Schwierigkeiten stellt.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An Karl heinz Buchegger, Danke ich war da auf dem Schlauch gestanden, 
habe es dann selbst gemerkt! Das meine Fragen sau dumm waren. Den 
letzten und ersten Mikrocontroller habe ich vor 2 Jahren in den Händen 
gehabt und habe erst seit drei Tagen wieder einen in der Hand und was 
Programmiert!

Ach zu meinem Programm und mein kleines Problem wenn du möchtest kannst 
du es dir gerne mal anschauen unter:

Beitrag "Analog einlesen und als PWM ausgeben"
"Analog einlesen und als PWM ausgeben"

Gruß Michael

Autor: Benno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haut der WDT ein reset rein?

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.