Startseite › Foren › LEDs, Controller, Player › LED-Basic Input-Emulation
- Dieses Thema hat 6 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 7 Jahre, 5 Monaten von
Gamadril.
-
AutorBeiträge
-
29. September 2017 um 14:20 #915
EREL
TeilnehmerLeider 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: Keystatus20900:
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 20910i = 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 = 1020990:
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
return29. September 2017 um 14:26 #916EREL
TeilnehmerKorrektur: die Ziffernzeiten lauten richtig:
0 = 50 ms, 1 = 80 ms, 2 = 110 ms, 3 = 140 ms, … , 9 = 330 ms29. September 2017 um 14:43 #917EREL
Teilnehmer…und hier nochmal besser formatiert:
https://www.dropbox.com/l/scl/AABdjwa8wqa9nGHvakNe0gdIa6AAJymQ5TA25. Oktober 2017 um 8:56 #941EREL
TeilnehmerEs 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-FernsteuerprogrammFür Hinweise und Verbesserungsvorschläge bin ich dankbar!
25. Oktober 2017 um 9:38 #942Folker Stange
VerwalterVoll cool!
16. November 2017 um 23:53 #1033EREL
TeilnehmerDas 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!
17. November 2017 um 11:12 #1034Gamadril
ModeratorRespekt! 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… -
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.