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
Ich habs gerade nochmal getestet es funktioniert immer noch net richtig.
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?
Inkremetiere bzw. dekrementiere A mal nur um 30, wenn die Taste gedrückt UND dann wieder losgelassen wurde.
... mit If Pind.2 = 1 Then Bitwait Pind.2, Reset A = A + 30 End If ... oder so
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.
> geht das nicht sondern sie > leuchtet immer noch ein bisschen. Compare1a = 130 + A Logisch. Dein Compare Wert wird ja auch nicht kleiner als 130
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.
1 | #define PWM_ROT OCR0A
|
2 | |
3 | if (PWM_ROT==0 && rt == 1){ |
4 | TCCR0A&= ~(1<<COM0A1); |
5 | rt=0; |
6 | }
|
7 | if (PWM_ROT>0 && rt == 0){ |
8 | TCCR0A|= (1<<COM0A1); |
9 | rt=1; |
10 | }
|
Hi danke für eure Antworten, weiß denn jemand zufällig wie ich das mit dem Taster gedrückt halten programmieren kann?
'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?
Schau mal, ob es zu Deinem BASCOM eine Dokumentation oder Hilfe gibt. Wenn ja, dann schau Dir mal den Befehl "debounce" an. ...
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)
1 | Config Portd.6 = Output 'LED |
2 | Config Pind.5 = Output |
3 | Config Pind.4 = Input 'taster gedrueckt |
4 | Config Pind.3 = Input ' sender verfügbar? |
5 | Dim I As Byte 'Spannung |
6 | 'Hauptschleife |
7 | Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 |
8 | Do
|
9 | If Pind.4 = 1 Then 'wenn taster hoch gedrückt ist |
10 | Portd.6 = 1 'Led an |
11 | Do
|
12 | I = I + 1 'spannungsvariable um 1 erhöhen |
13 | Compare1a = I 'spannung setzen |
14 | Waitms 10 'warten |
15 | Loop Until Pind.3 = 1 |
16 | End If |
17 | Portd.6 = 0 |
18 | Loop
|
19 | End
|
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.
Mein ihr das Programm wäre so ok oder könnte ich es noch optimieren? Funktionieren tut es in der Form
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
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.