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
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.
@ 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.
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.
Geht einfach mit Countdown-Zählern. Ein ausgearbeitetes Beispiel ist in unten auf der Seite http://gjlay.de/software/c-code/countdown.html
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.
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 | }
|
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
@ 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.
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.