Forum

Einloggen | Registrieren | RSS  

hansi

20.10.2019,
19:08
 

Konsolenbefehl i2cset -y 1 (Elektronik)

Hallo,

ich habe am Raspberry ein Display Joy-it angeschlossen
mit i2cdetect lässt sich der Baustein unter 0x27 finden

nachfolgende Software (für python) hatte ich beim Lieferanten gefunden

nun wollte ich die Speicherzellen über den Konsolenbefehl i2cset -y 1 0x27 0x80 0x46 ansprechen
ich dachte das ist in der Zeile 1 das erste Zeichen
da geht aber das Display aus

kennt jemand den Fehler, oder die Lösung?


import smbus
import time

# Define some device parameters
I2C_ADDR = 0x27 # I2C device address, if any error, change this address to 0x3f
LCD_WIDTH = 16 # Maximum characters per line

# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line

LCD_BACKLIGHT = 0x08 # On
#LCD_BACKLIGHT = 0x00 # Off

ENABLE = 0b00000100 # Enable bit

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005

#Open I2C interface
#bus = smbus.SMBus(0) # Rev 1 Pi uses 0
bus = smbus.SMBus(1) # Rev 2 Pi uses 1

def lcd_init():
# Initialise display
lcd_byte(0x33,LCD_CMD) # 110011 Initialise
lcd_byte(0x32,LCD_CMD) # 110010 Initialise
lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
lcd_byte(0x01,LCD_CMD) # 000001 Clear display
time.sleep(E_DELAY)

def lcd_byte(bits, mode):
# Send byte to data pins
# bits = the data
# mode = 1 for data
# 0 for command

bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT

# High bits
bus.write_byte(I2C_ADDR, bits_high)
lcd_toggle_enable(bits_high)

# Low bits
bus.write_byte(I2C_ADDR, bits_low)
lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
# Toggle enable
time.sleep(E_DELAY)
bus.write_byte(I2C_ADDR, (bits | ENABLE))
time.sleep(E_PULSE)
bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
time.sleep(E_DELAY)

def lcd_string(message,line):
# Send string to display

message = message.ljust(LCD_WIDTH," ";)

lcd_byte(line, LCD_CMD)

for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)

lcd_init()
lcd_string(" Zeile 1 ",LCD_LINE_1)
lcd_string(" Zeile 2 ",LCD_LINE_2)

hansi

20.10.2019,
21:22

@ hansi

Konsolenbefehl i2cset -y 1

Hab jetzt noch den Befehl i2dump -y 1 versucht
da ist das Ergebnis immer mit dem Command identisch
also 0x80 > 0x80
nur wenn das MSB gestzt ist sieht es anders aus
dann 0xf0 > 0x70


» Hallo,
»
» ich habe am Raspberry ein Display Joy-it angeschlossen
» mit i2cdetect lässt sich der Baustein unter 0x27 finden
»
» nachfolgende Software (für python) hatte ich beim Lieferanten gefunden
»
» nun wollte ich die Speicherzellen über den Konsolenbefehl i2cset -y 1 0x27
» 0x80 0x46 ansprechen
» ich dachte das ist in der Zeile 1 das erste Zeichen
» da geht aber das Display aus
»
» kennt jemand den Fehler, oder die Lösung?
»
»
» import smbus
» import time
»
» # Define some device parameters
» I2C_ADDR = 0x27 # I2C device address, if any error, change this address to
» 0x3f
» LCD_WIDTH = 16 # Maximum characters per line
»
» # Define some device constants
» LCD_CHR = 1 # Mode - Sending data
» LCD_CMD = 0 # Mode - Sending command
»
» LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
» LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
» LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
» LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line
»
» LCD_BACKLIGHT = 0x08 # On
» #LCD_BACKLIGHT = 0x00 # Off
»
» ENABLE = 0b00000100 # Enable bit
»
» # Timing constants
» E_PULSE = 0.0005
» E_DELAY = 0.0005
»
» #Open I2C interface
» #bus = smbus.SMBus(0) # Rev 1 Pi uses 0
» bus = smbus.SMBus(1) # Rev 2 Pi uses 1
»
» def lcd_init():
» # Initialise display
» lcd_byte(0x33,LCD_CMD) # 110011 Initialise
» lcd_byte(0x32,LCD_CMD) # 110010 Initialise
» lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
» lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
» lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
» lcd_byte(0x01,LCD_CMD) # 000001 Clear display
» time.sleep(E_DELAY)
»
» def lcd_byte(bits, mode):
» # Send byte to data pins
» # bits = the data
» # mode = 1 for data
» # 0 for command
»
» bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
» bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT
»
» # High bits
» bus.write_byte(I2C_ADDR, bits_high)
» lcd_toggle_enable(bits_high)
»
» # Low bits
» bus.write_byte(I2C_ADDR, bits_low)
» lcd_toggle_enable(bits_low)
»
» def lcd_toggle_enable(bits):
» # Toggle enable
» time.sleep(E_DELAY)
» bus.write_byte(I2C_ADDR, (bits | ENABLE))
» time.sleep(E_PULSE)
» bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
» time.sleep(E_DELAY)
»
» def lcd_string(message,line):
» # Send string to display
»
» message = message.ljust(LCD_WIDTH," ";)
»
» lcd_byte(line, LCD_CMD)
»
» for i in range(LCD_WIDTH):
» lcd_byte(ord(message[i]),LCD_CHR)
»
» lcd_init()
» lcd_string(" Zeile 1 ",LCD_LINE_1)
» lcd_string(" Zeile 2 ",LCD_LINE_2)

bastelix(R)

21.10.2019,
22:50

@ hansi

Konsolenbefehl i2cset -y 1

Hallo,

» ich ein Display Joy-it angeschlossen
Die haben mindestens zwei mit I2C auf ihrer Seite (LCD, OLED) welches genau?

» mit i2cdetect lässt sich der Baustein unter 0x27 finden
»
» nachfolgende Software (für python) hatte ich beim Lieferanten gefunden
Funktioniert das Display mit dem Python-Script?

» kennt jemand den Fehler, oder die Lösung?
Ich hab da noch was im Kopf mit der 7/8-Bit Adressierung. Ein I2C-Gerät hat eine 7-Bit Adresse, und das LSB der 8-Bit-Zahl steht für Read/Write (0 = Schreiben, 1 = Lesen). Wenn ich mich richtig erinnere musst du für i2cset das R/W-Bit in die Adresse aufnehmen. (0x27 << 1 | 0x01) = 0x4F das könntest du mal versuchen, sofern dein Display mit den Python-Script funktioniert.

hansi

22.10.2019,
17:56

@ bastelix

Konsolenbefehl i2cset -y 1

» Hallo,
»
» » ich ein Display Joy-it angeschlossen
» Die haben mindestens zwei mit I2C auf ihrer Seite (LCD, OLED) welches
» genau?

Es ist das zweizeilige Display - Bestell-Nr.: 1503825/Conrad
Hst.-Teile-Nr.: SBC-LCD16x2

»
» » mit i2cdetect lässt sich der Baustein unter 0x27 finden
» »
» » nachfolgende Software (für python) hatte ich beim Lieferanten gefunden
» Funktioniert das Display mit dem Python-Script?
Das Python Script funktioniert einwandfrei
»
» » kennt jemand den Fehler, oder die Lösung?
» Ich hab da noch was im Kopf mit der 7/8-Bit Adressierung. Ein I2C-Gerät hat
» eine 7-Bit Adresse, und das LSB der 8-Bit-Zahl steht für Read/Write (0 =
» Schreiben, 1 = Lesen). Wenn ich mich richtig erinnere musst du für i2cset
» das R/W-Bit in die Adresse aufnehmen. (0x27 << 1 | 0x01) = 0x4F das
» könntest du mal versuchen, sofern dein Display mit den Python-Script
» funktioniert.
Habe 0x4f probiert
da kommte die Meldung, dass maximal 0x7f zulässig ist

bastelix(R)

24.10.2019,
23:49

@ hansi

Konsolenbefehl i2cset -y 1

Vorab: Willst du mit den i2c-tools nur etwas rumspielen oder willst du damit das Display produktiv steuern?

» Es ist das zweizeilige Display - Bestell-Nr.: 1503825/Conrad
» Hst.-Teile-Nr.: SBC-LCD16x2
Ok, hab ein vergleichbares Modell da. Auf die schnelle hat das mit einem BanananPI, armbian und i2c-tools garnicht funktioniert (Display tut nix, i2cset/i2cget brechen mit write/read-error ab).

Welchen Raspberry hast du? (Pi 3 Model B hätte ich hier) und welches Betriebssystem in welcher Version verwendest du?

» » » mit i2cdetect lässt sich der Baustein unter 0x27 finden
» » »
» » » nachfolgende Software (für python) hatte ich beim Lieferanten gefunden
» » Funktioniert das Display mit dem Python-Script?
» Das Python Script funktioniert einwandfrei
Kannst du den Link zur Quelle posten? Aus dem Forum kopieren funktioniert nicht wirklich (wer auch immer es für eine gute Idee hielt Blöcke in einer Programmiersprache durch White-Space zu definieren....)

» » » kennt jemand den Fehler, oder die Lösung?
» » Ich hab da noch was im Kopf mit der 7/8-Bit Adressierung. Ein I2C-Gerät
» hat
» » eine 7-Bit Adresse, und das LSB der 8-Bit-Zahl steht für Read/Write (0 =
» » Schreiben, 1 = Lesen). Wenn ich mich richtig erinnere musst du für
» i2cset
» » das R/W-Bit in die Adresse aufnehmen. (0x27 << 1 | 0x01) = 0x4F das
» » könntest du mal versuchen, sofern dein Display mit den Python-Script
» » funktioniert.
» Habe 0x4f probiert
» da kommte die Meldung, dass maximal 0x7f zulässig ist
Sorry, da war ich auf dem Holzweg. Die i2c-tools arbeiten mit 7-Bit Adressen. Hätte vor dem posten doch nochmal an der richtigen Stelle der man page nachlesen sollen. Mein Fehler.