Dzień dobry, staram się wgrać i odczytać wartość współczynnika emisyjności. Połączenia są sprawdzone i dobre. Czujnik komunikuje się z mikroprocesorem i można odczytać temperaturę. tak więc problem leży za pewne w programie który napisałem. Pierwszy raz komunikuje się po i2c więc proszę o wyrozumiałość. Poczytałem poradniki i przeanalizowałem inne programy. Za pomoc przewidziana nagroda(która rozwiąże problem).
kod BASCOM :
Kod:
$regfile = "m8Adef.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
$lib "i2c_twi.lbx"
'definicja zmiennych
Dim Lowbyt As Byte
Dim Highbyt As Byte
Dim Pec As Byte
Dim Tempdata As Single
Dim Napis As String * 5
Dim Wsp_e As Single
Const Stala_emisyj = 65535
Const Tempfactor = 0.02
Dim Ar(5) As Byte
Dim Crc As Byte
'zadeklarowanie nóżek do komunikacji i2c
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit
Config Twi = 20000 '
Twcr = &B00000100
Config Submode = New
'funkcja licząca kod PEC dla wielomianu X8+X2+X1+1
Function Crc8smb(pdata As Byte) As Byte
Dim Index As Byte
Pdata = Pdata Xor Crc '//xor new byte and old crc to get remainder + byte
For Index = 0 To 7 '//check all 8 bits
If Pdata.7 = 1 Then '//if bit 7 is a 1
Shift Pdata , Left '//shift it out
Pdata = Pdata Xor $07 '//then xor with the polynomial
Else '//if the bit is not a 1
Shift Pdata , Left '//just shift it out
End If
Next '//check next bit
Crc8smb = Pdata
End Function
Do
Lowbyt = 0
Highbyt = 0
Pec = 0
Tempdata = 0
Wsp_e = 0
Crc = 0
Ar(2) = 0
Ar(3) = 0
Ar(4) = 0
Ar(5) = 0
Wait 2
'odczyt temperatury. Działa
I2cstart
I2cwbyte &B10110100 '7bit slave addres+0
I2cwbyte &H07 'rejestr odczytu temp
I2crepstart
I2cwbyte &B10110101 '7bit slave addres+1
I2crbyte Lowbyt , Ack
I2crbyte Highbyt , Ack
I2crbyte Pec , Nack
I2cstop
Cls
'przetworzenie wyniku pomiaru na zmienna typu single
Tempdata = Highbyte2
Shift Tempdata , Left , 8
Tempdata = Tempdata + Lowbyte2
'przetwarzanie wyników pomiaru na stopnie celcjusza
Tempdata = Tempdata * Tempfactor
Tempdata = Tempdata - 0.01
Tempdata = Tempdata - 273.15
Napis = Fusing(tempdata , "##.##")
Cls
Lcd " Temp Z Prom "
Lowerline
Lcd "Wynik:" ; Napis2 ; Chr(1) ; "C"
Wait 5
'odczyt współczynnika e
I2cstart
I2cwbyte &B10110100 'slave adress wr
I2cwbyte &H24 'rejestr z wsp emisyjności
I2crepstart 'sr
I2cwbyte &B10110101 'slave adress RD
I2crbyte Lowbyt , Ack 'data byte low
I2crbyte Highbyt , Ack 'data byte high
I2crbyte Pec , Nack 'pec
I2cstop
'przetworzenie wyniku pomiaru na zmienna typu single
Tempdata = 0
Tempdata = Highbyt
Shift Tempdata , Left , 8
Tempdata = Tempdata + Lowbyt
'przetwarzanie wyników pomiaru na e
Wsp_e = Tempdata / Stala_emisyj
Napis2 = Fusing(wsp_e , "#.##")
Cls
Lcd "wsp emisyjnosci"
Lowerline
Lcd "Wynik:" ; Napis2 ;
Wait 5
'Zapis_wspolczyinnika_e
'test czy PEC dobrze wyliczony
Ar(2) = &HB4
Ar(3) = &H22
Ar(4) = &H07
Ar(5) = &HC8
Crc = Crc8smb(ar(2))
Crc = Crc8smb(ar(3))
Crc = Crc8smb(ar(4))
Crc = Crc8smb(ar(5))
cls
Lcd "PEC " ; Crc 'wychodzi 72 czyli ok
Lowerline
Lcd "PEC nota 72 "
Wait 5
Cls
'Obliczanie pec do zmiany wsp em
Ar(2) = &HB4
Ar(3) = &H24
Ar(4) = &H01
Ar(5) = &H00
Crc = Crc8smb(ar(2))
Crc = Crc8smb(ar(3))
Crc = Crc8smb(ar(4))
Crc = Crc8smb(ar(5))
cls
Lcd "PEC " ; Crc
Lowerline
Lcd "wsp e "
Wait 5
Cls
'zapis wsp emisyjnosci
Lowbyt = &H01
Highbyt = &H00
I2cstart
I2cwbyte &B10110100
I2cwbyte &H24
I2cwbyte Lowbyt
I2cwbyte Highbyt
I2cwbyte Crc
I2cstop
Loop
End
[code]