Pytania, kody i porady dotyczące nie tylko Bascom.
-
Michał6201
- Posty: 127
- Rejestracja: 03 paź 2015, 20:07
Post
autor: Michał6201 » 03 maja 2020, 12:20
Cześć
Chciałem sprawdzić jak działa czujnik SHT21 i jest problem, bo pokazuje cały czas temperaturę 0,0oC i wilgotność 0,0%
Nie wiem czy jest błąd jakiś w programie, a czy czujnik uszkodzony.
Bardzo proszę o weryfikację tego kodu:
' OBSŁUGA CZUJNIKA SHT21
$regfile = "m8adef.dat"
$crystal = 8000000
'$baud = 19200
' Konfiguracja LCD 2X16
Config Lcdpin = Pin , E = PortD.0 , Rs = PortD.1 , Db7 = PortD.2 , Db6 = PortD.3 , Db5 = PortD.4 , Db4 = PortD.5
Config Lcd = 16x2
Cursor Off
Cls
Config Scl = Portc.5
Config Sda = Portc.4
Config I2cdelay = 10 '100KHz clock
I2cinit
Dim Data1 As Byte
Dim Data2 As Byte
Dim Datat As Word
Dim Datah As Word
Dim Crc As Word
Dim T As Single
Dim H As Single
Do
'***********************************Temperatura*********************************
I2cstart
I2cwbyte &H80 'Adres SHT21
I2cwbyte &HE3 'Wybór pomiaru temperatury w trybie normalnym
Waitms 100 'Odczekaj 100ms
I2cstart
I2cwbyte &H81 'Odczytaj wynik pomiaru
I2crbyte Data1 , Ack 'Odbierz dane
I2crbyte Data2 , Ack 'Odbierz dane
I2crbyte Crc , Nack 'Odbierz sume kontrolną
I2cstop 'Zatrzymaj magistralę
'Przeliczanie wartości T
Datat = Data1
Shift Datat , Left , 8
Datat = Datat + Data2
T = Datat * 175.72
T = T / 65536
T = T - 46.85
'************************************Wilgotoność********************************
I2cstart
I2cwbyte &H80 'Adres SHT21
I2cwbyte &HE5 'Wybór pomiaru wilgotności w trybie normalnym
Waitms 100 'Odczekaj 100ms
I2cstart
I2cwbyte &H81 'Odczytaj wynik pomiaru
I2crbyte Data1 , Ack 'Odbierz dane
I2crbyte Data2 , Ack 'Odbierz dane
I2crbyte Crc , Nack 'Odbierz sume kontrolną
I2cstop 'Zatrzymaj magistralę
'Przeliczanie wartości H
Datah = Data1
Shift Datah , Left , 8
Datah = Datah + Data2
H = Datah * 125
H = H / 65536
H = H - 6
T = Fusing(t , "#.##")
H = Fusing(h , "#.#")
Locate 1 , 1
Lcd "Temp:" ; t ; " oC "
Locate 2 , 1
Lcd "Humi:" ; h ; "%"
Loop
END 'Koniec pętli Do...Loop
-
Oldman
- Posty: 61
- Rejestracja: 19 cze 2019, 11:15
Post
autor: Oldman » 03 maja 2020, 14:22
W oryginalnym kodzie (_Duch) w pętli na końcu jest jeszcze Wait 1. Spróbuj dopisać.
-
niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
-
Kontakt:
Post
autor: niveasoft » 03 maja 2020, 14:55
Mi to zwyczajnie szkoda czasu na gdybanie i od razu podłączyłbym jakiś terminal. Bascom ma wbudowaną obsługę błędu ostatniej instrukcji. Można sprawdzić czy układ w ogóle odpowiada. Można zobaczyć jakie dane odbiera i wszystko trwa kilka minut....
Można to samo wyrzucić na LCD...a jak układ nie odpowiada to można przeskanować wszystkie adresy...znowu kilka minut i gotowe.
I2cstart
I2cwbyte &H80 'Adres SHT21
If Err = 0 Then
I2cwbyte &HE3 'Wybór pomiaru temperatury w trybie normalnym
Waitms 100 'Odczekaj 100ms
I2cstart
I2cwbyte &H81 'Odczytaj wynik pomiaru
I2crbyte Data1 , Ack 'Odbierz dane
I2crbyte Data2 , Ack 'Odbierz dane
I2crbyte Crc , Nack 'Odbierz sume kontrolną
Print Data1
Print Data2
Print Crc
Else
Print "Brak ukladu"
End If
I2cstop 'Zatrzymaj magistralę
-
Michał6201
- Posty: 127
- Rejestracja: 03 paź 2015, 20:07
Post
autor: Michał6201 » 04 maja 2020, 23:58
Dziękuję za kod
Trochę zmieniłem, bo chciałem to wyświetlić na lcd
' TEST CZUJNIKA SHT21
$regfile = "m8adef.dat"
$crystal = 8000000
'$baud = 19200
' Konfiguracja LCD 2X16
Config Lcdpin = Pin , E = PortD.0 , Rs = PortD.1 , Db7 = PortD.2 , Db6 = PortD.3 , Db5 = PortD.4 , Db4 = PortD.5
Config Lcd = 16x2
Cursor Off
Cls
$lib "i2c_twi.lbx"
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit
Config Twi = 100000
Dim Data1 As Byte
Dim Data2 As Byte
Dim Datat As Word
Dim Datah As Word
Dim Crc As Word
Dim T As Single
Dim H As Single
Dim Wart As String * 4
Dim Warh As String * 4
Do
I2cstart
I2cwbyte &H80 'Adres SHT21
If Err = 0 Then
I2cwbyte &HE3 'Wybór pomiaru temperatury w trybie normalnym
Waitms 100 'Odczekaj 100ms
I2cstart
I2cwbyte &H81 'Odczytaj wynik pomiaru
I2crbyte Data1 , Ack 'Odbierz dane
I2crbyte Data2 , Ack 'Odbierz dane
I2crbyte Crc , Nack 'Odbierz sume kontrolną
' Print Data1
' Print Data2
' Print Crc
Else
'Print "Brak ukladu"
Locate 1 , 2
Lcd "Brak ukladu"
End If
I2cstop 'Zatrzymaj magistralę
Loop
end
Niestety po wrzuceniu kodu do procka, na lcd pojawia się napis - "Brak układu"
Czyli uszkodzony czujnik?
Napięcie dochodzi do niego. Zasilam go +3,3V, i2c jest przekonwertowane tranzystorami BSS138 do +5V,b o takim napięciem zasilam procka.
Na nóżce SCL czujnika mam 0,55V, a na SDA 3,3V.
-
niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
-
Kontakt:
Post
autor: niveasoft » 05 maja 2020, 9:38
Rozumiem, że masz rezystory podciagające?
Osobiście przeleciałbym wszystkie adresy bo czasami niektóre układy mają inne adresy w zalezności np. od konfiguracji pinów. Ten układ po prostu może być pod innym adresem.
Poniżej taki skaner. On się zatrzyma jak coś znajdzie i wtedy chyba wciskałem przycisk by znaleźc kolejny układ więc tam trochę musisz pozmieniać.
Sub Scan_i2c()
Dim B As Byte , Lock As Byte
Portc.0 = 1
Locate 1 , 1 : Lcd "Scanning.."
Print "Scanning"
For B = 0 To 254 Step 2 'for all odd addresses
I2cstart 'send start
I2cwbyte B 'send address
If Err = 0 Then 'we got an ack
Locate 2 , 1 : Lcd "Slv.at: &H" ; Hex(b) ; " (" ; B ; ")"
Print "Slv.at: &H" ; Hex(b) ; " (" ; B ; ")"
'Locate 3 , 1 : Lcd " Push switch..."
Lock = 1
Do
If Pinc.0 = 0 Then
Wait 1
Lock = 0
End If
Loop Until Lock = 0
End If
I2cstop 'free bus
Next
Portc.0 = 0
'&H1A DEC26 GYRO
'&HD0 DEC208 RTC
'&HEC DEC236 BME
Cls
End Sub
Oryginalny skaner adresów I2c jest chyba w Helpie pod tytułem zblizonym do "Using the I2C protocol"
-
Michał6201
- Posty: 127
- Rejestracja: 03 paź 2015, 20:07
Post
autor: Michał6201 » 06 maja 2020, 0:07
Tak, rezystory są podciągnięte na liniach i2c.
Wrzuciłem taki kod do procka:
' SKANER I2C
$regfile = "m8adef.dat"
$crystal = 8000000
'$baud = 19200
' Konfiguracja LCD 2X16
Config Lcdpin = Pin , E = PortD.0 , Rs = PortD.1 , Db7 = PortD.2 , Db6 = PortD.3 , Db5 = PortD.4 , Db4 = PortD.5
Config Lcd = 16x2
Cursor Off
Cls
$lib "i2c_twi.lbx"
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit
Config Twi = 100000
' Sub Scan_i2c()
Dim B As Byte , Lock As Byte
Config Portc.0 = Input : Portc.0 = 1 : S1 Alias PinC.0
do
Locate 1 , 1 : Lcd "Scanning.."
'Print "Scanning"
For B = 0 To 254 Step 2 'for all odd addresses
I2cstart 'send start
I2cwbyte B 'send address
If Err = 0 Then 'we got an ack
Locate 2 , 1 : Lcd "Slv.at: &H" ; Hex(b) ; " (" ; B ; ")"
'Print "Slv.at: &H" ; Hex(b) ; " (" ; B ; ")"
'Locate 3 , 1 : Lcd " Push switch..."
Lock = 1
Do
If S1 = 0 Then
Wait 1
Lock = 0
End If
Loop Until Lock = 0
End If
I2cstop 'free bus
Next
S1 = 0
'&H1A DEC26 GYRO
'&HD0 DEC208 RTC
'&HEC DEC236 BME
Cls
Loop
end
' End Sub
Na wyświetlaczy jedynie widać napis Scaning..
Nic więcej się nie wyświetla, nawet po dłuższej chwili czekania.
Naciskanie przycisku S1 też nic nie zmienia.