Scanner I2C ->Od tego zacznij przy BME280

Proste przykłady do częstych pytań.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Scanner I2C ->Od tego zacznij przy BME280

Post autor: niveasoft » 17 wrz 2017, 16:22

Zdaję sobie sprawę, że ten temat znają osoby które dłużej programują. Dział jednak ma na celu podpowiedź jak sobie skrócić niektóre "odkrycia".

Inspiracją do napisania tego posta jest to, że powstały DEMO kody do obsługi tych czujników. Jednak, jak w wielu układów I2C, możliwa jest zmiana adresu układu poprzez podłączenie jakiejś wybranej nóżki układu do masy bądź "plusa".
Kiedy adres się różni to żaden przykładowy kod nie zadziała.

Poniżej adres układu BME280 w odsłonie Adafruit.

Dlatego warto sprawdzić pod jakim adresem zgłasza się układ który chcemy uruchomić.

Poniżej zamieszczę kod "skanera adresów na szynie I2C", ale proszę mieć na uwadze, ze ten jest na TWI czyli sprzętowe I2C które w różnych procesorach jest na innych nóżkach.
Dla Mega16, Mega32, Mega644 itd, itp 40 nóżkowych to są piny PC0 i PC1 (SCL i SCK) a w 28 nóżkowych to już PC4 i PC5.

  1. $regfile = "m32def.dat"
  2. $crystal = 11059200
  3.  
  4. $hwstack = 32
  5. $swstack = 32
  6. $framesize = 128
  7. $baud = 19200
  8.  
  9. Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7       'UPT M16
  10. Config Lcd = 20x4
  11.  
  12. Cursor Off , Noblink
  13. Cls
  14.  
  15. Waitms 500
  16.  
  17. Config Portc.6 = Input : Set Portc.6 : Switch Alias Pinc.6
  18.  
  19.  
  20. $lib "i2c_twi.lbx"                                          ' we do not use software emulated I2C but the TWI
  21.  
  22. Config Scl = Portc.0                                        ' we need to provide the SCL pin name
  23. Config Sda = Portc.1                                        ' we need to provide the SDA pin name
  24.  
  25. I2cinit                                                     ' we need to set the pins in the proper state
  26.  
  27. Config Twi = 100000                                         ' wanted clock frequency
  28.  
  29.  
  30.  
  31. Dim B As Byte , Lock As Byte
  32.  
  33. Locate 1 , 1 : Lcd "Scanning.."
  34. Print "Scanning"
  35. For B = 0 To 254 Step 2                                     'for all odd addresses
  36.   I2cstart                                                  'send start
  37.   I2cwbyte B                                                'send address
  38.   If Err = 0 Then                                           'we got an ack
  39.  
  40.      Locate 2 , 1 : Lcd "Slv.at: &H" ; Hex(b) ; " (" ; B ; ")"
  41.      Print "Slv.at: &H" ; Hex(b) ; " (" ; B ; ")"
  42.  
  43.      Locate 3 , 1 : Lcd " Push switch..."
  44.      Lock = 1
  45.       Do
  46.        Debounce Switch , 0 , Sw_sub , Sub
  47.       Loop Until Lock = 0
  48.  
  49.   End If
  50.   I2cstop                                                   'free bus
  51. Next
  52.  
  53. Thirdline : Lcd Spc(20)
  54. Fourthline : Lcd "Koniec"
  55.  
  56. End
  57.  
  58. Sw_sub:
  59.  Lock = 0
  60.   Thirdline : Lcd Spc(20)
  61. Return
  62.  
  63. 'Found:
  64. 'DAC at &HC0 (192)
  65. 'ALS at &H06 (006)
  66. '    at &HAC (172)
  67. 'EEP at &HAE (174)
  68. 'RTC at &HD0 (208)
  69. 'BME at &HEC (236)
  70. 'BMP at &HEE (238)
Efekty działania widać na fotce ;)
Dla tych którzy zauważyli, tak mieszkam trochę wyżej nad poziomem morza :D Dzisiaj 953,25hPa
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
ODPOWIEDZ