mikrocontroller.net

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


Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für welche Schule musst Du das machen?

...

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für keine schule.

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

Kannst du mir vieleicht weiterhelfen?

Matze

Autor: Hannes Lux (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> If Hell = 10 then goto Hell = 1

Wenn Du 10 Stufen haben möchtest:

If Hell > 10 then Hell = 1

Otto

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hannes

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

ich kann auch kein BASCOM......

Gruss Otto

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Otto (Gast)
Datum:

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

Viele Wege führen nach Rom....

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was machst Du eigentlich mit dem Timer 0?

MfG Paul

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Paul: Das kannst du weglassen.

Gruss

Matze

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, eben. ;-)
MfG Paul

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.