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
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
>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...)
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
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.
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.
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?)
> 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.
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??
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.
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
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
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
> 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.
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.
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