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
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 LEDhttp://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM
Woran fehlt's denn?
Volker
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 ^^
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
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
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
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 :)
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
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
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