feldmueller
29.05.2006, 18:54
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
'************************************************* *************
'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
'-------------------------------------------------------------------------------
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
'************************************************* *************
'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
'-------------------------------------------------------------------------------