Hi
Sorry bin noch blutiger Anfänger in der Mikrocontrollerprogrammierung.
ich bin gerade dabei meine ersten Versuche mit der Hardware PWM
durchzuführen. Deshalb wollte ich erstmal zum testen eine LED dimmen.
Leider funktioniert das mit dem dimmen nicht, die Led blinkt zwar aber
sie wird weder dunkler noch heller. Die zweite Led soll nur anzeigen ob
er die Tastendrücke registriert hat.
Was muss ich an dem Programm ändern damit es geht?
Vielen dank schonmal für eure Antworten.
wenn du dir mal im Datenblatt durchliest welche Parameter was tun und
danach mal über deine Prescalereinstellung nachdenkst (oder sogar mal
nachrechnest), dann könntest du schon selbst auf die Lösung kommen.
Ansonsten gibts dazu ne sehr schöne Erklärung im Roboternetz.
bye
Frank
Kannst du 'funktioniert immer noch net richtig'
etwas präzisieren?
Hast du eine Ahnung davon, wie schnell so ein µC arbeitet?
So kurz kannst du gar nicht auf den Taster drücken, dass
deine Schleife nicht das A um jeweils 30 Einheiten
von 0 weg bis zum Overflow hochzählt.
1 Millisekunde sind für dich verdammt kurz. Für einen
µC ist das aber eine halbe Ewigkeit.
Der MC dimmt halt nicht sauber, sondern ab und zu leuchtet die Led
heller, obwohl ich eigentlich den Taster zum dunkler dimmen gedrückt
habe, wie könnte ich denn am besten das Problem, dass du weiter oben
beschrieben hast lösen?
Mit Waitms?
zb Indem du einen Tastendruck nur dann in einem
Schleifendurchlauf akzeptierst, wenn sie im
unmittelbar vorhergehenden Schleifendurchlauf
noch nicht gedrückt war.
Du musst dir also in einer Variablen merken,
ob die Taste gedrückt ist oder nicht.
In der Schleife machst du dann (Pseudocode)
jetziger Tastenzustand = Taste abfragen
if jetziger Tastezustand nicht gleich vorherigem Tastenzustand
; -- Tastenzustand hat sich verändert
if jetziger Tastenzustand ist gleich gedrückt
; -- die Taste wurde gedrückt
mach was immer beim Drücken einer Taste notwendig ist
end if
; -- der jetzige Tastenzustand wird für den nächsten
; -- Schleifendurchlauf zum vorhergehenden Tastenzustand
vorheriger Tastenzustand = jetziger Tastenzustand
end if
PS: Bei einer 8 Bit PWM sind 30 Stufen schon etwas heftig.
Deine Veränderung des Tastgrades hat keinerlei Begrenzung nach oben und
unten. Wird die Up-Taste länger gedrückt, dann läuft der Wert oben raus
und unten wieder rein, bei Down-Taste genauso.
Um sowas zu programmieren musst Du erstmal ganz klein beginnen. Du musst
erstmal eine Tastenentprellung mit Flankenerkennung verstehen und
programmieren. Ansonsten vera..lbert sich Dein Programm nach allen
Regeln der Kunst.
In ASM könnte ich Dir ein paar Tips geben (in C Karl Heinz), aber in
BASCOM ist mir das zu blöd.
Ich manipuliere übrigens die I/O-Register des AVRs lieber selbst (statt
"config xyz"-Zauberformeln), dann weiß ich wenigstens was passiert, denn
das Datenblatt ist in Punkto Funktionsbeschreibung verbindlich und auch
recht konkret. Das dürfte auch in BASCOM funktionieren, wird bei
entsprechender Schreibweise (Bits beim Namen nennen) dann auch von
Leuten verstanden, die in ASM oder C zu Hause sind.
...
Danke für deinen Tipp Kallius, dein Vorschlag hat schon etwas gebracht,
jetzt würde nur noch die Begrenzung nach oben und unten fehlen. Wenn ich
nämlich die Led ganz ausschalten will, geht das nicht sondern sie
leuchtet immer noch ein bisschen. Weißt du zufällig wie ich das
programmiern muss um den Taster gedrückt halten zu können um die Led zu
dimmen? Ich hab das zwar mit Loop Until gemacht aber das hat nicht
richtig funktioniert. So ich hab jetzt die Schrittweite geändert jetzt
geht das Ausschalten ganz gut.
Jetzt fehlt nur noch die Tastenhalt Funktion.
Hi,
auch wenn Compare auf NUll steht, wird die LED noch schwach leuchten.
[Datenblatt Mega48 Seite 97]
>> If the OCR0A is set equal to BOTTOM, the output will>> be a narrow spike for each MAX+1 timer clock cycle.
Hier hilft nur: PWM in diesem speziellen Fall abschalten!
Das lässt sich mit BASCOM sicher auch irgentwie bewerkstelligen, weiss
ich aber nun auch nicht im Detail wie.
Be ner LED ist das evtl. noch akzeptabel - bei einer Vollbrücke
(Fahrregler mit Richtungsumkehr) knallts dann immer
Gruß
AxelR.
'Hardware PWM fürs LED dimmen mit Timer 1
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
Dim A As Integer
Config Pind.5 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
'Timer 1 einrichten: 8bit Modus
Do
waitms 100
If Pind.2 = 1 Then 'Taster 1 wird gedrückt
waitms 10
If Pind.2 = 1 Then
If A < 255 Then
A = A + 1 'LED um 1 Stufe heller dimmen
End If
End If
End If
If Pind.3 = 1 Then 'Taster 2 wird gedrückt
waitms 10
If Pind.3 = 1 Then
If A > 0 Then
A = A - 1 'LED um 1 Stufe dunkler dimmen
End If
End If
End If
Compare1a = A
Loop
End
BASCOM -, was kommt da am Ende wohl als ASM raus??
Gruß
AxelR.
Danke für das Programm Axel,
Ich wollte halt zum Einstieg zuerst mit Bascom programmieren und dann
später auf Assembler umsteigen. Außerdem kann ich da auch mein
bescheidenes Programmierwissen aus der Schule mit Visual Bascic
anwenden.
Da ich später auch unter Linux programmieren will ist Assembler
natürlich schon besser.
@Paul
>PWM_mit_Timer1.asm (9,7 KB, 7 Downloads)
Hätte ich auch so geschrieben :-))
@Fabian
ist ja keine Schande - so meinte ich das nicht.
Dein Problem scheint ja auch nicht die Programmiersprache ansich zu
sein, sondern das Verständnis für die logischen Abläufe...
Mal Dir doch zuerst ein Ablaufplan ("PAP" sagt mein Chef immer ->
Flowchart).
Das wird schon.
achja:
Gehts denn jetzt?
Gruß
xlR.
Ja danke es tut, jetzt kann ich mal gucken ob ich das Programm für die
Radioabstimmung hinbekomme die Led dimmen war dafür die Vorübung. Falls
ihr mir noch weiter helfen wollt dann schaut mal in diesen Beitrag rein.
Für eure Tipps wär ich sehr dankbar.
Beitrag "PLL per Software"
Hi ich bins nochmal und zwar hab ich jetzt nen zweites Programm
geschrieben. Leider tut es noch nicht richtig, ich will jetzt nen
Schritt weiter gehen und
zwar folgendes: Wenn ich die Taster rauf runter drücke, dann soll er
solang die Spannung erhöhen bzw senken bis an PD4 ein High Signal
anliegt will ich noch mit ner Led machen später kommt da dann nen
Lowpassfilter hin und ne PWM Schaltung von Läubi (siehe Link).
Gleichzeitig soll dann an PD6 ne zweite Led solange aufleuchten wie der
Mc noch die Spannung erhöht, bis das High Signal anliegt. Im Moment tut
sich die Led noch garnicht verändern.
Hi, eine weitere Frage, wie kann ich denn folgendes Programmieren?
Wenn ich nen Taster einmal drücke soll er ständig eine bestimmte Aktion
durchführen, solange bis ich den Taster wieder drücke.
Das mach ich ja , mit Loop aber wie geht das genau, ich hab schon
ziemlich viel probiert aber es hat nicht richtig funktioniert???
Danke für eure Hilfe.
In der Schleife ein ein Bit setzen, wenn Du den Taster drückst. Wenn Das
Bit 1 ist, die Schleife immer wieder ausführen. Wenn der Taster erneut
gedrückt wird UND das Bit immer noch 1 ist, das Bit auf 0 setzen und die
Schleife verlassen. Mit EXIT kannst Du "schadlos" aus Schleifen
springen.
MfG Paul
Ich habs jetzt einige Male probiert,
leider funktioniert das immer noch nicht: ich will das auf Tastendruck
die Led solange hoch runter dimmt bis ich einen der Taster hoch runter
erneut drücke. Kann hier vielleicht bitte jemand nen Codeausschnitt
reinstellen?
jetzt mal wie ich das machen würde: (kein Quelltext)
If Taster.hoch=1 then
Do
PWMSpannung=PwmSpannung+1 (und natürlich setzen (wie geht das?))
Loop until Sender.da=1 bis an der anderen Leitung ein high signal
anliegt
end if
Ich arbeite ja noch an der anderen Version und habe mir dafür sogar ein
(analoges) Speicheroszi zugelegt. Leider ziehe ich gerade um und kann
deswegen das Radio noch nicht optimieren.
Probier mal ob das geht. Ich konnte es nicht testen, aber an dem kannst
du ja villeicht erkennen was bei dir nicht geht (wenn das überhaupt
funktioniert)
Hi
Danke für eure Antworten jetzt tuts so wie es soll !
Dann werde ich schauen ob ich das Programm jetzt fürs Radio entwerfen
kann.
RDSAnfänger schön dich hier im Forum mal wieder zu sehen.
Hast du mal wieder in den Thread Einfaches Radio basteln oder Pll per
Software geschaut? Da wurden schon ein paar Lösungsvorschläge gepostet.
Mir ist gerade noch ein Problem aufgefallen und zwar funktioniert die
Begrenzung nach unten noch nicht richtig? Wenn er ganz runtergedimmt
hat, dann leuchtet die Led wieder in voller Stärke. Der $crystal Wert
muss natürlich nur einmal vorhanden sein und 8000000 betragen. Nach oben
geht sie, aber warum geht sie nicht nach unten?
ich habe auch keine Idee woran das liegt. Villeicht geht es ja wenn du
>1 einsetzt statt >0. Das mit der Frequenzfolgung hab ich gelesen.
Leider kann ich momentan noch keinen Frequenzteiler beziehen und auch
meine Schaltung befindet sich in irgendeinem Container. Das mit dem PWM
habe ich übrigens auch mal versucht, allerdings sofort wieder
aufgegeben, weil ich nicht wusste wie man einen guten Filter baut
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang