PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 14bit ADC max1069 Problem mit auslesen über Hard-TWI & M



mat-sche
02.03.2010, 19:06
Hallo und nen schön Abend!

Ich habe mal wieder ein kleines Problem bei dem ich nicht weiter komme. Ich versuche schon seit geraumer Zeit einen max1069 per TWI bei 400kHz auszulesen. Leider fehlt mir jetzt ne Idee und Eure Hilfe!
Im Anhang ein Spektrum meiner Übertragung zum max1069.



$lib "i2c_twi.lbx"
Config Twi = 400000 ' Init TWBR und TWSR
' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
Twcr = &B00000100
Config Scl = Portc.0 'Is serial clock SCL
Config Sda = Portc.1
Const Max1069wr = &B01101110 'DS1624 Sensor write
Const Max1069rd = &B01101111
I2cstart
I2cwbyte Max1069wr
I2crbyte Spannung1 , Ack
I2crbyte Spannung2 , Nack
I2cstop
Locate 2 , 1 : Lcd "I2c err= " ; Err
Locate 1 , 1 : Lcd "Spannung1= " ; Str(spannung1)
Locate 2 , 1 : Lcd "Spannung2= " ; Str(spannung2)


Mit dem Code spreche ich den MAX an. Laut des Pegelprotokolls bekomme ich nach der Start Aufforderung und anschließendem Adresssendung ein acknowledge. Wenn ich nach dem datasheet gehe, sollte nach jedem byte was durch den Master angestoßen wird ein acknowledge auch durch ihn gesendet werden. Dies vermisse ich aber an der Übertragung in meinem Analyzer.

Hat jemand von Euch ne Idee woran das liegen kann?

Gruß MAT

mare_crisium
03.03.2010, 01:46
mat-sche,

guck' mal auf Seite 15 des Datenblattes den Abschnitt "Internal Reference Shut-down" an. Wenn Du dem IC mit R/W-Bit=0 ansprichst, schaltet er die interne Referenzspannung ab. Du musst ihm die Adresse mit R/W=1 schicken, also Max1069rd ;-)!

Ciao,

mare_crisium

mat-sche
04.03.2010, 15:56
hi mare_crisium,

jo Du hast recht. Habe mal auf rd umgestellt aber ohne eine Änderung. Bekomme für beide Byts eine 255. Schau ich mir das TWI Signal an, werden alle Signale wie im datasheet ( Abbildung 11 S.16) beschrieben gesendet, jedoch ohne eine Größe.
Die twi Übertragung ist laut Errorüberwachung in Ordnung.
Hat jemand nen Plan oder eine Idee?

mat-sche
04.03.2010, 18:07
Nachtrag!

werde mir jetzt wohl oder über mal langsam nen Paar richtige steckkabel für mein Testboard zulegen müssen! :(
Das soll heißen, dass der Code soweit funst (R/W) muss natürlich 1 sein. Der Fehler war eine nicht richtige Kontaktierung auf dem Steckerboard.

MAT

mare_crisium
05.03.2010, 07:33
MAT,

freut mich, dass es jetzt im Prinzip funzt :-) ! Im Oszillogram ist am Ende des ersten ACK-Impulses so eine komische Spitze zu sehen. Ich hatte mir das damit erklärt, dass der IC da schon in Schlafstellung geht. Könnte aber auch ein Wackelkontakt sein. Viel Erfolg weiterhin!

Ciao,

mare_crisium

mat-sche
05.03.2010, 08:44
Hallo mare_crisium,

ich hatte zu Beginn das Readbit auf 1 stehend und keine Resultatet gesehen. Auch mich hat der Spike im Oszillogram etwas verwundert.
Inzwischen läuft alles und werde den Code vollständig dann abbilden.

Gruß MAT

mat-sche
07.03.2010, 16:38
Hi,

und nun noch ein kleines Demoprogramm dazu:


'************************************************* *********

'Programm :
'By : mat-sche
'Compiler : BASCOM-AVR 1.11.9.3
'Hardware : DS1820 an Port d.4
'
' LCD-Display 4x20 an PortC
' max1069 an Hardware TWI
'Chip type : MEGA32
'Date : 04.03.2010
'************************************************* *********

$regfile = "m32def.dat"
$crystal = 14745600



$baud = 9600
$lib "i2c_twi.lbx"
$hwstack = 64
$swstack = 64
$framesize = 64
'$sim


'------------------------------------------------------------------------------- 2x16 LCD Display an Port c =>Conector
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Lcd = 20 * 4
Config Lcdbus = 4
Initlcd
Cursor Off
Cls


Ddrd = &B00010000 'pull up einschalten für Taster
Ddrb = &B1000000
Dim Gsm As Bit
Led Alias Portb.7
Dim Rs232_flash As Byte
Dim Rs232_str As Byte
'------------------------------------------------------------------------------- Variablen
Config Twi = 400000 ' Init TWBR und TWSR
' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
Twcr = &B00000100
Config Scl = Portc.0 'Is serial clock SCL
Config Sda = Portc.1
Const Max1069wr = &B01101110 'DS1624 Sensor write
Const Max1069rd = &B01101111
Dim E_ah As Byte 'höherwertiges Byte der SpeicherAdresse (Adresse=Word)
Dim E_al As Byte 'niederwertiges Byte der SpeicherAdresse (Adresse=Word) 'Is serial data SDA
Dim E_addr As Word 'SpeicherAdresse EEprom
Dim E_dat_r As Byte
Dim Spannung1 As Byte , Spannung2 As Byte , Spannung3 As Word , Spannung4 As Single
'Dim Storespannung(2) As Byte At Spannung Overlay 'Maske: weise die 4Byte aus dem Single(Temperature) dem
Dim Bita As Bit
Dim Avgschleife1 As Byte
Dim Avg1_ges_temp As Long , Avg_1 As Long


'-------------------------------------------------------------------------------


Locate 1 , 1
Lcd "start"
Waitms 100
Cls
Do

'************************************************* ****************************** 'Automatisches Flashen über RS232
Rs232_flash = Ischarwaiting()
If Rs232_flash = 1 Then 'wurde was über RS232 empfangen?
Rs232_str = Inkey() 'Empfangspuffer auslesen
If Rs232_str = 123 Then 'vom MCS-Programmer geschickte "123" empfangen?
Goto &HF800 'Sprungadresse zum Startbereich des Bootloaders
End If
End If
Led = 1 'Pin wird auf High, also 5V geschaltet
Waitms 100
Print "LED"
Led = 0 'Pin wird auf Low, also 0V geschaltet
Waitms 100

I2cstart
I2cwbyte Max1069rd
I2crbyte Spannung1 , Ack ' acknowledge => weiteres Datenbit wird erwartet
I2crbyte Spannung2 , Nack ' not acknowledge => abschluss der Übertragung
I2cstop

'Spannung3 = Spannung1 * 256
'Spannung3 = Spannung3 + Spannung2
'Shift Spannung3 , Right , 2
Spannung3 = Makeint(spannung2 , Spannung1) ' high und lowbyte zur worvariable zusammensetzen

Avg1_ges_temp = Avg1_ges_temp + Spannung3 ' 2 fach oversampling
Incr Avgschleife1
If Avgschleife1 = 2 Then
Spannung4 = Avg1_ges_temp / 2
Avgschleife1 = 0
Avg1_ges_temp = 0
Spannung4 = Spannung4 * 4.096
Spannung4 = Spannung4 / 16384
Locate 1 , 1 : Lcd "Sp4= " ; Spannung4
Locate 2 , 1 : Lcd "I2c err= " ; Err
End If
'Waitms 300

'************************************************* ****************************** CONTINUOUS CONVERSIONS


If Bita = 1 Then
Cls
I2cstart
I2cwbyte Max1069rd
I2crbyte Spannung1 , Ack
I2crbyte Spannung2 , Ack

I2crbyte Spannung1 , Ack
I2crbyte Spannung2 , Ack

I2crbyte Spannung1 , Ack
I2crbyte Spannung2 , Nack
I2cstop

Spannung3 = Makeint(spannung2 , Spannung1)
Spannung4 = Spannung3 * 4.096
Spannung4 = Spannung4 / 16384
Locate 1 , 1 : Lcd "Sp4= " ; Spannung4
Locate 2 , 1 : Lcd "I2c err= " ; Err


Locate 3 , 1 : Lcd "I2c err= " ; Err

End If
'------------------------------------------------------------------------------- Taster für Kommado senden an die verschiedenen Slaves
Debounce Pina.7 , 1 , Taster1 , Sub
Debounce Pina.6 , 1 , Taster2 , Sub
Debounce Pina.5 , 1 , Taster3 , Sub
Debounce Pina.4 , 1 , Taster4 , Sub
Debounce Pina.3 , 1 , Taster5 , Sub
'Waitms 200



Loop
End


'************************************************* ****************************** SUBS

Taster1:
Cls
I2cstart
I2cwbyte Max1069rd
I2crbyte Spannung1 , Ack
I2crbyte Spannung2 , Nack
I2cstop

Spannung3 = Spannung1 * 256
Spannung3 = Spannung3 + Spannung2
Shift Spannung3 , Right , 2
Spannung4 = Spannung3 * 4.096
Spannung4 = Spannung4 / 16384
Locate 1 , 1 : Lcd "Sp4= " ; Spannung4

Return

Taster2:
Toggle Bita
Locate 4 , 1
Lcd "Taster2"
Return

Taster3:
'Timervorgabe = 63500
Locate 1 , 1
Lcd "Taster3"
Return

Taster4:
Enable Timer1
'Timervorgabe = 64300
Locate 1 , 1
Lcd "Taster4"
Return

Taster5:
Gsm = 1
Locate 2 , 1
Lcd "Taster5"
Return


Gruß MAT

mare_crisium
07.03.2010, 17:45
MAT,

schick ! ;-)

mare_crisium