Hallo Forum,
ich versuche mich gerade an die Programmierung meines ersten "klitztekleinen" Pythonprogramm.
Als Hardware habe ich den Raspberry PI 2, eine Digital-Ausgangskarte(DA) mit 8 Ausgängen und eine Digital-Eingangskarte(DE) mit 8 Eingängen über den I2C Bus.
Mein Ziel war und ist es die DA-Ausgänge mit den DE-Eingängen zu schalten.
Nach dem anschließen der Hardeware habe ich zuerst geschaut ob beiden Karten vom PI erkannt werden (i2cdetect -y 1).
i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- 08 -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3f
DA hat die Adresse 20, DE Adresse 3f. Gebe ich z.B. die Anweisung: i2cset -y 1 0x20 0x00;i2cget -y 1 0x3f erhalte ich 0x00 und alle 8 LED's leuchten.
Mit der Anweisung: i2cset -y 1 0x20 0xff;i2cget -y 1 0x3f erhalte ich 0xff und alle LED's schalten sich aus
Hier kann ich jetzt alles von 0x00 bis 0xFF eingeben ich bekommen immer die richtige Auswahl und LED oder LED`s geschaltet.
z.B. DA 0x01>DE 0x01, DA 0xD3>DE 0xD3, DA 0xA9>DE 0xA9 usw.
Jetzt würde ich es gerne als kleines Programm laufen lassen und das Ein- und Ausschalten über Python als Endlosschleife starten. Leider ist bei mir im Programm ein Fehler und ich weiss nicht wo er liegt. Starte ich das Programm beiben bei mir die zwei LED's, also Bit 7 und Bit 8 an. Diese beiden LED's leuchten dann dauerhaft.
-*- coding: iso-8859-15 -*-
#!/usr/bin/python
import smbus
import time
# I2C-Adresse des DIGITALOUTPUT
addr_01 = 0x20
# I2C-Adresse des DIGITALINPUT
addr_02 = 0x3f
# Erzeugen einer I2C-Instanz und Öffnen des Busses
outset = smbus.SMBus(1)
inget = smbus.SMBus(1)
# Konfiguration
outset.write_byte_data(addr_01,0x20,0xff) # Bank A Output
inget.read_byte_data(addr_02,0x3f)
time.sleep(10)
# Blinkeschleife
while True:
# alle LEDs aus
outset.write_byte_data (addr_01,0x20,0xFF)
print(inget.read_byte_data(addr_02,0x3f))
print("Ausgänge sind ein")
time.sleep(5)
# alle LEDs an
outset.write_byte_data (addr_01,0x20,0xd3)
print(inget.read_byte_data(addr_02,0x3f))
print("Ausgänge sind Aus")
time.sleep(5)
Display More
Das ist die Ausgabe die ich nach dem starten bekomme.
python3 ~/Tkinter/io.py
63
Ausgänge sind ein
19
Ausgänge sind Aus
63
Ausgänge sind ein
19
Ausgänge sind Aus
63
Ausgänge sind ein
19
Ausgänge sind Aus
63
Ausgänge sind ein
19
Ausgänge sind Aus
63
Ausgänge sind ein
19
Ausgänge sind Aus
usw.
Breche ich nun das Programm ab bleiben die beiden LED's an. Gebe ich jetzt den Befehl von oben wieder ein:
i2cset -y 1 0x20 0x00;i2cget -y 1 0x3f
0x00 > richtig
i2cset -y 1 0x20 0xff;i2cget -y 1 0x3f
0x3f > ?????
ODER
i2cset -y 1 0x20 0xef;i2cget -y 1 0x3f
0x2f > ?????
Erst ein abschalten der Spannung auf dem I2C Bus (Nicht den PI Spannungslos) läßt die Anweisung i2cset -y 1 0x20 0xff;i2cget -y 1 0xFF = 0xFF oder i2cset -y 1 0x20 0x00;i2cget -y 1 0x00 richtig darstellen.
Das Programm macht immer diesen Fehler nur weiss ich beim besten Willen nicht wo mein Fehler liegt.
Somit erst einmal Schluss und ich wünsche allen hier im Forum einen schönen Sonntag Abend.
Gruß aus Dorsten(NRW)
Herbert