Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » опрос датчика по I2c


опрос датчика по I2c

Сообщений 1 страница 18 из 18

1

приветствую! сейчас разбираюсь с датчиком SHT21, поддерживает связь I2C,  никак не получается нормально прочитать данные.
работа с датчиком выглядит следующим образом:
http://we.easyelectronics.ru/uploads/images/00/00/03/2011/06/28/282711.png

сначала идет адрес микросхемы (&H80) и команда измерения (&HF5), датчик начинает мерить,  время измерения (measuerment) чуть меньше 30мс.
затем подается старт и команда на прочтение данных (&H81)  и идут прием трех байт данных.

написал следующий код:

Код:
Sht21:

I2cstart
I2cwbyte &H80                                      'адрес микросхемы-датчика SHT21
I2cwbyte &HF5                                      'выбор измерения влажности в нормальном режиме

 Waitms 30                                         'измерение

I2cstart
I2cwbyte &H81                                      'чтение результата измерения

I2crbyte Data1 , Ack                              'прием старшего байта, ждем слудующий байт
I2crbyte Data2 , Ack                             'прием младшего байта
I2crbyte Crc , Nack                              'прием байта контрольной суммы (можно на него забить)
I2cstop                                               'конец общения

В переменные data1 и data2 постоянно попадает какой-то мусор. Что я делаю не так?

0

2

AN #116 - Reading the SHT11 Humidity sensor

'Routine to read the SHT11 Humidity sensor chip
'By Stuart Leslie
'Contact stu@4sightinc.com with any questions
'Uses BascomAVR
'a .01 uf capacitor across VCC and Ground on the SHT11 really cleans up the data
'a pullup is required on "data" pin as shown in the data sheet

Dim Ctr As Byte
Dim Dataword As Word
Dim Command As Byte
Dim Dis As String * 20

Dim Calc As Single
Dim Calc2 As Single
Dim Rhlinear As Single
Dim Rhlintemp As Single
Dim Tempc As Single
Dim Tempf As Single

Const C1 = -4
Const C2 = 0.0405
Const C3 = -0.0000028
Const T1c = .01
Const T2 = .00008
Const T1f = .018

Sck Alias Portb.0
Dataout Alias Portb.1
Datain Alias Pinb.1
Redled Alias Portb.2

Declare Sub Getit()

Ddrb = &B11111111  'all port b are output
Config Pinb.0 = Output 'sck
Config Pinb.1 = Output 'datain

'reset the serial communications first, it is easily confused!
Set Dataout
For Ctr = 1 To 12
Set Sck
Waitus 2
Reset Sck
Waitus 2
Next Ctr

Do 'continually read the tempfature and humidity

Command = &B00000011
Call Getit 'Get the temperature, puts result in "dataword" for us
'
Tempf = T1f * Dataword
Tempf = Tempf - 40

Tempc = T1c * Dataword 'get celcius for later calculations and for "the rest of the world"
Tempc = Tempc - 40

Dis = Fusing(tempf , "###.##")
Print "Temperature = " ; Dis ; " (F)"

Command = &B00000101
Call Getit 'get the humidity
Calc = C2 * Dataword
Calc2 = Dataword * Dataword 'that "2" in the datasheet sure looked like a footnote for a couple days, nope it means "squared"!
Calc2 = C3 * Calc2
Calc = Calc + C1
Rhlinear = Calc + Calc2

'Dis = Fusing(rhlinear , "##.##")
'Print "Humidity adjusted for linear = " ; Dis

Calc = T2 * Dataword
Calc = Calc + T1c
Calc2 = Tempc - 25
Calc = Calc2 * Calc
Rhlintemp = Calc + Rhlinear

Dis = Fusing(rhlintemp , "##.##")
Print "Humidity adjusted for temperature = " ; Dis
Print

Wait 1
Loop

Sub Getit()

Local Datavalue As Word
Local Databyte As Byte

'start with "transmission start"
Set Sck
Reset Dataout
Reset Sck
Set Sck
Set Dataout
Reset Sck

'now send the command
Shiftout Dataout , Sck , Command , 1

Ddrb = &B11111101 'datain is now input
Config Pinb.1 = Input 'datain
Set Sck 'click one more off
Reset Sck
Waitus 10 'no idea why, but it doesn't work without it!
Bitwait Pinb.1 , Reset 'wait for the chip to have data ready

Shiftin Datain , Sck , Databyte , 1 'get the MSB
Datavalue = Databyte

Ddrb = &B11111111
Config Pinb.1 = Output

Reset Dataout 'this is the tricky part- Lot's of hair pulling- have to tick the ack!
Set Sck
Reset Sck

Ddrb = &B11111101 'datain is now input
Config Pinb.1 = Input

Shiftin Datain , Sck , Databyte , 1 'get the LSB
Shift Datavalue , Left , 8
Datavalue = Datavalue Or Databyte
'don't tick the clock or ack since we don't need the CRC value, leave it hanging!
Dataword = Datavalue

Ddrb = &B11111111
Config Pinb.1 = Output

Reset Dataout
Set Sck
Reset Sck

Ddrb = &B11111101 'datain is now input
Config Pinb.1 = Input

Shiftin Datain , Sck , Databyte , 1 'not using the CRC value for now- can't figure it out! Anybody know how to impliment?
'Print "CRC value was - " ; Databyte

Ddrb = &B11111111
Config Pinb.1 = Output

Set Dataout
Set Sck
Reset Sck
End Sub

End

0

3

почему первая посылка не заканчивается условием STOP?
Вообще каждая команда должна содержать START и STOP. Должны быть запрещены прерывания, чтобы не выйти за 20 мкс на бит. Но это по классике. Ну и не забывать про подтягивающие резисторы на +5 В.

0

4

первая посылка судя по ДШ должна идти без стопа, так как работа с датчиком не закончена. Резисторы подтяжки стоят, задержка перед началом работы с датчиком при высоком scl большая. Давал задержку на измерение намного больше чем 30 мс, вплоть до 1 сек - не помогло.
схема тактируется от внешнего кварца на 16 МГц, попробую переправить на 1 МГц.

upd
уменьшил частоту, не помогло. перепаял датчик, не помогло.
хз вроде датчик очень бережно паял, не должен был убиться, но вариантов больше не осталось.
RIP

Отредактировано Viktor (2011-08-16 20:11:37)

0

5

Viktor
Очень интересно чем все у тебя решилось?
Тоже поимел такой девайс, пробую.

0

6

датчик к сожалению так и не ответил, так и не понял причину.

0

7

Код из первого поста мною проверен. Он рабочий.
Датчик для теста вполне можно подключать к 5В.

0

8

Civil
Здесь имеется в виду датчик SHT21. (3,6 вольта).
У меня уже 2_ой датчик показывает  ересь.
Люди, кто даст 100% код. Танец с бубнами уже прошел!
Вообще как его проверить, что он гуд. На осциле с датчика нет ни чего :-(
1, Первые 2 строки, ASK обязателен?
2, Сложение L и H, сдвиг влево на8 или умножение на 256? (shif data1, 8  = data1*256)

Отредактировано Aleks (2011-09-25 18:30:21)

0

9

Aleks
Вот он, SHT21, передо мной.
По даташиту рабочее 3.6, но выдерживает 5В.
При этом немного греется и начинает врать примерно на 0.3 градуса.
Но тестировать его так можно.

Код выше верен.
Dataw = Data1
Shift Dataw , Left , 8 
Dataw = Dataw + Data2

Отредактировано Civil (2011-09-25 20:20:09)

0

10

Civil

Пытал, и так.
Не только у меня, знаю еще пару случаев НЕ работы датчика.
На LCD показывает -5,.... % , нет данных (0000)

Тест на плате MPC-40 Robozon"овской

Отредактировано Aleks (2011-09-25 20:33:35)

0

11

А чему равны получаемые байты? Если все 255,  значит датчик просто не ответил.
Вообще, я тоже с ним намучался, даже ходил на польские и немецкие сайты в поисках решения.
Но все оказалось просто - плохая пайка.
Учитывая вашу ориентацию на макетку может быть надо больше внимания уделить этому вопросу.

0

12

Civil
Все байты 0000
Гуглил тоже, "теория контактов" пройдена.
Если б я один..., подозрения на сам чип.
Бьюсь уже какую неделю.... :-(

Код:
'***************************Тип_микроконтроллера********************************
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 19200

$hwstack = 32
$swstack = 32
$framesize = 32
$sim

'***********конфигурация портов*******************
Config Lcd = 16 * 2                                         ' экран 16*2 (любой с контроллером HD44780)
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.3
Config Scl = Portc.0                                        'Configure i2c SCL
Config Sda = Portc.1                                        'Configure i2c SDA


Dim Data1 As Word
Dim Data2 As Word
Dim Crc As Byte
Dim Ph0 As Single

'адрес микросхемы-датчика SHT21  H80 запись, H81 чтение
'Команд для управления SHT21 всего 7:

'0xE3 - Измерить температуру. При этом на время измерения линия SCL будет прижата к земле.
'0xE5 - Измерить влажность. Линия SCL так-же прижимается к земле на время измерения.
'0xF3 - Измерить температуру. На этот раз датчик не прижимает линию SCL на время замера.
'0xF5 - Измерить влажность. Линия SCL не прижимается.
'0xE6 - Записать данные в пользовательский регистр.
'0xE7 - Прочитать данные из пользовательского регистра.
'0xFE - Перезагрузить датчик.


Sht21p:

I2cstart
I2cwbyte &H80, Ack                                               'адрес микросхемы-датчика SHT21
I2cwbyte &HF5, Ack                                               'выбор измерения влажности в нормальном режиме

I2cstart
I2cwbyte &H81, Ack                                               'чтение результата измерения

Waitms 80  

I2crbyte Data1 , Ack                                        'прием старшего байта, ждем слудующий байт
I2crbyte Data2 , Ack                                        'прием младшего байта
I2crbyte Crc , Nack                                         'прием байта контрольной суммы 
I2cstop                                                     'конец общения

Sht21t:

I2cstart
I2cwbyte &H80 , Ack                                               'адрес микросхемы-датчика SHT21
I2cwbyte &HF3 , Ack                                               'выбор измерения температуры в нормальном режиме


Pht:
Shift Data1 , Left ,8
Ph0 = Data1 + Data2
Ph0 = Data1 / 65536
Ph0 = Ph0 * 125
Ph0 = Ph0 - 6


Lcd "Ph% " ; Ph0

I2cstart
I2cwbyte &H81 , Ack                                                   'чтение результата измерения

 Waitms 40   

I2crbyte Data1 , Ack                                        'прием старшего байта, ждем слудующий байт
I2crbyte Data2 , Ack                                        'прием младшего байта
I2crbyte Crc , Nack                                         'прием байта контрольной суммы 
I2cstop                                                     'конец общения


Php:

Shift Data1 , Left , 8
Ph0 = Data1 + Data2
Ph0 = Data1 / 65536
Ph0 = Ph0 * 175.72
Ph0 = Ph0 - 46.85

 Waitms 800   
  
Lcd "Ph_T" ; Ph0

Отредактировано Aleks (2011-09-26 18:22:38)

0

13

Civil отлично!

0

14

Aleks
а что это за код? Он же в таком виде даже компилироваться не будет, не говоря о более мелких вещах.

Попробуйте мой.  Он выводит темп. и влажность в USART. 

Код:
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 19200
$lib "mcsbyte.lbx"
'------------------------------Порты--------------------------------------------
Config Portb = Output
Config Portd.4 = Output , Portd.5 = Output , Portd.6 = Output , Portd.7 = Output
A Alias Portd.6 : B Alias Portd.5 : C Alias Portb.3 : D Alias Portb.2 : E Alias Portb.1 : F Alias Portb.0 : G Alias Portd.7 : Dp Alias Portb.4       'Тут вписываем порты к которым подключены сегменты индикатора
Dig1 Alias Portb.6 : Dig2 Alias Portd.4 : Dig3 Alias Portb.5 : Dig4 Alias Portb.7       ' тут вписываем порты к которым подключены общие провода каждой цифры
' цифры отсчитываются слева направо
Dim X As Byte , Cifri(4) As Integer , Perenoschikobsh_provodov As Byte , Perenoschiksegmentov As Byte       'задаем всякие переменные и масивы
Config Timer0 = Timer , Prescale = 64 : On Timer0 Pulse : Enable Timer0 : Enable Interrupts       ' конфигурируем таймер 0 чтоб потом на него повесить алгоритм отображения цифр
Dim Ledm As Byte
Dim Data1 As Byte , Data2 As Byte , Crc As Byte , Dataw As Word , T As Single , H As Single
Config Watchdog = 2048
X = 0

'------------I2C---------------------
Config Sda = Portc.4
Config Scl = Portc.5
Print
 Print "_____________________________________"
Do
I2cstart
I2cwbyte &H80                                               'адрес микросхемы-датчика SHT21
I2cwbyte &HE3                                               'выбор измерения T в нормальном режиме
Waitms 100                                                  'измерение
I2cstart
I2cwbyte &H81                                               'чтение результата измерения
I2crbyte Data1 , Ack                                        'прием старшего байта, ждем слудующий байт
I2crbyte Data2 , Ack                                        'прием младшего байта
I2crbyte Crc , Nack                                         'прием байта контрольной суммы (можно на него забить)
I2cstop                                                     'конец общения

Dataw = Data1
Shift Dataw , Left , 8
Dataw = Dataw + Data2
T = Dataw * 175.72
T = T / 65536
T = T - 46.85

I2cstart
I2cwbyte &H80                                               'адрес микросхемы-датчика SHT21
I2cwbyte &HE5                                               'выбор измерения влажности в нормальном режиме
Waitms 100                                                  'измерение
I2cstart
I2cwbyte &H81                                               'чтение результата измерения
I2crbyte Data1 , Ack                                        'прием старшего байта, ждем слудующий байт
I2crbyte Data2 , Ack                                        'прием младшего байта
I2crbyte Crc , Nack                                         'прием байта контрольной суммы (можно на него забить)
I2cstop                                                     'конец общения

Dataw = Data1
Shift Dataw , Left , 8
Dataw = Dataw + Data2
H = Dataw * 125
H = H / 65536
H = H - 6

'Print "> T " ; T ; " H " ; H
Print "  T " ; Fusing(t , "#.##") ; "   H " ; Fusing(h , "#.#")


Loop

Pulse:                                                      ' подпрограмма прерываний таймера0
Reset Watchdog
Perenoschikobsh_provodov = &H00
Gosub Perenos
Incr X : If X > 3 Then X = 0
Perenoschiksegmentov = Lookup(cifri(x + 1) , Dta)
Perenoschiksegmentov.7 = Ledm.x
Set Perenoschikobsh_provodov.x
Gosub Perenos
Perenoschiksegmentov = 0
Return

Perenos:
Dig1 = Perenoschikobsh_provodov.0
Dig2 = Perenoschikobsh_provodov.1
Dig3 = Perenoschikobsh_provodov.2
Dig4 = Perenoschikobsh_provodov.3
A = Perenoschiksegmentov.0
B = Perenoschiksegmentov.1
C = Perenoschiksegmentov.2
D = Perenoschiksegmentov.3
E = Perenoschiksegmentov.4
F = Perenoschiksegmentov.5
G = Perenoschiksegmentov.6
Dp = Perenoschiksegmentov.7
'Dp = Ledm.x
Return

       Dta:                                                 '  таблица с данными о цифрах зажигает по порядку : 0123456789

       Data &B01000000 , &B01111001 , &B10100100 , &B00110000 , &B00011001 , &B00010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000 ,

       '  H   E   L  " "  -
       '  o   Г   F   o   c
       '  n   d   U   P
       ' 10  11  12  13  14
       ' 15  16  17  18  19
       ' 20  21  22  23
       Data &B10001001 , &B10000110 , &B11000111 , &B11111111 , &B10111111 ,
       Data &B10100011 , &B11001110 , &B10001110 , &B10011100 , &B10100111 ,
       Data &B10101011 , &B10100001 , &B01000001 , &B10001100

0

15

Civil
Спасибо, найдены все ошибки.
Это часть кода была, компилировалось все гуд, в счете данных ошибка умножаем, а потом делим.
2ая переходник с 5вольт на 3,3 не работал! самое главное.
Плюшка действительно работает от 5 вольт, и не сгорает!!!!! хотя немного странно себе ведет при старте врет.
Вот вопрос, а сколько она так протянет? или все таки поставить хотя бы делитель.

0

16

Aleks
Поздравляю!
Вот эта строка проходит компиляцию?
I2cwbyte &H80, Ack
А что за версия Баскома?

Нужно поставить хоть делитель и уровни сигнала ограничить (если проц. от 5 В питается). В противном случае датчик врет и очень прилично. Увы.

+1

17

Civil
Проходило ВСЕ, даже то чего не может быть!!!
Снес к хр.. демо версию.... поставил добрую надежную ...9,8
Все гуд. преобразователь на 702  не ииидет, там обычный диод  а  не шотки. ( все с материнок)
Простой делитель что ли пробануть,.. не решусь.
На 5 врет примерно на 0,3-0,6 градусов, а влажность сравнивать нечем.

0

18

verbnn
Добрый день verbnn. Вы разобрались с датчиком SHT11? если да то позвольте спросить о корректности показаний. Смоделировать у меня в протеусе  получилось но не нравиться показания. Я не понял формат данных Т и влажности что бы сделать пересчет или это в протеусе такой глюк.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » опрос датчика по I2c