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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ДВА програмных I2C


ДВА програмных I2C

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

1

Всем привет!
такой вот вопрос: пробовал ли кто делать ДВА програмных I2C на одном МК?
есть плата, уже установлено устройство I2C. Через два года решили добавить датчик. Есть внешний разъём, можно попробовать на него.
Но Баском не позволяет делать шину на разных выводах.
В теории можно поковыряться в библиотеках, но не хотелось бы такой метод иметь...

0

2

https://avrhelp.mcselec.com/config_i2cbus.htm

+1

3

Александр Д. написал(а):

такой вот вопрос: пробовал ли кто делать ДВА програмных I2C на одном МК?


Надо наверное всё поудалять к чертям, всё едино никто не заглядывает.

0

4

о! благодарю

Александр
Поиск по "I2C"выдал много ссылок, пролистал 5 страниц и задал вопрос...

0

5

а почему у меня в Хелпе нет этого же материала? давно компилятор не обновлял?...

0

6

Появилось в версии 2.0.7.8.

0

7

теперь понятно, почему я не знал...
А еще там поменялась команда $timeout, а я два дня мучился...

0

8

И что с ней теперь не так стало? О_о

0

9

в старых версиях (до которой точно уже не знаю) команда работала перед соответствующей командой приёма данных
т.е., сперва пишешь
$timeout=2000
Inputbin A

и команда $timeout работала именно на следующую приёма.
Сейчас же эта команда действует на всю программу и её можно поставить в самое начало

Иногда первый вариант удобен, так как работал выборочно, иногда - второй

например, у меня 1 аппаратный uart и 1 - программный.
Каждому по своему $timeout перед использованием

Сейчас же где бы не не поставил $timeout - сразу на все uart
Я три дня бился, не мог понять...

0

10

Вот ты заморочился, я всегда (со всех времён) эту опцию использовал на весь код. А динамику выполнения можно было регулировать в конкретном месте, если алгоритм линеен.
Теперь чтобы получить подобный эффект, придется что-то наворачивать вручную.

0

11

всё зависит от задачи
аппаратный uart - 19200
1й программный - 2400
2й программный - 4800

а параметры теперь влияют на весь код
условно (!) за 2000 шагов по 19200 проскочит 4 байта, по 4800 - 1, а по 2400 - ни одного. Вот и думай.

0

12

короче: я не смог запустить два I2C на 1 МК
код смотрел и у Александра, и на официальном сайте...
Убил свой компилятор, поставил новый (еще больше глюков с отображением кода: много серого и курсива)
Не работает
убиваю multibus, пишу как обычно - датчик отвечает

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

так работает:

Код:
$regfile = "m8adef.dat"
$crystal = 4000000
$hwstack = 64
$swstack = 64
$framesize = 64
'$baud = 9600

Led Alias Portb.0
Config Led = Output      'Enable pin for LED
Led = 1                  ' Off

Open "comd.7:9600,8,n,1" For Output As #1


'------------------- Config and init I2C bus -----------------------------------
Scl_m Alias Portd.2 : Sda_m Alias Portd.3
Config Sda = Sda_m
Config Scl = Scl_m
Config I2cdelay = 100
I2cinit



'--------------HTU21D----------------
Dim Temp As Single , Hum As Single

'---------- Constant's --------------
Const A = 8.1332
Const B = 1762.39
Const C = 235.66



'------------------------- SUB Routine's ---------------------------------------
Declare Function Htu21d_temp() As Single
Declare Function Htu21d_hum() As Single
Declare Function Calc_dew() As Single
Declare Sub Init_htu21d


Print #1 , " Start!"
Print #1 , "Version: " ; Version(1)

Call Init_htu21d


Start_prg:

   Temp = Htu21d_temp()
   Print #1 , "T=" ; Fusing(temp , "#.#") ;

   Hum = Htu21d_hum()
   Print #1 , ", H=" ; Fusing(hum , "#.#")

   For Temp = 0 To 49    ' Ïàóçà 5 ñåêóíä
      Toggle Led
      Waitms 100
   Next



   Goto Start_prg




'*******************************************************************************

Function Htu21d_temp() As Single
   Local Msb As Byte
   Local Lsb As Byte
   Local Crc As Byte
   Local Temp As Single

   I2cstart
   I2cwbyte &H80
   I2cwbyte &HE3         'temp hold
   I2cstart
   I2cwbyte &H81
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   I2crbyte Crc , Nack
   I2cstop

   Temp = Msb
   Shift Temp , Left , 8
   Temp = Temp + Lsb
   Shift Temp , Right , 2       'trunc LSB status bits
   Shift Temp , Left , 2

   Temp = Temp / 65536
   Temp = Temp * 175.72
   Temp = -46.85 + Temp

   Htu21d_temp = Temp
End Function

'-------------------------------------------------------------------------------
Function Htu21d_hum() As Single
   Local Msb As Byte
   Local Lsb As Byte
   Local Crc As Byte
   Local Hum As Single

   I2cstart
   I2cwbyte &H80
   I2cwbyte &HE5         'hum hold
   I2cstart
   I2cwbyte &H81
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   I2crbyte Crc , Nack
   I2cstop

   Hum = Msb
   Shift Hum , Left , 8
   Hum = Hum + Lsb
   Shift Hum , Right , 2 'Trunc lsb status bits
   Shift Hum , Left , 2

   Hum = Hum / 65536
   Hum = Hum * 125
   Hum = -6 + Hum

   Htu21d_hum = Hum
End Function

'-------------------------------------------------------------------------------
Sub Init_htu21d
 'HTU21D Sensor Start up (set in idle mode)
'   Set Scl_m             'SCL
'   Waitms 25
'   Reset Scl_m           'SCL

'Soft Reset
   I2cstart
   I2cwbyte &H80
   I2cwbyte &HFE
   I2cstop
End Sub

в терминале вижу: T=27.0, H=61.9

а так- не работает
библиотеку подключал и отключал, родную и из архива Александра...
делал 1 и 2 шины i2c ...

Код:
$regfile = "m8adef.dat"
$crystal = 4000000
$hwstack = 64
$swstack = 64
$framesize = 64
'$baud = 9600


'------------------- Config and init I2C bus -----------------------------------
$lib "i2c-multibus.lib"
Scl_m Alias Portd.2
Sda_m Alias Portd.3
Config I2cbus = 0 , Scl = Portd.2 , Sda = Portd.3
I2cbus = 0
Config I2cdelay = 100
I2cinit
Waitms 50

'Config I2cbus = 1 , Scl = Portd.0 , Sda = Portd.1
'I2cbus = 1
'Config I2cdelay = 100
'I2cinit
'Waitms 50



'--------------HTU21D----------------
Dim Temp As Single , Hum As Single

'---------- Constant's --------------
Const A = 8.1332
Const B = 1762.39
Const C = 235.66



'------------------------- SUB Routine's ---------------------------------------
Declare Function Htu21d_temp() As Single
Declare Function Htu21d_hum() As Single
Declare Function Calc_dew() As Single
Declare Sub Init_htu21d

Led Alias Portb.0
Config Led = Output      'Enable pin for LED
Led = 1                  ' Off

Open "comd.7:9600,8,n,1" For Output As #1


Print #1 , " Start!"
Print #1 , "Version: " ; Version(1)

I2cbus = 0
Call Init_htu21d


Start_prg:
   Temp = Htu21d_temp()
   Print #1 , "T=" ; Fusing(temp , "#.#") ;

   Hum = Htu21d_hum()
   Print #1 , ", H=" ; Fusing(hum , "#.#")


   For Temp = 0 To 49    ' Ïàóçà 5 ñåêóíä
      Toggle Led
      Waitms 100
   Next


   Goto Start_prg




'*******************************************************************************

Function Htu21d_temp() As Single
   Local Msb As Byte
   Local Lsb As Byte
   Local Crc As Byte
   Local Temp As Single

   I2cstart
   I2cwbyte &H80
   I2cwbyte &HE3         'temp hold
   I2cstart
   I2cwbyte &H81
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   I2crbyte Crc , Nack
   I2cstop

   Temp = Msb
   Shift Temp , Left , 8
   Temp = Temp + Lsb
   Shift Temp , Right , 2       'trunc LSB status bits
   Shift Temp , Left , 2

   Temp = Temp / 65536
   Temp = Temp * 175.72
   Temp = -46.85 + Temp

   Htu21d_temp = Temp
End Function

'-------------------------------------------------------------------------------
Function Htu21d_hum() As Single
   Local Msb As Byte
   Local Lsb As Byte
   Local Crc As Byte
   Local Hum As Single

   I2cstart
   I2cwbyte &H80
   I2cwbyte &HE5         'hum hold
   I2cstart
   I2cwbyte &H81
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   I2crbyte Crc , Nack
   I2cstop

   Hum = Msb
   Shift Hum , Left , 8
   Hum = Hum + Lsb
   Shift Hum , Right , 2 'Trunc lsb status bits
   Shift Hum , Left , 2

   Hum = Hum / 65536
   Hum = Hum * 125
   Hum = -6 + Hum

   Htu21d_hum = Hum
End Function

'-------------------------------------------------------------------------------
Sub Init_htu21d
 'HTU21D Sensor Start up (set in idle mode)
'   Set Scl_m             'SCL
'   Waitms 20
'   Reset Scl_m           'SCL

'Soft Reset
   I2cstart
   I2cwbyte &H80
   I2cwbyte &HFE
   I2cstop
End Sub

Выдаёт мусор: T=128.9, H=119.0

Отредактировано Александр Д. (2017-09-04 12:18:38)

0

13

что показывает логгер:

http://sg.uploads.ru/t/UTE0J.jpg

вверху рабочий вариант, без multibus, внизу - multibus

0

14

У тебя лицензия? Если "да", то выложи проблему на офф форум.

зы: мне это делать не хочется, чтобы потом не играть в "испорченный телефон".

0

15

есть
не могу, почему-то снова требует активацию, хотя некоторое время назад я это сделал.
Написал в техподдержку минут 10 назад, жду активации аккаунта...

0

16

Там на форуме была тема, Марк решил все лицензии привести к пользователям. В тему или личку просил скидывать им кто есть кто, чтобы он потом добавил "правый" народ в форум, а остальных видимо отсеять.

0

17

я добавлялся, прекрасно это помню

0

18

Может попробовать повторить процедуру?

0

19

сделал еще утром
после нажатия на ту кнопку вижу: "Ваше имя на форуме такое-то. Свяжитесь с суппортом @"
написал, робот отвечает что принято
Жду уже несколько часов.

0

20

проблема I2C решена
да, изменился предкомпилятор: теперь некоторые команды трактуются иначе. Я так понимаю, более строго.
Плохо то, что в разных случая по-разному

шина I2C имеет два режиме Старт: обычный и "повторный". Чаще всего Ставили просто Старт и предкомпилятор понимает что тут надо ставить "повторный". А иногда - не понимает.

примеры:

тут пишем Старт, и всё работает.

Код:
I2cstart
   I2cwbyte &H80         ' 128
   I2cwbyte &HE3         'temp hold   227

   I2cstart
   I2cwbyte &H81         ' 129
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   I2crbyte Crc , Nack
   I2cstop

но стоит выбрать режим Мультибас - не работает, и надо писать правильную команду "повторного старта":

Код:
 I2cstart
   I2cwbyte &H80         ' 128
   I2cwbyte &HE3         'temp hold   227

   I2crepstart
   I2cwbyte &H81         ' 129
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   I2crbyte Crc , Nack
   I2cstop

+1

21

В хелпе что-то об этом информации минимум. :(

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ДВА програмных I2C