-
-
Erfahrener Benutzer
Begeisterter Techniker
LED soll nebenbei blinken
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?
-
Erfahrener Benutzer
Fleißiges Mitglied
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.
-
Erfahrener Benutzer
Roboter Genie
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
-
Neuer Benutzer
Öfters hier
Hi Paul,
was spricht gegen eine Blink-LED. Ist einfach und spart Timer.
Gruss
Gerhard
-
Erfahrener Benutzer
Roboter Genie
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
-
Erfahrener Benutzer
Fleißiges Mitglied
@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.
-
Neuer Benutzer
Öfters hier
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
-
Erfahrener Benutzer
Roboter Genie
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 )
-
Neuer Benutzer
Öfters hier
@thewoolf00
Kannst Du mal Dein PS erklären. Versteh den Sinn nicht ganz.
-
Erfahrener Benutzer
Roboter Genie
Hey gaacki: Das PS ist für MeckPommER.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen