PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED soll nebenbei blinken



Powell
27.11.2007, 13:36
Hallo zusammen,

ich möchte folgendes Programm realisieren:

Wenn eine variable in meinem Programm einen bestimmten wert überschreitet, soll eine LED (=ein Portausgang) anfangen zu blinken. Das soll "nebenbei" passieren und das restliche Programm nicht beeinflussen. Wenn die Variable den Wert wieder unterschreitet soll die LED nicht mehr blinken.

Früher hab ich das mit dem waitms befehl gemacht, aber das ist jetzt nicht mehr möglich da ja das Programm selbst unbeeinflusst weiterlaufen soll. Also wer kann mir hier weiterhelfen?

Zapo.
27.11.2007, 13:48
benutze einen Timer und starte ihn wenn die LED blinken soll!
(ist zwar sehr großzügig einen Timer dafür zu benutzen - funktioniert aber!)
und wenn sie nicht mehr blinken soll stopst du den Timer und setzt die LED =1 (ansonsten kanns auch passieren das sie dann zufällig aus oder an bleibt wenn der timer stopt)

wenn der timer abläuft springst du in eine Sub in der einfach nur steht

toggle led

die blink frequenz kannst du wiederum in der sub mit waitms xxx angeben oder wie es vielleicht schoner ist eine Variable in abhängigkeit des Prozessortaktes runterzählen und dann wieder aus der SUB rauszuspringen.

etwa so:
Variable mit Wert laden (z.B. 30000)
dcr variable
if variable > 0 then springe wieder zurück auf dcr variable

Zapo.

MeckPommER
27.11.2007, 14:10
die blinkfrequenz würde ich eher dadurch regeln, das:

- der timer einen passenden prescaler bekommt
- in der sub eine variable incrementiert wird und erst bei einem bestimmten wert die led getoggelt und die variable wieder auf 0 gesetzt wird

bei bei timerbedingten subs immer darauf achten:

- das man nicht unnötig oft in die routine springt
- das man sie so klein und kurz wie möglich macht (also keine waits in der sub!)

in der sub würde dann vielleicht stehen:

timersub:
incr ledcounter
if 60<ledcounter then
toggle led
ledcounter = 0
end if
return

Alles natürlich immer stark davon abhängig, wie schnell der Controller getaktet wird und was für einen Timer du benutzt (8 oder 16 Bit)

Gruß MeckPommER

gaggi
30.11.2007, 09:21
Hi Paul,

was spricht gegen eine Blink-LED. Ist einfach und spart Timer.

Gruss
Gerhard

MeckPommER
30.11.2007, 10:11
Das stimmt absolut!

Aber abgesehen davon, das eine Blink-LED teurer als eine normale LED ist und man nicht immer eine entsprechende LED zur Hand hat, kommt es eben manchmal auf die Herausforderung an.
Sinn der Mikrocontroller ist ja unter Anderem auch, Schaltungs-Hardware durch Software zu ersetzen.
Und das Hochgefühl, wenn etwas nach langem Probieren endlich funktioniert ist bei einer Blink-LED sicherlich geringen als bei einer timergesteuerten normalen LED.
Ich würde die Sache vielleicht eher noch erweitern, indem zwei LEDs unterschiedlich gepolt über einen Widerstand an zwei Portpins liegen, oder ne Duo-LED, oder oder oder ... . Somit könnte man die Werteüberschreitung besagter Variable noch mehr verdeutlichen, z.b. erst gelbes Blinken, später rot.

Mit einem Timer wäre es auch ohne Probleme möglich, den Wert der Variablen durch die Blinkfrequenz zu veranschaulichen.

Die Blink-LED ist sicherlich die vom Aufwand her beste Lösung. Der Fun- und Coolness-Faktor ist bei anderen Lösungen sicherlich höher :-)

Zapo.
30.11.2007, 10:30
@MeckPommER AND @alle anderen auch

endlich mal einer der genau das zu schätzen weis wie es ist nicht alles in einem Chip zu haben und dann 5 Volt anzulegen und die Alarmanlage ist scharf. :-)

PS: man könnte auch ein / zwei Register laden, runter oder hochzähler und den Wertebereich vergleichen - befindet sich das Ergebnis (sei es durch Z-Bits oder C-Bit) in einem gewissen Bereich, schaltet der eine oder der andere Ausgang.. (oder beide)

so ne art Fensterdiskriminator

Zapo.

gaggi
30.11.2007, 13:40
Sorry,
ich glaub, ich bin hier falsch verstanden worden. Ich dachte es geht hier um die Anzeige von einem Status innerhalb eines Programmes; also schlicht Ersatz für den 'einfachen' Wait Befehl. Und es soll den Programmablauf nicht beeinflussen. Timer, Interrupts, Subs, Register setzen, Abfragen usw beeinflusst den Prozess schon ganz erheblich; Es sei denn der zeitliche Ablauf spielt keine Rolle. Man bedenke, dass Wait eine totale Programmunterbrechung verursacht aber keine Änderung des Ablaufes mit sich bringt. Ich glaube, dass Powell
genau das meint. Und da ist eine fertige Anzeige doch ideal.
Ich möchte hier nicht anstinken und glaube fest, dass hier jeder Beteiligte programmtechnisch in der Lage ist, das zu lösen; aber um gezielte Ratschläge geben zu können sollte man zumindest den Programmablauf kennen.

@MeckPommER
Sind DuoLeds viel billiger als BlinkLeds?

@zapo
Ich bin da ganz Deiner Meinung. Oft kommt man allerdings an Grenzen, wo man nicht mehr so einfach einen Timer und entsprechende Resourcen des Prozessors nutzen kann. Sei es, dass die Sachen schon benutzt werden oder aus programmtechnischen Gründen. Da bin ich immer froh um eine fertige Sache. Auch wenn's nicht so viel Spass macht.
Übrigens verstehe ich Deinen Vorschlag nicht so ganz.
(sei es durch Z-Bits oder C-Bit) oder Fensterdiskriminator
Das ist doch BASCOM oder?

@Powell
Falls es kein Geheimnis ist, dann poste doch den Code

Gerhard

thewulf00
30.11.2007, 13:40
In Assembler würd ich einfach -wie MeckPommER sagte- einen Timer bauen und innen ein Register inkrementieren.
Dann lediglich ein Sprung bei Carry (bedeutet, ich springe, wenn die Variable von 255 auf 0 springt). Vorteile dieser Version ist, ich muss nix auf 0 setzen, kann die Frequenz immernoch per PreScaler bestimmen und ein Vergleich (d.h. if a=b) entfällt.
Sozusagen "the shortest ISR ever". (Wobeis keine ISR im eigentlichen Sinne ist...)


@gaggi: Duos sind nicht billiger als BlinkLEDs. Bitte keine Äpfel mit Birnen vergleichen. Er meinte: Duos als Tuning der Standardlösung und die Standardlösung ist mit einer normalen LED zu nutzen. Und diese normale ist billiger als eine BlinkLED.


PS: (jaaaa - inkrementieren mit 'k' @MeckPommER - wir sind hier in Deutschland, hier gibts Inkrementierung, Kontroller und Mikrochips... Aber atmega sollten wir nicht durch AtMecka ersetzen ;))

gaggi
30.11.2007, 14:21
@thewoolf00

Kannst Du mal Dein PS erklären. Versteh den Sinn nicht ganz.

thewulf00
30.11.2007, 14:43
Hey gaacki: Das PS ist für MeckPommER.

MeckPommER
30.11.2007, 14:51
... also schlicht Ersatz für den 'einfachen' Wait Befehl. Und es soll den Programmablauf nicht beeinflussen. Timer, Interrupts, Subs, Register setzen, Abfragen usw beeinflusst den Prozess schon ganz erheblich; Es sei denn der zeitliche Ablauf spielt keine Rolle. ...

Das mit dem Beeinflussen sehe ich etwas anders. Ein Interrupt, der Beispielsweise auf einem 8-Bit Timer läuft, der mit einem Prescaler von 1024 getaktet wird, hat nur jedem 262144. Takt Auswirkungen auf den Programmablauf. Selbst wenn die aufgerufene Routine hier eine Variable ändert und dort etwas anders macht, so wird man im zeitlichen Ablauf des Hauptprogramms und in der allgemeinen Prozessorlast kaum irgendwelche Unterschiede feststellen. Da der Timer in Hardware läuft und die Interrupt-Routine so selten aufgerufen wird, stellt dies für mich vom Programmablauf her eine äußerst geringe beeinflussung dar, im Gegensatz z.B. zu einem Wait oder einer Variablen, die im Hauptprogramm manipuliert wird.
Für mich ist Wait eine totale Beeinflussung des Programmablaufes, da eben nichts "mehr läuft".

Aber das sind nur verschiedene Ansichten weswegen ich niemals behaupten würde Recht zu haben und du nicht @gaggi.
Und um es nochmal zu wiederholen: müßte ich selbige Aufgabenstellung lösen und hätte keinen Spass am Basteln, so würde ich auch in jedem Fall eine Blink-LED nehmen.

Gruß MeckPommER

MeckPommER
30.11.2007, 14:56
PS: (jaaaa - inkrementieren mit 'k' @MeckPommER - wir sind hier in Deutschland, hier gibts Inkrementierung, Kontroller und Mikrochips... Aber atmega sollten wir nicht durch AtMecka ersetzen ;))

Ich bin da gelegentlich etwas virtuos, was meine Cs und Ks in english-deutschen Wörtern angeht *hüstel*

Ich bin sicher, wenn man sich in D etwas umschaut, findet man auch einige Gegenden, in es fast nur Admeggahs gibt ;-)

thewulf00
30.11.2007, 15:23
Ich bin da gelegentlich etwas virtuos, was meine Cs und Ks in english-deutschen Wörtern angeht *hüstel*
Ja, das scheint bei vielen so zu sein. Ich hoffe nur, niemanden vor den Kopf zu stoßen, wenn ich mal was dazu sag.



Ich bin sicher, wenn man sich in D etwas umschaut, findet man auch einige Gegenden, in es fast nur Admeggahs gibt
#-o :-)

Powell
01.12.2007, 10:28
Na, hier ist ja reichlich was passiert seit ich das letzte mal geschaut hab :)

Also einen Code kann ich nicht posten weil der noch gar nicht steht ;) wollte mich nur vorab schon mal informieren ums anschließend umzusetzen. Ich werd auf die Blink LED zurückgreifen (nicht dass ich nicht die Herausforderung suche, aber mir gehts bei dem Projekt erst mal einfach drum dasses funktioniert, denn werde mich noch mit genug Problemen abplagen müssen ;)), super Idee, wusste garnicht dasses sowas gibt ;). Nur die Frage: Sind die in der Frequenz konstant oder lässt die sich variieren? Beschaltung sonst wie gehabt mit Vorwiderstand?

gaggi
01.12.2007, 10:55
Hi Powell,

Google mal nach den LEDs. Es gibt verschiedene Ausführungen bezüglich Spannung und Strom. Ich würde im Datenblatt speziell zum Typ schauen.
Meine Erfahrung: 5 Volt dran passt noch. Blinkt schnell und ist hell. Bei Strombegrenzung lt. Datenblatt wird die Frequenz niedriger und nicht so hell.
Frequenz ist rund 1/2 sec. Das ist der Nachteil der Blink LEDs. Farbänderung usw ist nicht zu machen; soweit ich weiß.

Gerhard