Forum: Mikrocontroller und Digitale Elektronik LED Lauflicht mit Fader Effeckt


von Matze (Gast)


Lesenswert?

Hi all,


ich möchte mir das Lauflicht mit einen Atmega 8535 bauen:

http://www.youtube.com/watch?v=c_OokiDGNqE

Der Fader effeckt soll aber so ausehen:
1 Led leuchtet voll und die 3 leds danach laufen nach.

Ich schaffe meinen 8535 so zu programieren das alle Leds angehen 2 sec 
warten und dann das lauflicht beginnt aber halt ohne Fader effeckt.

Ich habe schon x Tutorials durchgelesen aber ich raff einfach nicht wie 
ich das hinbekommen soll.

Ich habe gelesen mit einen Soft-PWM klappt das - Stimmt das? wenn ja wie 
schaffe ich damit die 3 leds "nachlaufen"

Ach ja ich porg mit - Bascom Basic und PP auf dem Pollin Atmel 
Evalutionboard 2.0

Könnte mir da wer weiter helfen?

Wäre über hilfe sehr dankbar.

gruß
Matze

von Paul P. (dorpreuss)


Lesenswert?

Hi,

mit der Software PWM hast du schon ganz recht. Wenn immer 3 LED's 
nachlaufen sollen, brauchst du 3 PWM's und du musst jede PWM im 
richtigen moment an die jeweilige LED routen.

Das ist schwierig zu erklären. Hast du dir mal im Tutorial angeschaut, 
wie die Software PWM in Assembler umgesetzt wurde?

Wenn du das verstanden hast, ist es leichter dir zu erklären wie, wie 
man das Fading hinbekommt.

Mir fallen auf die schnelle zwei Möglichkeiten ein. Entweder die 
schiebst die OCR-Werte durch die PWM-Kanäle, oder die schiebst das 
Bitmuster, welches festlegt, welche LED leuchten soll. Ungefähr so:

Wenn du z.B. an PORTB 0b00000001 ausgibst, wird die PWM_1 an Bit 0 
erzeugt. Dann rutscht das Lauflicht eins weiter. dazu wird das Bitmuster 
geschoben (0b00000010). PWM_1, die eben ihr Signal an Bit 0 erzeugt hat, 
gibt nun ihr Signal nun an Bit 1 aus.  So verfährst du mit allen 
PWM-Kanälen.


Ich hoffe das hilft dir ein wenig.


Gruß

Paul

von Dominique G. (dgoersch)


Lesenswert?

Schau dir mal meinen Code aus 
Beitrag "Re: Ansteuerung von 80 LEDs mit PWM" an. Dort nutze ich 
Soft-PWM mit 5 Kanälen. Um das Faden auf die letzten 3 LEDs auszuweiten 
müsste er etwas angepasst werden, aber das sollte nicht allzuschwer 
sein.

Gruß
Dominique Görsch

PS: Fände es gut, wenn du deine Erweiterungen dann auch wieder hier 
veröffentlichen würdest.

von Matze (Gast)


Lesenswert?

Hey Paul P.

Okay das verstehe ich soweit.

Meinst du das Tutorial?:
http://www.mikrocontroller.net/articles/Soft-PWM

ich habe das mal spaßeshalber in Bacon Basic eingefügt.
Der bringt mir da lauter fehler.

Ich versteh nicht ganz wie ich das mit BB einfügen und so umändert muss 
damit ich mein lauflicht hab -.-

von Dominique G. (dgoersch)


Lesenswert?

Matze wrote:
> http://www.mikrocontroller.net/articles/Soft-PWM
>
> ich habe das mal spaßeshalber in Bacon Basic eingefügt.
> Der bringt mir da lauter fehler.

Mag daran liegen, dass das C ist ;)

von Paul P. (dorpreuss)


Lesenswert?

Hallo,

ich meinte dieses Tutorial:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM

Das Codebeispiel, welches sich ganz unten auf der Seite befindet.

Du kannst natürlich nich C-Code oder Assembler-Code in BASCOM kopieren 
und hoffen dass was geht. ;-)

Ich weiß ja nich, wie es bei dir mit Assemblerprogrammierung steht. Ich 
habe mit Assembler angefangen und muss sagen, dass man durch nichts 
einen so guten Einblick in die Funktionsweise eines µC bekommt. Wenn man 
mit Hochsprachen programmiert, ist es außerordentlich nützlich, wenn man 
weiß was da eigentlich im Inneren passiert.

Es wäre auf jeden Fall gut, wenn du dir diesen Assemblercode mal 
anschaust. Dann hat man ne Basis auf der man sich unterhalten kann. 
Ich/wir werden dir dann auch weiterhelfen. Wenn du Prinzip das richtig 
durchschaut hast, wirst du wohlmöglich selbst darauf kommen, wie du dein 
Problem lösen kannst. Und das geht runter wie Öl, wenn mans alleine 
schafft.

Gruß

Paul

von Wolfgang K. (opendcc)


Lesenswert?

Hallo,

ich habe sowas bei meinen Decodern für die Modellbahn implementiert 
(z.B. Baustellenlauflicht mit nachlaufender Schleppe, welche abdimmt). 
Geschrieben in C, zu finden auf 
www.opendcc.de/opendecoder/opendecoder.html

Servus Wolfgang

von Axel (Gast)


Lesenswert?

Hätte noch ne Software-PWM, 12-Kanal, 8 bit die ähnlich der 2. Methode 
in dem vorhin genannten Artikel konstruiert ist. (In C, für PIC18F2550). 
Läuft bei 200 Hz, ca 10% Prozessorlast.

von Ingo L. (grobian)


Lesenswert?

@wolfgang
>Geschrieben in C, zu finden auf
>www.opendcc.de/opendecoder/opendecoder.html

wo denn da ??

von Matze (Gast)


Lesenswert?

hey,

danke für die vielen antworten.
Kann ich das nicht mit Bascon irrendwie machen?

ich habe hir einen Code der die Leds in unterschiedlichen helligkeiten 
läuchten lässt.

Genau sowas brauche ich ja ... jetzt muss sich das nur noch so bewegen:

http://www.youtube.com/watch?v=c_OokiDGNqE


gruß

von Matze (Gast)


Lesenswert?

Oh hab den Code vergessen :D
1
Led_1 Alias Portc.0
2
Config Led_1 = Output
3
Led_1 = 0
4
5
Led_2 Alias Portc.1
6
Config Led_2 = Output
7
Led_2 = 0
8
9
Led_3 Alias Portc.2
10
Config Led_3 = Output
11
Led_3 = 0
12
13
Dim Led_1_value As Byte
14
Dim Led_2_value As Byte
15
Dim Led_3_value As Byte
16
17
18
Config Timer0 = Timer , Prescale = 1                        '=122 Durchläufe die Sekunde
19
Enable Timer0
20
Enable Interrupts
21
22
23
Led_1_value = 5                                             'dunkel aber nicht aus
24
Led_2_value = 50                                            'mittel
25
Led_3_value = 255                                           'hell
26
27
28
Do
29
   If Led_1_value <= Timer0 Then
30
      Led_1 = 0
31
   Else
32
      Led_1 = 1
33
   End If
34
   If Led_2_value <= Timer0 Then
35
      Led_2 = 0
36
   Else
37
      Led_2 = 1
38
   End If
39
   If Led_3_value <= Timer0 Then
40
      Led_3 = 0
41
   Else
42
      Led_3 = 1
43
   End If
44
45
Loop
46
End

von MWS (Gast)


Lesenswert?

Das ist ja übles Zeugs...  Timer in der Hauptschleife abfragen und den 
MC damit beschäftigen, brrrrr.

Auch das Enable Interrupts kannst Du Dir sparen, sind ja keine drin. 
Aber genau damit würde man es allerdings machen: mit einem Interrupt.

von Matze (Gast)


Lesenswert?

@ MWS

könntest du mir vllt sagen wie ich das machen könnte?

bin noch ziemlich neu in dem gebiet.

gruß
matze

von Dominique G. (dgoersch)


Lesenswert?

Ich hab dir doch nen Link auf Bascom-Code für PWM gegeben.... irgendwie 
fühl ich mich ignoriert ;)

von MWS (Gast)


Angehängte Dateien:

Lesenswert?

Lies Dich doch zuerst ein bisschen ein, gibt genügend Tutorials. Die 
Meisten helfen Dir gern wenn sie sehen daß Du Deine Hausaufgaben gemacht 
hast und motiviert bist etwas zu lernen.

Prinzipiell geht's so: man lässt einen Zähler laufen, das machst Du ja 
bereits, der löst dann beim Überlaufen oder bei einem bestimmten Wert 
einen Interrupt aus, darin zählt ein Zähler hoch und vergleicht die 
Werte, setzt oder löscht die einzelnen Ports, ähnlich wie Dein Code in 
der Hauptschleife, nur halt im Hintergrund.

Die Hauptschleife kann dann Anderes erledigen,, z.B. die Werte der 
einzelnen Kanäle setzen um den Fadereffekt zu erreichen.

Hier ist noch'n Link zu einer ähnlichen Diskussion:
Beitrag "Re: Moodlight Sourcecode hilfe"

Bugbereinigten Code hab' ich nochmal angehängt. Lern aber nicht von mir, 
denn es ist schlechter Programmierstil und RAM-Verschwendung aus einem 
Speicher Array in ein Variablen-Array einzulesen, aber die Funktion zu 
zeigen war damit deutlicher möglich.

Und frag' mich nicht, was ich da mache, ich mag das nicht im Einzelnen 
erklären. Der Code ist zwar leistungsfähig, jedoch schon etwas komplexer 
als eine Supersimpelversion, unsd wenn Du gerade beginnst, Dich dafür zu 
interessieren, ein bisserl schwer zu verstehen. Aber laufenlassen und in 
der Hauptschleife ein wenig rumspielen geht sicher. :-)

Es gibt noch Einfacheres, dazu musst Du halt mal suchen, hier ist aber 
nicht unbedingt ein typisches Bascom Forum, hier wird Dir eher mit C 
geholfen.

von Peter D. (peda)


Lesenswert?

Ingo Laabs wrote:
> @wolfgang
>>Geschrieben in C, zu finden auf
>>www.opendcc.de/opendecoder/opendecoder.html
>
> wo denn da ??

Pustekuchen, nüscht mit Download:

"Download Hexfile and Source Code (kommt bald, noch nicht ganz fertig)"


Aber hier nochwas in C:

Beitrag "16 Kanal PWM LED-Fader"


Peter

von Reinhold R. (rrose)


Lesenswert?

Hi,

ich habe dies hier mal aufgebaut:
http://www.ejberg.dk/ledfade2/index.html

Das Fading wird in ein Script geschrieben, das
mit assembliert wird. (eigene "Sprache")

In der PDF ist alles erklärt- in Englisch.

Gruß
Reinhold

von Dominique G. (dgoersch)


Lesenswert?

Was hast du mit den Platinen angestellt, dass die unter Wasser dürfen?

von Matze (Gast)


Lesenswert?

-.- ...

kann mir denn keiner wirklich helfen?
Ich kann alle 8 Leds unterschiedlich leuchten lassen ... ich kann ein 
lauflich ... nur wir soll ich das denn verbinden?

ich bin total verzweifelt! ich habe mir sicherheit über 90% alle 
beitrage im inet die man über googel finden kann angeschaut. nirrendswo 
wird beschrieben wie ich mit Bascom Fader + lauflicht verbinden kann.

Ich bin heute extra losgezogen und hab mir vom Conrad nen "Lernset" für 
50 Euro gekauft ...das hat mir auch nicht weiter geholfen :'-(

gruß
Matthias
ich schaff das ohne hilfe einfach nicht!

von Matze (Gast)


Lesenswert?

@ Dominique Görsc ehm sry ignorieren tu ich dich nicht ... aber 
irrendwie finde ich keinen Bascom code -.-

von MWS (Gast)


Lesenswert?

Also, Du kannst die Led's leuchten lassen ? Gut. Dann überleg doch mal 
wie's wäre ohne faden, das ist ein Lauflicht, also 8 Led's, von 1 bis 8 
zählen und dann wieder von 8 bis 1, immer mit ein bisserl Pause, 
Leistung der entsprechenden Led auf 100%. Nur fadet's jetzt nicht, es 
ist nur ein normales Lauflicht. Aber wenn man nun die Led 1 kleiner und 
1 größer als die aktuelle Led auf halbe Leistung und die Led 2 kleiner 
und 2 größer auf 1/3 Leistung setzt, dann fadet es. Code muss 
berücksichtigen daß Led 7 & 8 natürlich nicht plus 1 oder 2 gerechnet 
werden kann, und auch nicht Led 1 & 2 minus 1 oder 2. Code musst Dir 
schon selber schreiben. Mach' mal und wir sehen weiter.

von Dominique G. (dgoersch)


Lesenswert?

Matze wrote:
> @ Dominique Görsc ehm sry ignorieren tu ich dich nicht ... aber
> irrendwie finde ich keinen Bascom code -.-

In meinem Beitrag oben schrieb ich:
> Schau dir mal meinen Code aus
> Beitrag "Re: Ansteuerung von 80 LEDs mit PWM" an. Dort nutze ich
> Soft-PWM mit 5 Kanälen. Um das Faden auf die letzten 3 LEDs auszuweiten
> müsste er etwas angepasst werden, aber das sollte nicht allzuschwer
> sein.

In dem verlinkten Beitrag findest du die Zeilen:
> Foto hängt an.
> Video unter http://crap.dgoersch.info/wolke.avi.
> Source unter http://crap.dgoersch.info/wolke.bas.

Der Code ist sicher verbesserungswürdig, aber zeigt funktionierend das 
Faden von 5 LEDs (bzw. in meinem Fall LED-Gruppen, aber das spielt keine 
Rolle).

Gruß
Dominique Görsch

von Matze (Gast)


Lesenswert?

waor sau geil Dominique Görsch

es funz jetzt schon teilweiße. Habe jetzt deinen schaltplan auch voll 
begriffen und sehr viel daraus gelernt. Nur die LEDs "flackern" so ... 
also es ist sichtbat wie der µC die LED an und auschaltet also in deinem 
Video sind die übergänge weich ... bei mir nicht... und ich weiß nicht 
wie ich das wegbekomm. Ich habe einfach die befehle wo ich nicht bruache 
aus gekommert und habe "Enable Timer0" hinzugefügt hat aber nichts 
geholfen.

hast du oder jemand anderes eine idee wie ich den Fade sauber hinbekomm?

liegt das vllt an die einstellungen von meinen µC?

regfile = "m8535.dat"
$crystal = 16000000
$baud = 19200
$hwstack = 64
$swstack = 64
$framesize = 64

Config Portc = Output

Config Timer0 = Timer , Prescale = 1
Enable Timer0
On Timer0 Timer0_isr

'Sternegruppen
Gruppe1 Alias Portc.0
Gruppe2 Alias Portc.1
Gruppe3 Alias Portc.2
Gruppe4 Alias Portc.3
Gruppe5 Alias Portc.4

'Plastikfiguren
'Sonne Alias Portd.4
'Mond Alias Portd.5

Dim Zaehler As Byte , Pwmvar(5) As Byte , I As Byte
Dim Group As Byte , Pwm_sonne As Byte , Pwm_mond As Byte

'Grenzwerte fuer die Schleifen
Const Pwm_min = 0
Const Pwm_low = 10
Const Pwm_high = 50
Const Pwm_max = 150

Enable Timer0
Enable Interrupts

'Plastikfiguren auf festen Wert
'Pwm_sonne = 200
'Pwm_mond = 100

For I = Pwm_min To Pwm_low
   Pwmvar(1) = I
   Waitms 1
Next I

Main:
Do
Group = 1
   For I = Pwm_low To Pwm_high
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_high To Pwm_max Step 2
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_max To Pwm_high Step -2
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_high To Pwm_low Step -1
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_low To Pwm_min Step -1
      Pwmvar(group) = I
      Pwmvar(group + 1) = Pwm_low - I
      Waitms 1
   Next I

Group = 2
   For I = Pwm_low To Pwm_high
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_high To Pwm_max Step 2
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_max To Pwm_high Step -2
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_high To Pwm_low Step -1
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_low To Pwm_min Step -1
      Pwmvar(group) = I
      Pwmvar(group + 1) = Pwm_low - I
      Waitms 1
   Next I

Group = 3
   For I = Pwm_low To Pwm_high
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_high To Pwm_max Step 2
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_max To Pwm_high Step -2
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_high To Pwm_low Step -1
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_low To Pwm_min Step -1
      Pwmvar(group) = I
      Pwmvar(group + 1) = Pwm_low - I
      Waitms 1
   Next I

Group = 4
   For I = Pwm_low To Pwm_high
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_high To Pwm_max Step 2
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_max To Pwm_high Step -2
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_high To Pwm_low Step -1
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_low To Pwm_min Step -1
      Pwmvar(group) = I
      Pwmvar(group + 1) = Pwm_low - I
      Waitms 1
   Next I

Group = 5
   For I = Pwm_low To Pwm_high
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_high To Pwm_max Step 2
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_max To Pwm_high Step -2
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_high To Pwm_low Step -1
      Pwmvar(group) = I
      Waitms 1
   Next I
   For I = Pwm_low To Pwm_min Step -1
      Pwmvar(group) = I
      Pwmvar(1) = Pwm_low - I
      Waitms 1
   Next I

Loop
End


Timer0_isr:
   Zaehler = Zaehler + 1

   If Pwmvar(1) > Zaehler Then
      Gruppe1 = 1
   Else
      Gruppe1 = 0
   End If

   If Pwmvar(2) > Zaehler Then
      Gruppe2 = 1
   Else
      Gruppe2 = 0
   End If

   If Pwmvar(3) > Zaehler Then
      Gruppe3 = 1
   Else
      Gruppe3 = 0
   End If

   If Pwmvar(4) > Zaehler Then
      Gruppe4 = 1
   Else
      Gruppe4 = 0
   End If

   If Pwmvar(5) > Zaehler Then
      Gruppe5 = 1
   Else
      Gruppe5 = 0
   End If


'   If Pwm_sonne > Zaehler Then
'      Sonne = 1
'   Else
'      Sonne = 0
'   End If
'
'   If Pwm_mond > Zaehler Then
'      Mond = 1
'   Else
'      Mond = 0
'   End If
Return

von Dominique G. (dgoersch)


Lesenswert?

Das Flackern liegt vermutlich an der Geschwindigkeit. Der µC läuft bei 
mir mit 8 MHz, kontrollier mal deine FuseBits.

von Matze (Gast)


Lesenswert?

danke für den Tipp ... lag daran ... jetzt läuft es absolut sauber :D 
danke nochmal

gruß
matthias

von Dominique G. (dgoersch)


Lesenswert?

Kein Problem. Wie schon geschrieben, muss für Nachlauf ein bissl 
umgeschrieben werden, aber ist mal ein Anfang und ich denke es ist recht 
leicht zu verstehen durch die simplen Schleifen.

von Wolfgang K. (opendcc)


Lesenswert?

>
> Pustekuchen, nüscht mit Download:
>
> "Download Hexfile and Source Code (kommt bald, noch nicht ganz fertig)"
>
Hallo,

für diejenigen, die den Button download nicht finden:

http://www.opendcc.de/elektronik/opendecoder/SignalDecoder_V11.zip

Wobei jedoch so ein 'deep' link beim nächsten Update wieder anders 
heißen kann. Darum hatte ich oben nur die Hauptseite angegeben.

Servus Wolfgang

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.