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
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
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.
...
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.
...
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