-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: LED soll nebenbei blinken

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.01.2006
    Ort
    Homberg (Efze)/Nordhessen
    Alter
    32
    Beiträge
    207

    LED soll nebenbei blinken

    Anzeige

    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?
    Grüße Paul

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.11.2006
    Ort
    K-Town
    Alter
    39
    Beiträge
    178
    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.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    53
    Beiträge
    1.080
    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
    Mein Hexapod im Detail auf www.vreal.de

  4. #4
    Hi Paul,

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

    Gruss
    Gerhard

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    53
    Beiträge
    1.080
    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
    Mein Hexapod im Detail auf www.vreal.de

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.11.2006
    Ort
    K-Town
    Alter
    39
    Beiträge
    178
    @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.

  7. #7
    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

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    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 )

  9. #9
    @thewoolf00

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

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Hey gaacki: Das PS ist für MeckPommER.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •