MAX127 Ansteuerung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
MartinKN
User
Beiträge: 5
Registriert: Sonntag 2. Februar 2020, 20:11

Hallo Zusammen,

habe bisher immer mit Atmegas entwickelt und bin jetzt mal auf den Rapsberry umgestiegen - man möchte ja mal Neues kennen lernen.
Und gleich habe ich dazu mal eine Frage in der Hoffnung ihr könnt mir weiter helfen.

Habe am I2C über Pegelwandler einen PCF8574 und zwei MAX127 angeschlossen. Pull-Up Widerstände sind verbaut, ich kann mit einem Mikrocontroller auch beide Bausteine MAX ansprechen. Mit dem Raspi funktioniert aber nur der PCF8574, als Ergebnis von den Max bekomme ich immer nur FF zurück, irgendwas stimmt hier nicht. Könnt ihr mir einen Tipp geben wo ich suchen muss?
Angeblich sollte das über read_word_data funktionieren, bei C oder Bascom per Atmega ist die Ansteuerung doch ein wenig anders...

Besten Dank im Voraus und viele Grüße, Martin
MAX127 Code:

Code: Alles auswählen

import os
import smbus
import time
i2cbus = smbus.SMBus(1)

Max127_1 = 0x29
Max127_2 = 0x2c
#Kanal0 = 0x88 - 10001000
#Kanal1 = 0x98 - 10011000
#Kanal2 = 0xA8 - 10101000
#Kanal3 = 0xB8 - 10111000
#Kanal4 = 0xC8 - 11001000
#Kanal5 = 0xD8 - 11011000
#Kanal6 = 0xE8 - 11101000
#Kanal7 = 0xF8 - 11111000

Maxwert = i2cbus.read_word_data(Max127_2, 0x88)
#lsb = Maxwerte >> 12
#msb = Maxwerte & 0x00FF
#Ergebnis = (lsb * 16) + (msb / 16)                                 

print(Maxwert)
Zuletzt geändert von MartinKN am Sonntag 2. Februar 2020, 20:43, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte in Zukunft die Code-Tags benutzen, der </>-Knopf im erweiterten Editor.

Und zu deinem Problem: was sagt denn

Code: Alles auswählen

i2cdetect -y 1
? Kommen da die MAXe?
MartinKN
User
Beiträge: 5
Registriert: Sonntag 2. Februar 2020, 20:11

Hallo zurück,
habs korrigiert bezüglich code tags.
Und ja, die MAX werden über i2cdetect beide gefunden - Adressen sind korrekt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du mal das Datenblatt gelesen? Da steht das man erstmal ein Control-Wort schreiben muss, damit der ausgewaehlte Kanaele anschaltet, etc. https://datasheets.maximintegrated.com/ ... MAX128.pdf
MartinKN
User
Beiträge: 5
Registriert: Sonntag 2. Februar 2020, 20:11

Ja, das kenn ich in uns auswendig.
Per Bascom hab ichs ja auch hin bekommen. Laut einem Eintrag:
https://www.mikrocontroller.net/topic/320759
sollte das per read_word_data bereits funktionieren.
Habe es auch mit write_byte vorher versucht, ist ja kein ganzes Wort was man dem Chip schicken muss, ändert aber nichts

Code: Alles auswählen

data1 = i2cbus.write_byte(Max127_2, 0x88)
Maxwert = i2cbus.read_word_data(Max127_2, 0x88)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also mir fehlt da das Register. Du musst schon sagen, das du Register 0 beschreiben willst.
MartinKN
User
Beiträge: 5
Registriert: Sonntag 2. Februar 2020, 20:11

Hmm, ok, da könntest Du recht haben.
Hast Du mir einen Tipp wie? Das is wohl ein wenig meine Grenze...

S Addr Wr [A] reg [A] word LSB [A] word MSB [A] P
i2cbus.write_word_data(Max127_2, 0x80, 0x88)

In etwa so?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Aufruf sollte write_byte_data(addr, register, wert) sein.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hm. Gerade gesehen, der arbeitet gar nicht mit Registern. Dann sollte es ggf so gehen:

Code: Alles auswählen

from smbus2 import SMBus, ic_msg

with SMBus(1) as bus:

    # Write some bytes to address 80
    msg = i2c_msg.write(adresse, [wert])
    bus.i2c_rdwr(msg)
MartinKN
User
Beiträge: 5
Registriert: Sonntag 2. Februar 2020, 20:11

Sehr cool, das war des Rätsels Lösung - jetzt funktioniert es! Vielen Dank für die Unterstützung!!!

Und falls mal jemand den Code braucht:
;)

Code: Alles auswählen

import os
import time
from smbus2 import SMBus, i2c_msg, SMBusWrapper
bus = SMBus(1)

Max127_Adresse= 44 #0x29
Kanal = 0xE0 

msgwrite = i2c_msg.write(Max127_Adresse, [Kanal])
bus.i2c_rdwr(msgwrite)
time.sleep(0.25)
msgread = i2c_msg.read(Max127_Adresse,2)   
bus.i2c_rdwr(msgread)

Maxwerte_List = list(msgread)
Spannung_MSB = Maxwerte_List[0]
Spannung_LSB = Maxwerte_List[1]
Ergebnis = (Spannung_MSB * 16) + (Spannung_LSB / 16)
Ergebnis = Ergebnis * 1.2207 / 1000
         
        
print(Ergebnis)

Antworten