Forum: Mikrocontroller und Digitale Elektronik Led mit PWM bei Bascom steuern (atmega8)


von Matze (Gast)


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

von Otto (Gast)


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

von Matze (Gast)


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

von Hannes Lux (Gast)


Lesenswert?

Für welche Schule musst Du das machen?

...

von Matze (Gast)


Lesenswert?

Für keine schule.

Ich bin 15 Jahre alt und ich mache das als Hobby.

Kannst du mir vieleicht weiterhelfen?

Matze

von Hannes Lux (Gast)


Angehängte Dateien:

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.

...

von Otto (Gast)


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

von Matze (Gast)


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

von Otto (Gast)


Lesenswert?

> If Hell = 10 then goto Hell = 1

Wenn Du 10 Stufen haben möchtest:

If Hell > 10 then Hell = 1

Otto

von Otto (Gast)


Lesenswert?

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]

von Hannes Lux (Gast)


Lesenswert?

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

...

von Otto (Gast)


Lesenswert?

@Hannes

Nein - Dich meinte ich nicht - aber das weißt Du wahrscheinlich

ich kann auch kein BASCOM......

Gruss Otto

von Hannes Lux (Gast)


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.

...

von Otto (Gast)


Lesenswert?

Das ist natürlich auch eine Möglichkeit, wenn eine konstante Zunahme der 
Helligkeit erwünscht ist.

Viele Wege führen nach Rom....

von Hannes Lux (Gast)


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.

...

von Otto (Gast)


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.

von Hannes Lux (Gast)


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.

...

von Matze (Gast)


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

von Paul Baumann (Gast)


Lesenswert?

Was machst Du eigentlich mit dem Timer 0?

MfG Paul

von Matze (Gast)


Lesenswert?

@Paul: Das kannst du weglassen.

Gruss

Matze

von Paul Baumann (Gast)


Lesenswert?

Ja, eben. ;-)
MfG Paul

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
Noch kein Account? Hier anmelden.