Hallo Ingo,
ich habe mir mal deine Funktionen angeschaut. In der Funktion LogarDimWert() ist ein Fehler, da taucht einmal STRwert auf, sollte aber wohl INTwert sein. Die Funktion decToBin() ist ok, es gibt aber auch eine eingebaute Funktion dafür. In der Funktion EncodeToMan() stecken ein paar Fehler.
- Die Dezimalzahl dimwert wird in ihre Ziffern zerlegt, für jede Ziffer der Ascii-Code ermittelt und der dann in eine Binärzahl umgewandelt. Für jede Binärzahl wird der Manchester-Code ermittelt und das Ergebnis als Liste zurückgegeben. Es reicht aber, dimwert direkt in Binär umzuwandeln, daraus den Manchester-Code zu ermitteln und das als Ergebnis zu liefern.
- Die Schleife zum Anhängen von Nullen (1. i-Schleife) wird einmal zu wenig ausgeführt. Das Ergebnis ist 7-stellig.
- Alles hinter dieser Schleife ist eingerückt, es sollte aber nur eine Zeile innerhalb dieser Zeile ausgeführt werden.
- Den Manchester-Code gibt es in 2 Varianten, hier wird die Falsche erzeugt. D.h. 0 und 1 sind vertauscht.
Ich habe mal die fehlerhaften Teile überarbeitet und noch eine Funktion Frame() hinzugefügt, da an das manchestercodierte Datenbyte noch Start- und Stopbits dran müssen. Das Ergebnis hat dann 21 Bit. Die Funktion LogarDimWert() habe ich so verändert, dass sie eine Integerzahl zurück liefert.
import math
def LogarDimWert(INTwert):
INTreturn=0
if INTwert>0:
INTreturn= int(math.log(INTwert, 10) * 127 + 1)
return INTreturn
def decToBin(n):
if n == 0:
return ''
else:
return decToBin(n / 2) + str(n % 2)
def EncodeToMan(inp):
dimwert = LogarDimWert(inp)
ret=""
f = decToBin(dimwert)
s = ""
for i in range(0, 8 - len(f)):
s = s + "0"
f = s + f
s2 = ""
for i in range(len(f)):
if f[i] == "0":
s2 += "01"
if f[i] == "1":
s2 += "10"
ret = s2
return ret
def Frame(dimm):
ManCode = "1" + EncodeToMan(dimm) + "0000"
return ManCode
Display More
Zu der Idee, das Ganze über den seriellen Pin zu senden, kann ich nichts sagen. Wenn das Signal so auch der zeitlichen Spezifikation entspricht, wäre das eine einfache Lösung. Ich hätte das wahrscheinlich ein Script machen lassen, weil ich nicht auf die Idee gekommen wäre. Bezüglich der Elektronik überlege ich, ob vielleicht noch eine Strombegrenzung auf die 12V-Seite sollte, die Spezifikation spricht da von 2mA pro EVG.
Gruß
Rob