mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED-Fading für Leuchtturm


Autor: Wilfried H. (willi_2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein freundliches Hallo an Euch alle hier.
Ich möchte heute mal Eure Hilfe in Anspruch nehmen. Ich baue im Moment 
gerade an einem Modell-Leuchtturm der natürlich auch ein Leuchtfeuer 
bekommen soll. Das Leuchtfeuer möchte ich durch 6 Leuchtdioden 
simulieren. Eine bereits bestehende  Schaltung über einen Timer und 
einen Dekadenzähler funktioniert zwar schon aber das Einfache 
nacheinander Ein- und Ausschalten sieht natürlich wenig realistisch aus. 
Bei der Suche nach Alternativen bin ich auf die Möglichkeit der PWM über 
einen µC gestoßen, die einen Fading-Effekt erzeugen kann. Damit möchte 
ich ein weiches Überblenden der einzelnen Dioden realisieren. Es soll 
also wie folgt funktionieren:
1.  LED1 -> fade-in;
2.  LED1 -> fade-out, LED2 -> fade-in;
3.  LED2 -> fade-out, LED3 -> fade-in;
4.  …, …
Als Zykluszeit für fade-in und fade-out habe ich mir erstmal so ca. 2s 
ausgedacht.

Aber trotz Studium vieler Beiträge bin ich gedanklich bei der Wahl der 
Methode noch nicht viel weiter.
Ich habe, soweit ich bisher gelesen habe die Möglichkeit der 
Hardware-PWM oder der Software-PWM um die LED's zu faden.
Da ich nach Möglichkeit einen vorhandenen ATmega8 verwenden möchte, ist 
glaube ich die reine HW-PWM wie sie z.B. im Tutorial beschrieben wird 
bei 6 LED’s nicht so geeignet. In einen Beitrag zum Thema habe ich den 
Hinweis auf den Einsatz eines Schieberegisters gefunden.
Hier der Link: Beitrag "Re: PWM in einem Lauflicht"
Die Idee gefällt mir recht gut. Sie beruht doch, so weit ich das 
verstehe, auf dem Prinzip das durch einen Puls ausgelöst vom µC-Timer 
(über eine ISR??) ein Signal durch das S-Register geschoben wird und 
jeweils einen Ausgang schaltet. Ein PWM-Kanal des µC übernimmt dann das 
Fading für die jeweils aktive LED. Liege ich da richtig? Wenn ich dieses 
Prinzip für meine Zwecke nutzen kann könnte ich doch auch meinen 
vorhandenen Dekadenzähler verwenden, oder?

Es wäre schön wenn Ihr mir bei meinem Problem weiter helfen könntet.

Mit freundlichen Grüßen Wilfried

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cooles Projekt!

Wilfried H. schrieb:
> [...]
> die reine HW-PWM wie sie z.B. im Tutorial beschrieben wird
> bei 6 LED’s nicht so geeignet. In einen Beitrag zum Thema habe ich den
> Hinweis auf den Einsatz eines Schieberegisters gefunden.
> Hier der Link: Beitrag "Re: PWM in einem Lauflicht"
> Die Idee gefällt mir recht gut. Sie beruht doch, so weit ich das
> verstehe, auf dem Prinzip das durch einen Puls ausgelöst vom µC-Timer
> (über eine ISR??) ein Signal durch das S-Register geschoben wird und
> jeweils einen Ausgang schaltet. Ein PWM-Kanal des µC übernimmt dann das
> Fading für die jeweils aktive LED. Liege ich da richtig?

So kann man das bei einem Schieberegister mit Enable-Eingang machen, ja. 
Da Du aber ja immer nur EINE aktive LED hast, waere ein 3-8-Line-Decoder 
fuer Dich die bessere Wahl.

Was aber mit Schieberegister oder Decoder NICHT funktioniert ist das 
gleichzeitige Fade-Out einer und Fade-In einer anderen LED. Hier waeren 
dann 2 Stueck 3-8-Line-Decoder sinnvoll.

In jedem Fall muss der enable natuerlich schnell genug schalten koennen 
und dabei nicht zu viel Leistung verbraten.

Die Hardware-PWM ist uebrigens perfekt geeignet!


Volker

Autor: L. K. (ladde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da du ja nur 2 von 6 LEDs gleichzeitig faden willst, brauchst du ja 
theoretisch (und auch praktisch) nur 2 PWM-Kanäle und 3 weitere Outputs.
Dazu noch 3 Widerstände und fertig ist die Laube. Ließe sich z.B. sehr 
günstig mit nem Tiny2313 realisieren, wenn ich grad keinen Denkfehler 
mache.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Codesammlung gibt es ein uraltes Projekt, welches, wenn ich mich 
recht erinnere, 5 LEDS wunderbar rundum faden kann.
Wäre genau das richtige für dich, wenn du nicht auf den 6 LEDs bestehst.

Ich geh mal suchen

Edit:
Das hier
Beitrag "AVR-Lauflicht"

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
L. K. schrieb:
> Da du ja nur 2 von 6 LEDs gleichzeitig faden willst, brauchst du ja
> theoretisch (und auch praktisch) nur 2 PWM-Kanäle und 3 weitere Outputs.
> Dazu noch 3 Widerstände und fertig ist die Laube. Ließe sich z.B. sehr
> günstig mit nem Tiny2313 realisieren, wenn ich grad keinen Denkfehler
> mache.

Mit der von mir vorgeschlagenen Loesung braucht man sogar nur EINE PWM 
und 3 Outputs... Oder worauf bezog sich das jetzt?

Volker

Autor: L. K. (ladde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte in meiner ersten Idee nen Denkfehler... Muss grad nochmal darüber 
nachdenken. Dachte man käme ohne externe ICs aus...

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
L. K. schrieb:
> Hatte in meiner ersten Idee nen Denkfehler... Muss grad nochmal darüber
> nachdenken. Dachte man käme ohne externe ICs aus...

Ich hatte auch einen Denkfehler: Die Decoder muessen ja abwechselnd 
weitergeschaltet werden. Man braeuchte also 1xPWM + 6xI/O-Pin fuer bis 
zu 16 LEDs. ;)

Volker

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und da er ja LEDs + Vorwiderstaende + Controller schon zu haben scheint, 
wuerde meine Loesung mit ca. 58 Cent zu Buche schlagen...

Volker

Autor: L. K. (ladde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier die 0-Cent Lösung: ;-)
Sowie ich Wilfried verstanden habe will er gleichzeitig eine LED 
ausfaden und die nächste einfaden.
Hier ne Möglichkeit mit 2 PWM-Kanälen und 6 GPIOs:
        ___     LED 1
PWM 1 -|___|-o-->|---- Out 1
             |
             |  LED 3
             o-->|---- Out 3
             |
             |  LED 5
             '-->|---- Out 5

        ___     LED 2
PWM 2 -|___|-o-->|---- Out 2
             |
             |  LED 4
             o-->|---- Out 4
             |
             |  LED 6
             '-->|---- Out 6
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)
Ist zwar ne ziemlich Pin-Verschwendung, aber meiner Meinung nach sehr 
einfach zu realisieren.

Gruß
Ladde

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mit der von mir vorgeschlagenen Loesung braucht man sogar nur EINE PWM
>und 3 Outputs...

Wozu noch einen Baustein mehr verbauen, wenn man die Sache auch komplett 
in einem Controller in Software nachbauen kann?

Autor: L. K. (ladde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein kleiner Nachtrag: Bin mir nicht sicher, ob man mit 8-bit schöne 
LED-Fades hinbekommt (der Mega8 hat ja nur einen 16-bit-Timer).
Macht man das ganze per Software-PWM kann man natürlich jeder LED einen 
eigenen Kanal spendieren und braucht dann nur noch 6 Pins.

Gruß
Ladde

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STK500-Besitzer schrieb:
>>Mit der von mir vorgeschlagenen Loesung braucht man sogar nur EINE PWM
>>und 3 Outputs...
>
> Wozu noch einen Baustein mehr verbauen, wenn man die Sache auch komplett
> in einem Controller in Software nachbauen kann?

1.) Um Pins zu sparen.

2.) Um eine PWM zu sparen.

3.) Um das Datensignal der PWM nicht als Spannungsquelle misbrauchen zu 
muessen. ;)


L. K. schrieb:
> Noch ein kleiner Nachtrag: Bin mir nicht sicher, ob man mit 8-bit schöne
> LED-Fades hinbekommt (der Mega8 hat ja nur einen 16-bit-Timer).

Ich bin mir sicher dass man auch mit einem 8-Bit-Timer schoene Fades 
hinbekommt. Aber koennte man nicht eine 16-Bit-PWM auch invertiert auf 
einem zweiten Port ausgeben? Bei der Decoder-Geschichte wuerde jeweils 
einer der Decoder ja auch nur invertieren.


Volker

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darf ich eure Aufmerksamkeit noch einmal auf
Beitrag "AVR-Lauflicht"
richten.
Da werkelt der kleinste Tiny, den es gab, und macht ein schönes 
Rundumlicht. Ganz ohne Timer, ganz ohne HW-PWM.
Dort ist auch ein Video.

Und die Beschränkung auf 5 LED existiert einzig und alleine aus dem 
Grund, weil der Kleine nicht mehr Outputpins hat.

Da sowieso ein Mega8 vorhanden ist, macht man dann zu den 5 LED am PortB 
noch 5 LED am PortC dazu und ändert das Programm so um, dass alles was 
an B ausgegeben wird auch auf C ausgegeben wird und hat dann sogar seine 
2 umlaufenden Lichtpunkte, wie es bei einem Leuchtturm sein muss. Und 
das bei 10 Led im Vollkreis.
In 10 Minuten ist die Schose fertig aufgebaut und programmiert.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
L. K. schrieb:

> Noch ein kleiner Nachtrag: Bin mir nicht sicher, ob man mit 8-bit schöne
> LED-Fades hinbekommt (der Mega8 hat ja nur einen 16-bit-Timer).

Zufall, gestern abend habe ich 8-Bit HW-PWM mit 2 LEDs ausprobiert (#). 
Das sah IMHO schon recht ansprechend aus. Ich kann mir gut ein 
Leuchtturmmodell damit vorstellen.

#) Beitrag "Zwischen 2 LEDs faden"

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Darf ich eure Aufmerksamkeit noch einmal auf
> Beitrag "AVR-Lauflicht"
> richten.

Noch besser! Besonders die geschickte Montage der SMD-LEDs gefällt mir. 
Rolf, wo bleibt das "versprochene" Video vom Modellhubi :)

Autor: Triti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: L. K. (ladde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mir grad nochmal den Beitrag "AVR-Lauflicht" angesehen und 
versucht, den asm-Code zu verstehen. Programmiere zwar selber auch meist 
asm, aber grad fehlt mir noch der Überblick..

Sehe ich es richtig, dass immer nur eine LED eingefadet wird, dann 
"ruckartig" ausgeschaltet wird und die nächste eingefadet wird?

Hab mir auch das Video zu gemüte geführt, aber das hat mich auch nicht 
schlauer gemacht. Frage mich ob mit dem vorgestellten Code auch die 
geforderten 2 Sekunden Fade-Zeit hinzubekommen sind, das Blau- (bzw. 
Rot-)Licht "dreht" sich ja ziemlich schnell...

Vielleicht irre ich mich aber auch; dann wärs schön, wenn jemand etwas 
Licht ins dunkel bringen könnte (wenns nicht zu off-topic wird).

Gruß
Ladde

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
L. K. schrieb:
> Habe mir grad nochmal den Beitrag "AVR-Lauflicht" angesehen und
> versucht, den asm-Code zu verstehen. Programmiere zwar selber auch meist
> asm, aber grad fehlt mir noch der Überblick..

Der Code ist auch ziemlich trickreich.
War das erste Stück AVR-Assemblercode den ich zu Gesicht bekommen habe.

> Sehe ich es richtig, dass immer nur eine LED eingefadet wird, dann
> "ruckartig" ausgeschaltet wird und die nächste eingefadet wird?

Ne. da wird nichts ruckartig ausgeschaltet.
Während die nächste LED aufdimmt, dimmt die vorhergehende ab.

Es werden 2 Werte in 2 Registern zurechtgelegt. Bei dem einen ist die 
eine LED an, beim anderen die andere.
Und dann wird wie wild umgeschaltet, wobei sich des Zeitverhältnis 
zwischen den jeweiligen On Zeiten immer mehr zum 2. Wert verschiebt.
-> Die 'PWM' der ersten LED wird immer kleiner, die der 2.ten LED immer 
größer.

Ist sie voll aufgedimmt, dann werden die Bitmuster weitergeschoben zur 
nächsten LED-Kombination und alles fängt von vorne an.

> schlauer gemacht. Frage mich ob mit dem vorgestellten Code auch die
> geforderten 2 Sekunden Fade-Zeit hinzubekommen sind, das Blau- (bzw.
> Rot-)Licht "dreht" sich ja ziemlich schnell...

Wenn Rolf nicht mehr da ist, versuch ich das im Code zu finden. Aber wie 
gesagt, ist ganz schön trickreich :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Wenn Rolf nicht mehr da ist, versuch ich das im Code zu finden. Aber wie
> gesagt, ist ganz schön trickreich :-)

Das einfachste ist es den DELAY Wert hochzuschrauben.
Wenn das dann immer noch nicht reicht, müsste man vor dem Umschalten zur 
nächsten Led ganz unten noch eine kleine Warteschleife einfügen.
Das wäre die einfachste Lösung. Die LEDs faden dann zwar immer noch in 
einer bestimmten Zeit von einer zur nächsten aber der Zustand 'voll 
Leuchten' wird dann etwas länger gehalten.

Will man die tatsächliche Umfade Zeit noch verlängern, wirds ein wenig 
komplizierter, da müsste man in die LOOP eingreifen und zwar so, dass 
das eigentliche PWM-Umschalten nicht langsamer wird. Dreh und Angelpunkt 
ist dort der inc OUTER, der nicht bei jedem Durchlauf erfolgen darf 
sondern nur zb bei jedem 2ten oder 3ten mal (also auch einen 
zusätzlichen Zähler zwischenschalten)

Autor: Wilfried H. (willi_2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
Ihr legt Euch ja richtig ins Zeug für mich, danke, danke, danke schon 
mal.
Mit so viel und so schneller Hilfe hatte ich gar nicht gerechnet.
Ich glaube ich fange mal mit der Variante von Karl Heinz an. Der einzige 
Haken
ist die fehlende 6te LED. Die müsste ich doch aber nur einfach 
hinzufügen können.
Denn Pin’s habe ich doch noch frei am Port B. Das Programm muß natürlich
angepasst werden. Richtig Karl Heinz? Auf Grund der Bauform des Turms,
er ist sechseckig, bin ich nun erstmal auf 6 LED’s festgelegt und 
einfach umbauen
läst er sich nun nicht mehr.
Das Programm ist zwar in Assembler geschrieben, aber obwohl ich aus der
PC-Programmierung komme ist es mit meinen C-Kenntnissen es auch nicht 
weit her.
Ich werde es einfach erstmal ausprobieren. Ich hoffe ich darf mich 
nochmals bei Euch
melden wenn es irgendwo klemmt. Ich werde aber dem Forum auf jeden Fall 
erhalten
bleiben denn das ist garantiert nicht das letzte µC Projekt. Ich hab da 
schon wieder
was im Hinterkopf, aber dazu später mehr erstmal muss das hier fertig 
werden.
Ich möchte Eure Diskussion aber hierdurch nicht abwürgen ich kann ja nur 
lernen
Dadurch. Also weitere Vorschläge durchaus erwünscht.

Viele Grüße Wilfried

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wilfried H. schrieb:

> ist die fehlende 6te LED. Die müsste ich doch aber nur einfach
> hinzufügen können.

Ja. Kann man.

> Denn Pin’s habe ich doch noch frei am Port B. Das Programm muß natürlich
> angepasst werden. Richtig Karl Heinz?

richtig.
Ist aber an sich kein Problem.

Unangenehmer wird es, wenn du die Geschwindigkeit ändern willst.

Autor: Wilfried H. (willi_2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Geschwindigkeit muß auch ändern Karl Heiz. Wenn ich nicht ganz das 
erreiche was ich wollte ist das auch ok. Aber der Drive im Video ist 
wirklich zu schnell. Das mit der längeren 100% Phase je LED wäre schon 
ganz ok. Aber erstmal willich es so aufbauen wie es ist und dann versuch 
ich am Programm rum zu schrauben.

Wilfried

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wilfried H. schrieb:

> ganz ok. Aber erstmal willich es so aufbauen wie es ist und dann versuch
> ich am Programm rum zu schrauben.

Den Mega8 kannst du prinzipiell programmieren?
(Also AVR-Studio, Programmer etc. läuft alles)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist das Pgm für 6 LED am PortB eines Mega8 (jungfäulich, also kein 
Quarz, 1Mhz Takt)
.include "m8def.inc"

.def TEMP   = r16
.def STORE  = r17     ; contains port value for the current LED
.def STORE2 = r18     ; contains port value for the next LED
.def OUTER  = r19     ; fading counter
.def INNER  = r20     ; PWM counter

.equ DELAY = 150

    ; I/O setup
    ; =========
    ldi TEMP, 0x3F      ; switch PB0..PB5 to output
    out DDRB, TEMP

    ldi STORE,  0x3E   ; load start value (LED0 on)
    ldi STORE2, 0x3D   ; load next value (LED1 on)

LOOP:
    inc  INNER         ; increment the inner counter
    cpi  INNER, DELAY  ; have we reached the maximum value?
    brne GO_ON         ; if yes, increment the outer one

    clr  INNER         ; reset inner counter
    inc  OUTER         ; increment outer counter
    cpi  OUTER, DELAY
    breq NEXT_PHASE    ; if it overflows, go to the next LED

GO_ON:
    cp   INNER, OUTER   ; inner > outer?
    brsh THIS_LED       ; if yes, the current LED needs to be on

    out  PORTB, STORE2  ; else the next one
    rjmp LOOP           ; and start over

THIS_LED:
    out  PORTB, STORE   ; switch on current LED
    rjmp LOOP           ; and start over

NEXT_PHASE:
    clr  OUTER          ; reset counter
    mov  STORE, STORE2  ; next LED

    lsl  STORE2         ; shift current value
    ori  STORE2, 1      ; the lsl makes the lsb 0, we need a 1
    sbrs STORE2, 6      ; do we need to wrap around?
    ldi  STORE2, 0x3E   ; if yes, load the initial value
    andi STORE2, 0x3F   ; mask bit 6 to 7

    rjmp LOOP           ; and start over


wenns zu schnell läuft, versuch erst mal DELAY hochzusetzen. Bis 255 
kannst du gehen.

Autor: Wilfried H. (willi_2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Den Mega8 kannst du prinzipiell programmieren?
> (Also AVR-Studio, Programmer etc. läuft alles)

Ja Karl Heinz, läuft aller einwandfrei. Testbord ist ein Selbstbau. Habe 
auch schon öfter mal ein C-Program aus den Tutorials nachvollzogen und 
getestet.

Autor: Wilfried H. (willi_2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man karl Heinz Du bist ja Spitze. Dake für das Programm. Probiere es 
heute abend gleich mal aus. Melde mich dann wieder.

Wilfried

Autor: Wilfried H. (willi_2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl Heinz,
"Bingo!!!" das war eine Punktlandung. Hat alles auf Anhieb geklappt 
funktioniert prima, nur die Geschwindigkeit ist mir noch zu. "Delay" hab 
ich aber schon auf 255 hoch gesetzt. Du erwähntest weiter oben mal eine 
zweite Warteschleife wodurch die 100% Helligkeit länger hält. Ich glaube 
das würde meinem gewünschten Effekt sogar noch näher kommen. Wo müsste 
ich die denn genau einbauen? Wird sie vielleicht so erzeugt - .equ 
DELAY_2= 50 - oder wie?

Dann auch noch eine Frage zu Vorwiderständen. Du hast in deinem 
Schaltung für das Rundumlicht nur einen Widerstand von 150 Ohm für alle 
5 LED. Sind das Low-Current LED's. Ich verwende normale weiße 5mm LED's, 
reicht da auch nur ein entsprechender Widerstand oder brauch ich für 
jede LED einen.

Wilfried

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die delay routine muss ein weiteres mal verschachtelt werden, ja.

ein widersdtand reicht, weiße leds haben aber ca 3.6v, beachten!

Klaus.

Autor: Wilfried H. (willi_2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Klaus,
d.h. ich muß den passenden Widerstand für weiße wählen und reicht nur R, 
ok.
Nur da mit der zweiten Warteschleife habe ich noch nicht geschnallt. Wo 
wird sie eingebaut

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wilfried H. schrieb:
> Nur da mit der zweiten Warteschleife habe ich noch nicht geschnallt. Wo
> wird sie eingebaut

Es gibt ja, wie gesagt, zwei Moeglichkeiten. Entweder man verlangsamt 
das Ganze oder baut eine Wartezeit ein, wenn gerade eine LED auf 100% 
ist. Ersteres ist durch die Software-PWM nach unten hin begrenzt, 
irgendwann ist das Auge nicht mehr traege genug und Du siehst die LEDs 
blinken.

> [...] Du erwähntest weiter oben mal eine
> zweite Warteschleife wodurch die 100% Helligkeit länger hält. Ich glaube
> das würde meinem gewünschten Effekt sogar noch näher kommen. Wo müsste
> ich die denn genau einbauen?

Ich weiss nicht so richtig, ob sie Deinem gewuenschten Effekt naeher 
kommen wuerde, weil die "fluessige Bewegung" ja fuer einen Moment 
angehalten wuerde. Und im echten Leuchtturm dreht sich das Leuchtfeuer 
ja gleichmaessig. Aber probieren geht ja bekanntlich ueber studieren.

Die Warteschleife muesste dann in "NEXT_PHASE" vor das rjmp. Vor der 
Warteschleife muss aber nochmal STORE auf PORTB geschrieben werden.

Ich schreibe Dir das ausnahmsweise mal eben zurecht...

Volker

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Code:
.include "m8def.inc"

.def TEMP   = r16
.def STORE  = r17     ; contains port value for the current LED
.def STORE2 = r18     ; contains port value for the next LED
.def OUTER  = r19     ; fading counter
.def INNER  = r20     ; PWM counter

.equ DELAY = 255
.equ WARTE1= 255      ; additional delay at LED=100%
.equ WARTE2= 127      ; delay is approx.:
.equ WARTE3= 1        ; WARTE1 * WARTE2 * WARTE3

    ; I/O setup
    ; =========
    ldi TEMP, 0x3F      ; switch PB0..PB5 to output
    out DDRB, TEMP

    ldi STORE,  0x3E   ; load start value (LED0 on)
    ldi STORE2, 0x3D   ; load next value (LED1 on)

LOOP:
    inc  INNER         ; increment the inner counter
    cpi  INNER, DELAY  ; have we reached the maximum value?
    brne GO_ON         ; if yes, increment the outer one

    clr  INNER         ; reset inner counter
    inc  OUTER         ; increment outer counter
    cpi  OUTER, DELAY
    breq NEXT_PHASE    ; if it overflows, go to the next LED

GO_ON:
    cp   INNER, OUTER   ; inner > outer?
    brsh THIS_LED       ; if yes, the current LED needs to be on

    out  PORTB, STORE2  ; else the next one
    rjmp LOOP           ; and start over

THIS_LED:
    out  PORTB, STORE   ; switch on current LED
    rjmp LOOP           ; and start over

NEXT_PHASE:
    mov  STORE, STORE2  ; next LED
    lsl  STORE2         ; shift current value
    ori  STORE2, 1      ; the lsl makes the lsb 0, we need a 1
    sbrs STORE2, 6      ; do we need to wrap around?
    ldi  STORE2, 0x3E   ; if yes, load the initial value
    andi STORE2, 0x3F   ; mask bit 6 to 7
    
    out  PORTB, STORE   ; show before wait
    ldi  OUTER, WARTE1
OUT_LOOP:  
    ldi  INNER, WARTE2
INN_LOOP:
    ldi  TEMP,  WARTE3
TMP_LOOP:
    dec  TEMP
    brne TMP_LOOP
    dec  INNER
    brne INN_LOOP
    dec  OUTER
    brne OUT_LOOP

    clr  OUTER          ; reset counter

    rjmp LOOP           ; and start over

Ich habe Dir 3 Stellschrauben eingebaut: WARTE1, WARTE2 und WARTE3. Die 
Wartezeit ist in etwa das Produkt aus allen dreien. Jede der Konstanten 
kann einen Wert von 1-255 bekommen. (Im Prinzip auch 0, das entspraeche 
dann aber 256!)

Kann das leider gerade nicht praktisch testen, habe das also "blind" 
geschrieben. Lass mich wissen, ob's funktioniert!

Volker

Autor: Wilfried H. (willi_2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Volker,
das ist ja echt super nett von Dir. Recht herzlichen Dank dafür. Ich 
kann das Script aber auch erst heute abend ausprobieren, melde mich dann 
aber ganz bestimmt. Ich habe mich gestern abend selber auch bemüht eine 
Lösung zu erarbeiten bin aber bisher an meinem Unvermögen was Assembler 
angeht gescheitert. Ich habe aber beim Suchen nach Erklärungen ein gutes 
PDF gefunden das AVR-Assembler gut und verständlich beschreibt und somit 
kann ich so nach und nach verstehen was in dem Programm passiert.
Ich verstehe zwar ein bissel was von Softwareentwicklung bin aber leider 
schon einige Jahre raus aus dem Geschäft und mit Assembler oder gar 
Mikrocontrollern hatte ich noch nie etwas zu tun. Ich hoffe aber das ich 
mich da doch ein wenig auf Hobbybasis einarbeiten kann.
Also Volker hab nochmals herzlichen Dank für Deine Hilfe.

Bis dann Wilfried

Autor: Wilfried H. (willi_2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
so Volker, ich habe Dein Skript jetzt ausprobiert und ich muss sagen es 
funktioniert wunderbar. Ich konnte die Geschwindigkeit gut an meine 
Vorstellung anpassen. Jetzt kann ich alles zusammenbauen und in den 
Leuchtturm einbauen.
Ich möchte mich noch einmal bei allen für die freundliche Hilfe 
bedanken.

Viele Grüße Wilfried

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehr schoen! Und Bild oder Video wollen wir dann demnaechst auch noch 
sehen! ;)

Volker

Autor: Wilfried H. (willi_2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht klar Volker. Kann aber noch einige Tage dauern.


wilfried

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber NICHT vergessen, denn DAS bist du Volker schuldig! Normaler Weise 
holt man hier eher den Flammenwerfer raus, anstatt irgend einem Noob was 
fertiges zu programmieren :)

Denn frohes Leuchten! Klaus.

Autor: Dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jahre später... und kein Video.
War ja klar!

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

tja wie das immer so ist...

Ich wollte auch gerade ein Leuchtturm umbauen, und da kam mir der Code 
gerade recht. Widerstand und Tiny13 hatte ich alles noch da, also 
schnell zusammengesteckt und siehe da, nach einigem Spielen mit den 
Timern ist das Ergebnis gut. UND ein Video habe ich auch gedreht, 
allerdings nur Steckbrett style ;-)

Und danke Volker für den Code! Hat mir sehr geholfen und ein haufen zeit 
gespart. Meine Assembler Zeiten sind schon seit Jahren vorbei, ich 
programmiere wenn dann noch in C ;-)

Link zum Video:
Youtube-Video "Leuchtturm"

Gruß
Daniel

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.