Skocz do zawartości

[Bascom] mlx91614+atmega8+bascom+brak zapisu


m-rarcin

Pomocna odpowiedź

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 :

$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
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.