Forum: Mikrocontroller und Digitale Elektronik LED's in unterschiedlicher frequenz blinken


von locher (Gast)


Lesenswert?

Hallo zusammen,

bin noch recht neu auf dem Gebiet uC. habe aber doch schon ein paar 
simple Dinge gemacht.
Jetzt will ich zwei LED's blinken lassen. Die besonderheit ist aber, 
dass ich Sie in unterschiedlichen Frequenzen blinken lassen will.
Das man das Ganze mit einem Timer löst, anstatt mit delay oder ähnlichem 
ist mir schon klar.
Ich komme aber nicht drauf, wie ich den/die Timer benutzen soll.
Lass ich den Timer starten, wenn die LED blinken soll? Oder zahle ich 
overflows vom timer?
Ich will keinen Code hier vorgekaut bekommen, brauche aber doch ein 
wenig Hilfe was den Start angeht.

Ich hoffe ihr könnt mir weiterhelfen.
Falls noch dinge unklar sind, versuche ich diese natürlich so genau wie 
möglich noch zu beschreiben.

Das ganze läuft auf einem STK-500 mit einem mega8 mit internem Takt.

Vielen Dank
Der Locher

: Verschoben durch Moderator
von Joe S. (bubblejoe)


Lesenswert?

Ich würde das so realisieren, dass man mit einem Timer eine bestimmte 
Frequenz hardwaremäßig erzeugt (z.B. 100Hz), und die dann softwaremäßig 
über einen Zähler runterteilt auf die gewünschte Frequenz. So kannst du 
mit einem Timer und mehreren Zählern mehrere Frequenzen erzeugen.

von Falk B. (falk)


Lesenswert?

@  locher (Gast)

>Jetzt will ich zwei LED's blinken lassen. Die besonderheit ist aber,
>dass ich Sie in unterschiedlichen Frequenzen blinken lassen will.
>Das man das Ganze mit einem Timer löst, anstatt mit delay oder ähnlichem
>ist mir schon klar.

Schon mal gut.

>Ich komme aber nicht drauf, wie ich den/die Timer benutzen soll.
>Lass ich den Timer starten, wenn die LED blinken soll? Oder zahle ich
>overflows vom timer?

Du brauchst eine statemachine und Multitasking. Klingt 
kompliziert, ist es aber nicht. Lies die Artikel.

von Marco M. (marco_m)


Lesenswert?

Nehmen wir an, du willst LED A mit 15 und LED B mit 40 Hz blinken 
lassen. Das bedeutet 30 bzw. 80 Flankenwechsel pro Sekunde.

Das kleinste gemeinsame Vielfache von 30 und 80 ist 240. Du stellst also 
den Timer auf 240 Hz und zählst jetzt die Interrupts mit. Alle 240/30=8 
Interrupts wechselst du die Flanke von LED-A und alle 240/80=3 
Interrupts wechselst du die Flanke von LED-B.

Am einfachsten erledigst du das, indem du pro LED eine Variable hast die 
du runterzählst und dann bei 0 wieder auf ihren Startwert setzt. Das 
Verfahren lässt sich auch offensichtlich auf mehr als 2 LED erweitern.

Wenn sich die Frequenz des kgV sich nicht darstellen lässt, dann kann 
man die LED auch nicht genau in der gewünschten Frequenz blinken 
lassen. Man muss dann Fehler akkumulieren und eine Timerfrequenz finden, 
die den kleinsten Gesamtfehler produziert. Das ist dann aber etwas 
komplizierter.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Geht einfach mit Countdown-Zählern.

Ein ausgearbeitetes Beispiel ist in unten auf der Seite

http://gjlay.de/software/c-code/countdown.html

von egs_ti (Gast)


Lesenswert?

oder man löst einfach jede ms einen timer interrupt aus und setzt dort 
ein flagg die man dann im Hauptprogramm auswertet und dementsprechend 
die zählvariablen für die LEDs bearbeitet.

von Marco M. (marco_m)


Lesenswert?

Im einfachsten Fall würdest du eine ausreichend hohe Timerfrequnez 
einstellen (z.B: 1000Hz) und dann für jede LED einen Zähler haben, der 
mit diesem Wert (1000) initialisiert wird und von dem du den gewünschten 
Frequenzwert abziehst. Wenn der Zähler <=0 ist, wechselst du die Flanke 
der LED und addierst den Timerwert wieder auf den Zähler drauf:
1
timer_freq=1000; 
2
led_a_counter=timer_freq;
3
led_a_freq=30; 
4
5
...
6
// Im Interrupt: 
7
8
led_a_counter -= led_a_freq
9
if (led_a_counter<=0)
10
 {
11
  toggle_led_a();
12
  led_a_counter += timer_freq;
13
 }

von Harald W. (wilhelms)


Lesenswert?

Joe B. schrieb:

> Ich würde das so realisieren, dass man mit einem Timer eine bestimmte
> Frequenz hardwaremäßig erzeugt (z.B. 100Hz), und die dann softwaremäßig
> über einen Zähler runterteilt auf die gewünschte Frequenz. So kannst du
> mit einem Timer und mehreren Zählern mehrere Frequenzen erzeugen.

Das heisst dann aber, das die Frequenzen und Phasenverschiebungen
immer in einem festen Verhältnis zueinander stehen. Beobachtet
man ein (stehendes) Polizeifahrzeug, so sieht man, das sich die
Phasenbeziehung zwischen den zwei Blaulichtern laufend verschiebt.
Mal blinken beide synchron, einige Sek später abwechselnd und
so weiter. Ich glaube, ein solches Verhalten kann man mit rein
digitalen Schaltungen nicht erzeugen, während das z.B. mit zwei
555 problemlos läuft.
Gruss
Harald

von Falk B. (falk)


Lesenswert?

@  Harald Wilhelms (wilhelms)

>Das heisst dann aber, das die Frequenzen und Phasenverschiebungen
>immer in einem festen Verhältnis zueinander stehen.

Was oft OK oder sogar notwendig ist.

>Beobachtet
>man ein (stehendes) Polizeifahrzeug, so sieht man, das sich die
>Phasenbeziehung zwischen den zwei Blaulichtern laufend verschiebt.
>Mal blinken beide synchron, einige Sek später abwechselnd und
>so weiter.

Absicht oder Designfehler? ;-)

> Ich glaube, ein solches Verhalten kann man mit rein
>digitalen Schaltungen nicht erzeugen,

Doch, man muss nur die Grundfrequenz/Periode groß genug machen. dann 
sieht es keiner mehr.

> während das z.B. mit zwei
>555 problemlos läuft.

Siehe oben.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Harald Wilhelms schrieb:
> Ich glaube, ein solches Verhalten kann man mit rein
> digitalen Schaltungen nicht erzeugen, während das z.B. mit zwei
> 555 problemlos läuft.

Harald Wilhelms schrieb:
> Das heisst dann aber, das die Frequenzen und Phasenverschiebungen
> immer in einem festen Verhältnis zueinander stehen. Beobachtet
> man ein (stehendes) Polizeifahrzeug, so sieht man, das sich die
> Phasenbeziehung zwischen den zwei Blaulichtern laufend verschiebt.
> Mal blinken beide synchron, einige Sek später abwechselnd und
> so weiter. Ich glaube, ein solches Verhalten kann man mit rein
> digitalen Schaltungen nicht erzeugen, während das z.B. mit zwei
> 555 problemlos läuft.
> Gruss
> Harald

Der eine hat eine Blinkfrequenz von 1.11 Hz, und der andere eine von 
1.12 Hz. Das gibt dann die beobachtete Phasenverschiebung.

Das kannst du auch auf der Kirmes bei der Schiffsschaukel beobachten: 
Zuerst sind 2 Teilnehmer identisch am schaukeln, und irgendwann geraten 
sie aus dem Gleichtakt.

Ob du also eine Phasenverschibung mit mechanischen Zahnrädern, NE555 
oder "vollständig digital" machst, ist ziemlich egal. Bei der 
Zählerlösung zählst du für die eine LED bis 111 und für dei andere LED 
bis 112, so einfach ist das.

von Peter D. (peda)


Lesenswert?

Harald Wilhelms schrieb:
> während das z.B. mit zwei
> 555 problemlos läuft.

Nö.
Eine reproduzierbare Phasenverschiebung kannst Du nur digital (mit einem 
MC) erreichen.

Mit dem 555 geht das nicht stabil. Es kann sogar sein, daß je nach 
Erwärmung und Batteriespannung mal der eine 555 schneller ist und mal 
der andere.


Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Harald Wilhelms schrieb:
> Ich glaube, ein solches Verhalten kann man mit rein
> digitalen Schaltungen nicht erzeugen

Na klar, kann man.  Solange die Periode nur lang genug ist, schafft
das Gehirn das nicht mehr, beide als voneinander abhängig zu
erkennen.

Ich habe sowas mal real gemacht: Ersatz-Glühobst für ein
Playmobil-Polizeiauto wäre teurer geworden als ein Neubau der
Elektronik mit blauen LEDs, also habe ich letzteres gemacht.  Sieht
gut realistisch aus.

Ich hab' einfach mal eine beer-ware-Lizenz drüber gesetzt und hänge
den Code hier für die Allgemeinheit an.  Die Schaltung bietet nicht
viel Aufregendes: die beiden blauen LEDs + je ein PR4401 hängen
direkt an den (parallel geschalteten) Portpins eines ATtiny2313,
noch ein Taster zum Einschalten dazu und eine ISP-Schnittstelle.
Die zwei LR6-Zellen leben ziemlich lange damit.

von Harald W. (wilhelms)


Lesenswert?

Peter Dannegger schrieb:

>> während das z.B. mit zwei 555 problemlos läuft.

> Nö. Eine reproduzierbare Phasenverschiebung kannst Du nur
> digital (mit einem MC) erreichen.

> Mit dem 555 geht das nicht stabil. Es kann sogar sein, daß je nach
> Erwärmung und Batteriespannung mal der eine 555 schneller ist und mal
> der andere.

Gerade das ist ja z.B. im Modellbau für die Simulation eines
Blaulichts erwünscht. Wobei wir natürlich nicht wissen, was
"Locher" wirklich für einen Blinker braucht.
Gruss
Harald

von Locher (Gast)


Lesenswert?

Vielen Dank!!

Ich werde zwar heute noch nicht dazu kommen das beschriebene 
auszuprobieren, werde es aber die Tage machen.

Um mein Projekt vll. etwas genauer zu beschreiben:
In ferner Zukunft soll ein H0 Auto mit Blinker/Frontlicht/Rücklicht und 
Blaulicht versehen werden. Die Mechanik stellt für mich keine Probleme 
dar.

Jetzt wollte ich aber ersteinmal mit dem STK-500 2LED's für Links/Rechts 
blinken mit je einem Taster versehen und den dritten Taster mit dem 
"Blaulicht". Zu Beginn hatte ich das mit delay gelöst, aber wenn 
geblinkt wird geht halt kein Blaulicht etc. ;)
Da ich aber dazu gelernt habe will ich das nun wie Ihr es beschrieben 
habt probieren.

Nochmals vielen Danke für die super Hilfe/Ideen!!!!

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.