LED-Basic Input-Emulation

Startseite Foren LEDs, Controller, Player LED-Basic Input-Emulation

Ansicht von 7 Beiträgen - 1 bis 7 (von insgesamt 7)
  • Autor
    Beiträge
  • #915
    EREL
    Teilnehmer

    Leider unterstützt das gegenwärtige LED-Basic keine direkte Input-Funktion. Es können zwar Tastendrücke oder statische Pegel an (je nach Modul) einigen Eingängen abgefragt werden, aber eine komfortable und vor allem schnelle Dateneingabe ist so (z.B. von externen Controllern) nicht ohne Weiteres möglich.

    Eine zyklische Abfrage von Eingangsports ist zwar möglich, hat aber einige Fallen:
    1. ein Eingangspegel muß während laufender Programme mindestens 40 ms anliegen, da ungünstigenfalles eine gerade laufende LED.show-Routine abgewartet werden muß.
    2. Selbst wenn in einer Abfrageschleife keine LED.show-Routine aufgerufen wird, kann ein Portwechsel (insbesondere Tastendrücke verzögern sich um bis zu 40 ms) erst nach längerer Zeit festgestellt werden.
    Somit ist nur eine sehr langsame Eingabe von Daten möglich, aber nicht unmöglich:

    Mein Vorschlag ist, mit Mitteln der LED-Basic-Programmierung folgender und bedarf nur eines Input-Portes, ist also auch beim Cronios-Modul möglich (in diesem Fall unter Nutzung des Drehimpulsgeber-Tasteneinganges, der zusätzlich parallel extern an Masse gelegt werden kann):

    Es gibt also den
    Port Status „Passiv“, Wert 0, Taste nicht gedrückt
    Port Status „Aktiv“, Wert 1, Taste gedrückt bzw. extern an Masse gelegt.

    Zunächst muß ein „Start-Aktiv“ > 50 ms angelegt werden, um ggf. aus einem laufenden Programm einschl. eventueller LED.show-Routine auszuspringen, in vorgeschlagener Lösung 60 ms, längerer Aktiv-Zustand wird als manueller Tastendruck gedeutet und springt zurück in die ursprüngliche Tastenabfrage.

    Nun folgt das Datum als „Ziffern-Passiv“, zusammengesetzt aus 50 ms Standard-Passiv plus „30 ms * Ziffernwert“, also
    0 = 0 ms, 1 = 80 ms, 2 = 110 ms, 3 = 140 ms, … , 9 = 330 ms,

    begrenzt durch das folgende Aktiv, ich unterscheide ein
    „Trenn-Aktiv“ mit 50 ms, daraufhin können weitere Ziffern-Passivs folgen, oder
    „Ende-Aktiv“ mit 80 ms, damit wird die Eingabe insgesamt beendet und zurück in das ursprünglich Hauptprogramm gesprungen.

    Timeout-Funktionen springen aus den Warteschleifen, falls die Maximalzeiten überschritten werden, um ein Blockieren des Hauptprogrammes zu vermeiden.

    Ein Beispiel /=aktiv, \=passiv:
    Input einer Ziffer 3: /50\140/80\
    Input der Zahl 123: /50\80/50\110/50\140/80\

    Wie man sieht, ist die Datenübertragung extrem langsam, aber mit diesem Timing sehr zuverlässig! Ich habe für die Cronixie-Uhr eine sehr komfortable Fernsteuerung mit einer Vielzahl von Funktionen geschrieben, die Eingaben von 1…7 Ziffern erfordert

    Hier die extrahierten LED-Basic Routinen für die Input-Emulation, leider reformatiert die Forumsoftware das Listing sehr unglücklich:

    ‚ —— Hauptroutine: INPUT —–
    ‚ IN: nach IO.GETKEY in Hauptprogramm-Schleife
    ‚ VAR: i: Aktiv-Timer
    20000:
    i = 0 ‚Aktiv-Timer reset
    20100:
    delay 1 ‚(Start) Empfangsbereitschaft…
    i = i + 1
    k = IO.keystate() ‚vor-Eingabe
    if i > 100 then retun ‚max. 100 ms Wartezeit -> sonst: „manueller Tastendruck“
    if k = 1 then goto 20100 ‚Startimpuls noch aktiv…

    20200:
    gosub 20900 ‚einzelne Ziffer lesen -> n
    if s = 0 then return ‚Fehler-Aussprung

    ‚*** hier Ziffer „n“ verarbeiten ***

    if s = 1 then goto 20200 ‚weitere Ziffer folgt…
    return ‚fertig

    ‚ —— Subroutine: einzelne INPUT-Ziffer lesen —–
    ‚ OUT: n: Ziffer
    ‚ s: Schlußzeichen: 0=Überlauf/Fehler, 1=weitere Ziffer folgt, 2=letzte Ziffer
    ‚ VAR: j: Passiv-Timer
    ‚ i: Aktiv-Timer
    k: Keystatus

    20900:
    j = 0 ‚Impulspausenzähler
    n = 12 ’n=12 – zunächst ungültig
    s = 0 ’s=0 – Fehler
    20910:
    delay 1
    j = j + 1
    k = IO.keystate() ‚ warte auf Impuls…
    if j > 350 then return ‚max. 350 ms Gesamtwartezeit -> Abbruch (S=0: Fehler)
    if k = 0 then goto 20910

    i = 0
    20920:
    delay 1
    i = i + 1 ‚Impulslängenzähler
    k = IO.keystate() ‚warte auf Impulspause…
    if i > 180 then return ‚max. 150 ms Gesamtwartezeit -> Abbruch (S=0: Fehler)
    if k = 1 then goto 20920 ‚ noch aktiv…

    20950:
    n = 0 ‚Ziffernwert bestimmen -> n
    if j > 50 then n = 1
    if j > 80 then n = 2
    if j > 105 then n = 3
    if j > 135 then n = 4
    if j > 160 then n = 5
    if j > 180 then n = 6
    if j > 210 then n = 7
    if j > 240 then n = 8
    if j > 265 then n = 9
    if j > 290 then n = 10

    20990:
    s = 1 ‚1: nächste Ziffer folgt
    if i > 55 then s = 2 ‚2: letzte Ziffer (Schlußzeichen)
    if i > 150 then s = 0 ‚0: Überlauf
    o = o + 1 ‚Ziffer zählen:
    ‚print m;“. „,j,l,“ -> „;a,s ‚Auswertung
    i = 0 ‚Ausstieg
    return

    #916
    EREL
    Teilnehmer

    Korrektur: die Ziffernzeiten lauten richtig:
    0 = 50 ms, 1 = 80 ms, 2 = 110 ms, 3 = 140 ms, … , 9 = 330 ms

    #917
    EREL
    Teilnehmer
    #941
    EREL
    Teilnehmer

    Es hat etwas Arbeit gemacht aber hier ist das gesamte Projekt aufgeführt:

    http://erel.de/PROJEKTE/Cronixie/Index.html

    – „LED-Basic Input“
    – Cronios-Fernsteuerung, Hard- und Software
    – Cronixie-Software einschl. PC-Fernsteuerprogramm

    Für Hinweise und Verbesserungsvorschläge bin ich dankbar!

    #942
    Folker Stange
    Verwalter

    Voll cool!

    #1033
    EREL
    Teilnehmer

    Das in Aussicht gestellte Web-Interface auf Hardwarebasis ESP-8266 ist jetzt hier zu finden:
    http://erel.de/PROJEKTE/Cronixie/inh_webi.html
    Cronios-Mudule oder Cronixie-Uhren sind damit über einen Webbrowser*, UDP-Telegramme oder Url-Requests steuerbar.

    *Leider arbeitet der Webserver hier nicht ganz zufriedenstellend!

    #1034
    Gamadril
    Moderator

    Respekt! Ich habe vor einiger Zeit auch schon versucht das Cronios Modul mit einem ESP Modul zu verheiraten, um die Zeit einmal pro Tag über das Internet zu synchronisieren. Auf dem ESP lief NodeMCU mit einem LUA Script, der die aktuelle Zeit inkl. Zeitzone und DST anhand der Source IP Adresse ermittelt.
    Damit es mit den BASIC-Modulen funktioniert müsste man aber eine vernünftige Schnittstelle für die Kommunikation der BLP-Module mit der Außenwelt schaffen. UART, SPI, I2C…

Ansicht von 7 Beiträgen - 1 bis 7 (von insgesamt 7)
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.