Hallo, Ich programmiere mit Bascom und habe den Atmega8 µC. Ich möchte, dass bei jedem Tastendruck an PB4 die Led an PB3 in 10 Stufen herunter gedimmt wird. Nach den 10 Stufen soll sie wieder an der ersten Stufe anfangen. Schaltplan: GND-------[Taster]-------PB4 GND-------[LED]----------PB3 Code: $regfile = "m8def.dat" $crystal = 16000000 'externer Quarz $baud = 19200 $hwstack = 32 $swstack = 8 $framesize = 24 Config Pinb.4 = Input Config Pinb.3 = Output ...Ab hier weiß ich nicht mehr weiter... Es Währe schön wenn jemand den code für mich fortsetzen könnte. Ich bin noch relativer Anfänger und bin aus dem Datenblatt auch nicht viel schlauer geworden. Ich freue mich schon auf eure Antworten Viele Grüsse Matze
> Ich möchte, dass bei jedem Tastendruck an PB4 die Led an PB3 in 10 > Stufen herunter gedimmt wird. Nach den 10 Stufen soll sie wieder an der > ersten Stufe anfangen. > ...Ab hier weiß ich nicht mehr weiter... 1. Array mit PWM-Werten füllen 2. Endlos-Schleife 2.1 Tastenbetätigungen 1-10 in Variablen zählen 2.2 Wert der Variablen prüfen, wenn > 10 auf 1 setzen 2.3 dazugehörige PWM aus einem Array holen 2.4 PWM ausgeben Otto
Danke Otto, doch ich habe noch folgende Probleme: > 1. Array mit PWM-Werten füllen Da weiß ich leider nicht wie das geht. > 2.3 dazugehörige PWM aus einem Array holen > 2.4 PWM ausgeben Weiß ich leider auch nicht wie das geht. Deswegen, ich fange gerade erst mit diesem Thema an und bin noch nicht so mit Bascom vertraut. Viele Grüsse Matze
Für keine schule. Ich bin 15 Jahre alt und ich mache das als Hobby. Kannst du mir vieleicht weiterhelfen? Matze
Hast Du Dir schonmal die von BASCOM mitgelieferten Codebeispiele angesehen? Ich selbst werde Dir kaum helfen können, denn mein Programmierstil ist in BASCOM nur schwer umsetzbar. Um eine PWM mit Up/Down-Tasten zu realisieren würde ich: Im Reset: - Ports initialisieren, Stackpointer einrichten, usw. - Einen Timer aktivieren, der regelmäßige Interrupts auslöst Im Timer-Interrupt: - einen PWM-Zähler hochzählen - PWM-Zähler mit PWM-Sollwert vergleichen und Port ein/ausschalten - bei Überlauf des PWM-Zählers die Tasten abfragen und entprellen In der Mainloop: - Ergebnisse der Tastenentprellung pollen und PWM-Sollwert anpassen Die Kunst des Programmieren besteht im Wesentlichen darin, die zu lösende Aufgabe in kleine, überschaubare Teilaufgaben zu zerlegen, die dann in Programmcode gegossen werden können. Ich hänge Dir mal ein BASCOM-Programm an, in dem neben anderen Dingen auch eine Software-PWM und eine Tastenabfrage vorkommt. Vielleicht hilft es Dir ja bei der Suche nach Deinem eigenen Programmierstil und bei der Suche nach Lösungen. ...
Hannes schrieb: > Die Kunst des Programmieren besteht im Wesentlichen darin, die zu > lösende Aufgabe in kleine, überschaubare Teilaufgaben zu zerlegen, die > dann in Programmcode gegossen werden können. Auch solltest Du zuerst "kleinere Brötchen backen": - lass Deine LED blinken - schalte Deine LED mit Deinem Taster ein, solange dieser betätigt ist - realisiere ein Umschalten des Zustandes der LED bei jedem Tastendruck. Eine weitere Kunst besteht darin, sich zu überlegen, wie man sein Programm testet und Möglichkeiten zu finden, das Programm zu debuggen. Eine LED ist dafür etwas wenig, denn Du müsstest zunächst prüfen, ob die Variable richtig zählt - dafür wären zunächst mindestens 4 LED hilfreich, auf welche Du Dir die Zählvariable anzeigen lässt. Gruss Otto
Vielen dank Hannes Lux für Dein tolles Programmierbeispiel. Vielen dank Otto für deinen Hinweiß, doch diese Projekte habe ich schon alle gemacht. Währe es nicht Möglich eine Variable zu erstellen, in die man die Hellig/Geschwindigkeit schreiben kann. Ich stell mir as folgendermaßen vor: config PINB.4 = input Do 'Endlosschleife anfang If PINB.4 = 0 then Hell = Hell + 1 'Bei jedem Tastendruck eins Heller werden If Hell = 10 then goto Hell = 1 'Bei 10 wieder auf 1 ???????? = Hell Loop 'Endlosschleife ende Die ???????? Variable ist die, die die Helligkeit der LED bestimmt. Gruss Maurice
> If Hell = 10 then goto Hell = 1
Wenn Du 10 Stufen haben möchtest:
If Hell > 10 then Hell = 1
Otto
Ich spreche kein BASCOM aber es müsste ungefähr so aussehen: ARRAY[1] = Wert der PWM für Stufe 1 ARRAY[2] = Wert der PWM für Stufe 1 .... .... und im Loop: PWM = ARRAY[Hell]
> Auch solltest Du zuerst "kleinere Brötchen backen":
Jou, Otto, mach' ich... (falls Du mich überhaupt gemeint hast)
In Bascom bin ich aber nicht so fit, ich werkele lieber in ASM.
...
@Hannes Nein - Dich meinte ich nicht - aber das weißt Du wahrscheinlich ich kann auch kein BASCOM...... Gruss Otto
Das mit dem Array ist ja gut und schön, vorerst würde es doch aber reichen, den Sollwert bei jedem Tastendruck um 8 oder 16 (10 ist ein unglücklicher Wert weil 256 nicht restlos durch 10 teilbar ist) zu vermindern. ...
Das ist natürlich auch eine Möglichkeit, wenn eine konstante Zunahme der Helligkeit erwünscht ist. Viele Wege führen nach Rom....
Naja, ich sehe es so, dass Matze spielerisch die Grundlagen lernen will. Da wäre ein gutes Programm kontraproduktiv. Wer z.B. noch nicht von Tastenprellen bei einfachen Tastenabfragen genervt wurde, zeigt meist wenig Einsicht, einen vernünftigen Entprellalgorithmus zu verwenden. Dieses Beispiel lässt sich auf fast alle Details übertragen. ...
> Naja, ich sehe es so, dass Matze spielerisch die Grundlagen lernen will. > Da wäre ein gutes Programm kontraproduktiv. Ergänzend eventuell noch der Hinweis, dass BASCOM eigentlich nur für Mikrocontroller-Einsteiger sinnvoll ist, die BASIC bereits können. Aber wenn Du (=Matze) jetzt damit angefangen hast, bleibe erst einmal dabei, bist Du dieses Projekt fertig hast.
> Ergänzend eventuell noch der Hinweis, dass BASCOM eigentlich nur für > Mikrocontroller-Einsteiger sinnvoll ist, die BASIC bereits können. BASIC (in mehreren Dialekten) benutze ich nun schon 20 Jahre. Bei AVRs bevorzuge ich aber ASM, denn damit kann ich meine Wünsche (an den AVR) präziser formulieren. Das oben gepostete BASIC-Programm entstand aus einer Laune heraus und diente lediglich als Demonstration, dass man meinen Programmierstil auch in BASIC einhalten kann. ...
Ich habe die Lösung gefunden!!!!!!!!!!!!!!!!!!!!!!!!! :-) Code: $regfile = "M8DEF.DAT" $crystal = 12000000 $baud = 19200 $hwstack = 32 $swstack = 8 $framesize = 24 Dim Zeittimer As Word Dim Richtung As Bit Config Timer0 = Timer , Prescale = 64 On Timer0 Enable Timer0 Start Timer0 Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 1 Config Pinb.4 = Input Enable Interrupts Do If Pinb.4 = 0 Then Capture1 = Capture1 + 10 End If Compare1a = Capture1 Loop Trotzdem danke für alle Antworten!!!!!!!!! Viele Grüsse Maurice
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.