Hallo
Ich versuche hier einen in einem Gerät fix verbauten MCP3426 per I2C-Bus anzusprechen -
besser gesagt zum Spannung und Strom messen zu bewegen.
Hierfür habe ich mir eine Include-Datei gebastelt:
Alles anzeigen
Im Hauptprogramm wird die Hardware-TWI initialisiert.
Dann versuche ich mit folgendem Code eine Spannung (Kanal 0) zu messen.
In Variable tmpInteger sollte nun der ADC-Wert des MCP3426 enthalten sein.
Als Ergebnis bekomme ich stets den Wert -1.
Per Function AD_Check() reagiert der Baustein am I2C-Bus. Also ist Bus und IC soweit OK.
Kann mir jemand sagen, was ich falsch mache?
Ich versuche hier einen in einem Gerät fix verbauten MCP3426 per I2C-Bus anzusprechen -
besser gesagt zum Spannung und Strom messen zu bewegen.
Hierfür habe ich mir eine Include-Datei gebastelt:
BASCOM-Quellcode
- ' Modul: MCP3426inc
- ' Status: Bearbeitung
- ' Beschreibung:
- ' Messung von Strom und Spannung am Prüfling über ADC-Baustein MCP3126.
- ' - 2-Kanal AD-Wandler mit 16 Bit auflösung
- ' - Gain 1x, 2x, 4x und 8x
- ' - interne Referenz = 2,048V
- '
- ' Kanal 0 = Spannung
- ' Kanal 1 = Strom
- ' --------------------------------------------------------
- ' Konstanten
- ' --------------------------------------------------------
- Const AD_DEVICE_WRITE = &b1101_0000 ' Device-Adresse Schreiben
- Const AD_DEVICE_READ = AD_DEVICE_WRITE + 1 ' Device-Adresse lesen
- ' Channel-Bits
- Const AD_CH0 = &b0000_0000 ' Channel 0
- Const AD_CH1 = &b0010_0000 ' Channel 1
- ' Gain-Bits
- Const AD_GAIN_1 = &b0000_0000 ' Gain x1
- Const AD_GAIN_2 = &b0000_0001 ' Gain x2
- Const AD_GAIN_4 = &b0000_0010 ' Gain x4
- Const AD_GAIN_8 = &b0000_0011 ' Gain x8
- ' --------------------------------------------------------
- ' Interne Variablen
- ' --------------------------------------------------------
- Dim AD_Buffer(3) as Byte
- Dim AD_Value as Integer at AD_Buffer(_base) Overlay
- ' --------------------------------------------------------
- ' Deklarationen
- ' --------------------------------------------------------
- Declare Function AD_Check() as Byte
- Declare Sub AD_StartConversation(Byval Channel as Byte , Byval Gain as Byte)
- Declare Function AD_ReadValue() as Integer
- ' --------------------------------------------------------------------------------------
- Goto Modul_MCP3426_Exit
- ' --------------------------------------------------------------------------------------
- ' Sub MCP_Init()
- ' End Sub
- Function AD_ReadValue() as Integer
- Local ErrCount as Byte
- ErrCount = 100 ' Anzahl Leseversuche, bis RDY=0
- I2CStart
- I2CWByte AD_DEVICE_READ ' Adressieren zum Lesen
- I2CRByte AD_Buffer(_base + 1) , Ack
- I2CRByte AD_Buffer(_base + 0) , Ack
- Do
- I2CRByte AD_Buffer(_base + 2) , Ack
- If AD_Buffer(_base + 2).7 = 0 then Exit Do
- Decr ErrCount
- Waitms 5
- Loop Until ErrCount = 0
- I2CRByte AD_Buffer(_base + 2) , NAck
- I2CStop
- If ErrCount = 0 then ' Fehler, keine Versuche mehr
- AD_ReadValue = -100
- Exit Function
- End If
- ' Messwert auslesen
- I2CStart
- I2CWByte AD_DEVICE_READ ' Adressieren zum Lesen
- I2CRByte AD_Buffer(_base + 1) , Ack
- I2CRByte AD_Buffer(_base + 0) , Nack
- I2CStop
- AD_ReadValue = AD_Value ' Messwert an Aufrufer
- End Function
- ' --------------------------------------------------------
- ' Startet eine Einzelmessung mit 16Bit Auflösung
- ' --------------------------------------------------------
- Sub AD_StartConversation(Byval Channel as Byte , Byval Gain as Byte)
- Local cfgByte as Byte
- ' Configurations-Byte zusammensetzen
- cfgByte = &b10001000 ' Start-Conversation Single, 16 Bit
- cfgByte = cfgByte or Channel ' Kanal hinzufügen
- cfgByte = cfgByte or Gain ' Gain hinzufügen
- Locate 1 , 11 : Lcd bin(cfgByte)
- I2CStart
- I2CWByte AD_DEVICE_WRITE ' Adressieren
- I2CWByte cfgByte ' Conversation starten
- I2CStop
- End Sub
- ' --------------------------------------------------------
- ' Prüft, ob der Baustein MCP3426 am Bus antwortet.
- ' Rückgabe: True bei Antwort, sonst False
- ' --------------------------------------------------------
- Function AD_Check() as Byte
- I2CStart
- I2CWByte AD_DEVICE_WRITE ' Adressieren zum Schreiben
- I2CStop
- If Err = 0 then
- AD_Check = True
- Else
- AD_Check = False
- End If
- End Function
- ' --------------------------------------------------------------------------------------
- Modul_MCP3426_Exit:
- ' --------------------------------------------------------------------------------------
Im Hauptprogramm wird die Hardware-TWI initialisiert.
Dann versuche ich mit folgendem Code eine Spannung (Kanal 0) zu messen.
Als Ergebnis bekomme ich stets den Wert -1.
Per Function AD_Check() reagiert der Baustein am I2C-Bus. Also ist Bus und IC soweit OK.
Kann mir jemand sagen, was ich falsch mache?