Forum: Mikrocontroller und Digitale Elektronik PWM Beispeil/Allround-Programm gesucht


von adrian (Gast)


Lesenswert?

Hi Leute,
ich bin auf der Suche nach einem (am besten in Assembler geschriebenem) 
Beispielprogramm, woran ich mich endlich mal in PWM einfinden kann. Mit 
kleinen erklärungen etc. Ich habe das AVR Tutorial durchgemacht, aber 
ich tue mich an PWM sehr schwer. Die Sache an sich verstehe ich, nur ich 
weiß nicht wie ich es eintippen muss :(
Ein kleines Programm, welches nur eine LED durchfadet, oder sowas in der 
Art, wäre total nett.
Tut mir leid wenn ich in der Beziehung so begriffsstutzig bin :)

An µCs habe ich hier Attiny13/85/2313 und Atmega8 rumliegen. Ist also 
recht Wurst wofür das Prog ist =)

Danke im Vorraus
mfg Adrian

von Volker S. (volkerschulz)


Lesenswert?

adrian schrieb:
> [...] Ich habe das AVR Tutorial durchgemacht, aber
> ich tue mich an PWM sehr schwer. Die Sache an sich verstehe ich, nur ich
> weiß nicht wie ich es eintippen muss :(
> Ein kleines Programm, welches nur eine LED durchfadet, oder sowas in der
> Art, wäre total nett.

Aber genau das steht doch im AVR-Tutorial inkl. ASM-Code....

•PWM: Ein Timer dimmt eine LED
http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM

Woran fehlt's denn?

Volker

von spess53 (Gast)


Lesenswert?

Hi

> Ich habe das AVR Tutorial durchgemacht,...

Und auch das Datenblatt gelesen?

MfG Spess

von adrian (Gast)


Lesenswert?

Ja die beiden Programmierungen habe ich schon draufgespielt gehabt.
Wie beschrieben sieht man da ja nur wie 6 Dimmstufen aussehen und bei 
dem anderen ist die LED relativ lagnweilig nur am Blinken.
Suche ne Mischung aus beidem xD

Ja das Datenblatt habe ich bereits gelesen. Aber nicht das ganze ^^

von Volker (Gast)


Lesenswert?

adrian schrieb:
> Wie beschrieben sieht man da ja nur wie 6 Dimmstufen aussehen und bei
> dem anderen ist die LED relativ lagnweilig nur am Blinken.

Und drunter steht:

Nachdem die Funktion und das Zusammenspiel der einzelnen Register jetzt 
klar ist, ist es Zeit aus dem Blinken ein echtes Dimmen zu machen. Dazu 
genügt es den Vorteiler des Timers auf 1 zu setzen:

[CODE-Schnipsel]

Werden wieder die beiden OCR1A Werte 0x6DFF und 0x10FF ausprobiert, so 
ist deutlich zu sehen, dass die LED scheinbar unterschiedlich hell 
leuchtet.

Volker

von spess53 (Gast)


Lesenswert?

Hi

Du willst wahrscheinlich, das die Led z.B. langsam heller wird?

MfG Spess

von Volker (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
> Du willst wahrscheinlich, das die Led z.B. langsam heller wird?
>
> MfG Spess

Nein, er will ein "Allround-Programm", steht doch im Betreff! ;)

Volker

von spess53 (Gast)


Lesenswert?

Hi

>Nein, er will ein "Allround-Programm", steht doch im Betreff! ;)

Von Dunkel bis ganz hell ist doch 'Allround'. Mehr geht nicht.

MfG Spess

von adrian (Gast)


Lesenswert?

Genau spess53 :)

Mit Allround, meinte ich doch nur, das ich den Code auch für andere 
Dimmprogrammierungen nutzen könnte ;)

von spess53 (Gast)


Lesenswert?

Hi

>Mit Allround, meinte ich doch nur, das ich den Code auch für andere
>Dimmprogrammierungen nutzen könnte ;)

Das ist nicht so einfach. Es gibt 8- und 16-Bit-Timer und es gibt 
verschiedene PWM-Modi. Aber wenn du das Prinzip einmal richtig 
verstanden hast, brauchst du auch kein 'Allround Programm' mehr. Denn 
das reduziert sich eigentlich auf die Initialisierung des Timers. Das 
Dimmen erreichst du durch die Veränderung des OCR-Werts.

MfG Spess

von Wolfgang S. (wsm)


Lesenswert?

@adrian

hast du PWM verstanden oder suchst du auch noch Erklärungen für PWM ?

von adrian (Gast)


Lesenswert?

So hoffe ich es auch, spess53 :)
Nur ich brauche iwie wohl einen kleinen Anstupser damit ich einmal 
reinkomme.
Wie gesagt, das Tutorial habe ich auch schon durchgelesen und was 
möglich war simuliert und auf den µC geladen. Nur diese riesigen 
Zusammenspiel aus Stackpointer, Timer und hastenichgesehn ist mir iwie 
zu viel für den Anfang.

Ich habe das Prinzip verstanden. Durch kleine 1 Signale in einer 
Frequenz wird die LED dunkler. Das macht man mit Timern und durch die 
Vorteiler kann man dies einstellen.
Nur mein wirkliches Problem ist es, es passend im Code zu formatieren.

    ldi      temp1, 1<<COM1A1 | 1<<WGM11
    out      TCCR1A, temp1

    ldi      temp1, 1<<WGM13 | 1<<WGM12 | 1<<CS12
    out      TCCR1B, temp1

Ist so ein Codeschnipsel sozusagen eine "Mustereinstellung" bei der ich 
nur die für mein Programm spezifischen Einstellungen ändern muss?

Danke für eure Hilfe :)

von adrian (Gast)


Lesenswert?

Ich kann euch ja mal ein Projekt zeigen welches ich auf µC umbauen 
möchte.
Es geht um ein LED Herz was ich für meine Freundin gebaut habe.
Die "Intelligenz" dabei ist bisher noch ein Dekadenzähler und ein NE555 
als Takt (per Poti einzustellen).
Hier der Link: http://www.youtube.com/watch?v=XVzBbxJkVvI

Wie ihr seht sind die Übergänge etwas ruppig. Daher möchte ich die LEDs 
faden.

Mir würds aber für den Anfang genügen wenn ich EINE LED zum faden 
bringen würde :D

von Wolfgang S. (wsm)


Lesenswert?

Ein einfaches BASCOM-Programm habe ich beigelegt.

===  Code  =================================================

$regfile = "m8def.dat"
$crystal = 10001666                               'Mini-Atmega 4-Platine
$hwstack = 32                                     'default use 32 for 
the hardware stack
$swstack = 10                                     'default use 10 for 
the SW stack
$framesize = 40                                   'default use 40 for 
the frame space


Dim A As Integer , Da As Integer , I As Word , Full As Word , Full2 As 
Word

A = 100                                           'muss nur >10 sein
Da = 1                          'Additionswert für die Fade-Schritte
Full = 500                      'Maximalzahl der PWM-Schritte oder 
-Stufen
Full2 = Full / 2                                  'entspricht 50%

Config PortB= Output

Do

A = A + Da                           'PWM-Wert erhöhen

Portb.1 = 1                          'LED einschalten

For I = 1 To Full                     'PWM-Laufschleife für ein on/off

If I = A Then Portb.1 = 0             'LED bei I=A ausschalten

Next I                                'und Restzeit ausgeschaltet lassen

If A = Full2 Or A = 10 Then Da = -da  'Fade-Richtung umdrehen

Loop

von spess53 (Gast)


Lesenswert?

Hi

Ist so ein Codeschnipsel sozusagen eine "Mustereinstellung" bei der ich
nur die für mein Programm spezifischen Einstellungen ändern muss?

Jein. Das trifft für 16-Bit-Timer zu, ist aber nicht ganz vollständig. 
Da hilft dir das Datenblatt. Du solltest dir über die Funktion der COM-, 
WGM- und CS-Bits im klaren sein. Versuche einfach mal, die 
Einstellungen, die hiermit gemacht werden:

>    ldi      temp1, 1<<COM1A1 | 1<<WGM11
>    out      TCCR1A, temp1

>    ldi      temp1, 1<<WGM13 | 1<<WGM12 | 1<<CS12
>    out      TCCR1B, temp1

an Hand des Datenblattes vom ATMega8 nachzuvollziehen. Wenn du es heraus 
hast, melde dich wieder.

MfG Spess

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.