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
eine ISR brauchst Du nicht, (auch kein sei) was geht denn an deinem Programm nicht, die Verstellung der PWM oder geht gar keine PWM?
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.
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.
> Wieso ist das mit PORTC unsinn?
Weil ich Tomaten auf den Augen habe :-)
Ich hab nicht mitgekriegt, dass deine Taster
low aktiv sind
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.
ich habe das bprogramm nicht geschrieben, wollte mit diesem programm nur eine eigene idea testen!!! ist aber schon ok! frage auch nicht mehr weiter!
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.