Hallo zusammen,

ich will einen I2C-12bit ADC ADS7828 auslesen und habe gerade ein Problem bei dem ich nicht weiterkomme. Da ich mich in Bascom mit dem Buch von Walter eingearbeitet habe, hab ich seine Unterprogramme fuer I2C uebernommen, aber die machen wahrscheinlich nicht viel anderes, als die Standard-Bascom I2C Befehle. Bisher jedenfalls konnte ich problemlos EEPROMs und auch den CMPS03 damit ansteuern.

Nun zum Problem:

Ich steuere den ADC wie im Datenblatt beschrieben an und bekomme auch richtige Statuscodes zurueck. Nur beim Auslesen des 12bit-ADC-Werts funktioniert was nicht.
Nach dem wiederholten Startbefehl, sende ich die Slaveadresse im Lesemodus und danach sollte ich High- und Lowbyte des AD-Wertes empfangen koennen. Nach dem Highbyte muesste ein ACK und nach dem Lowbyte, also dem letzten Byte ein NACK kommen. Nur leider bekomme ich schon nach dem ersten Byte (dem Highbyte) einen Statuscode H58, also Datenbyte empfangen NACK zurueck.

Was mach ich da falsch?

Ich hoffe, ich hab mein Problem einigermassen verstaendlich beschrieben und hoffe, dass mir jemand auf die Spruenge helfen kann.

Danke im voraus!

Viele Gruesse,
Stefan

Code:
'************************************************************** 
'ads7828_test.bas : Testprogramm fuer den I2C-ADC ADS7828 
'************************************************************** 
 
$regfile = "m8def.dat" 
$crystal = 3686400 
$baud = 9600 
 
Declare Function Twistart() As Byte 
Declare Function Twisend(byval Databyte As Byte) As Byte 
Declare Function Twireceive(byref Databyte As Byte) As Byte 
Declare Sub Twistop() 
 
Dim I As Byte                                      'temporaere Variable fuer Statuscodes 
Dim Highdatabyte As Byte 
Dim Lowdatabyte As Byte 
Dim Result As Word 
 
Twsr = &B00000000  'Bits1+0=00: TWI-Vorteilung 1 
Twbr = 0   'Twi-Prescale 
 
Do 
  'Ch0 auslesen: 
 
  If Twistart() <> &H08 Then Goto Raus                 'START-Signal generieren 
  If Twisend(&B10010000) <> &H18 Then Goto Raus             'Slave-Adresse im Sendemodus senden                                  
  If Twisend(&B10001100) <> &H28 Then Goto Raus             'Commandbyte senden, Byte7=1 SinglEndInp                                                
                                                           'Byte6+5+4=Ch0,Byte3+2=RefOn+ADCon 
 
  If Twistart() <> &H10 Then Goto Raus                      'erneutes START-Signal 
  If Twisend(&B10010001) <> &H40 Then Goto Raus             'SlvAdr(R) senden 
 
  I = Twireceive(highdatabyte) 
  Printbin I; 
  If I <> &H50 Then Goto Raus                               'Highbyte empfangen ->ACK 
 
  I = Twireceive(lowdatabyte) 
  Printbin I; 
  If I <> &H58 Then Goto Raus                               'Lowbyte empfangen ->NO ACK 
 
  Raus: 
  Twistop 
 
  'Print "*"; 
  'Print Highdatabyte; 
  'Print "+"; 
  'Print Lowdatabyte; 
  Shift Highdatabyte , Left , 4 
  Result = Highdatabyte + Lowdatabyte 
  'Print Result 
  Waitms 500 
Loop 
 
 
'================================================================================ 
========= 
Function Twistart() As Byte 
  Twcr = &B10100100                                         'START-Signal erzeugen 
  Do : Loop Until Twcr.twint = 1                            'Warten bis fertig 
  Twistart = Twsr And &B11111000                            'Status-Code zurückgeben 
End Function 
'------------------------------------------------------------------------------------------ 
Function Twisend(byval Databyte As Byte) As Byte 
  Twdr = Databyte                                           'Byte ins Datenregister 
  Twcr = &B10000100                                         'TWI-Operation starten 
  Do : Loop Until Twcr.twint = 1                            'Warten bis fertig 
  Twisend = Twsr And &B11111000                             'Status-Code zurückgeben 
End Function 
'------------------------------------------------------------------------------------------ 
Function Twireceive(byref Databyte As Byte) As Byte 
  Twcr = &B10000100                                         'TWI-Operation starten 
  Do : Loop Until Twcr.twint = 1                            'Warten bis fertig 
  Databyte = Twdr 
  Twireceive = Twsr And &B11111000                          'Status-Code zurückgeben 
End Function 
'------------------------------------------------------------------------------------------ 
Sub Twistop() 
  Twcr = &B10010100                                         'STOP-Signal erzeugen 
End Sub 
'-------------------------------------------------------------------------------