Led mit PWM bei Bascom steuern (atmega8)

Gast #1218205
Lesenswert?

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
Gast #1218404
Lesenswert?

> 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
Gast #1218792
Lesenswert?

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
Gast #1218976
Lesenswert?

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.

...
Angehängte Dateien:
Gast #1218994
Lesenswert?

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
Gast #1219010
Lesenswert?

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
Gast #1219031
Lesenswert?

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.

...
Gast #1219040
Lesenswert?

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.

...
Gast #1219045
Lesenswert?

> 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.
Gast #1219058
Lesenswert?

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

...
Gast #1219089
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren