Forum: Compiler & IDEs PWM mit ATMEGA8


von Andre (Gast)


Angehängte Dateien:

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

von Elektrikser (Gast)


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

von irgendein Rahul (Gast)


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

von Andre (Gast)


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

von Walter (Gast)


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?

von irgendein Rahul (Gast)


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.

von Andre (Gast)


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.

von Karl heinz B. (kbucheg)


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.

von Andre (Gast)


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

von Karl heinz B. (kbucheg)


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.


von Karl heinz B. (kbucheg)


Lesenswert?

> Wieso ist das mit PORTC unsinn?

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

von Andre (Gast)


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

von Daniel Held (Gast)


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.

von Andre (Gast)


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

von Andre (Gast)


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

von Michael (Gast)


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

von Walter (Gast)


Lesenswert?

einfach an den mega8 anschließen, ist doch logisch

von Michael (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Michael (Gast)


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!

von AVR-Jünger (Gast)


Lesenswert?

>wo muß ich die taster anschliesen?

PC0 und PC5.

von Karl H. (kbuchegg)


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.

von Michael (Gast)


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

von Benno (Gast)


Lesenswert?

Haut der WDT ein reset rein?

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
Noch kein Account? Hier anmelden.