Всем привет!
такой вот вопрос: пробовал ли кто делать ДВА програмных I2C на одном МК?
есть плата, уже установлено устройство I2C. Через два года решили добавить датчик. Есть внешний разъём, можно попробовать на него.
Но Баском не позволяет делать шину на разных выводах.
В теории можно поковыряться в библиотеках, но не хотелось бы такой метод иметь...
ДВА програмных I2C
Сообщений 1 страница 21 из 21
Поделиться12017-08-31 16:13:43
Поделиться32017-08-31 16:57:46
такой вот вопрос: пробовал ли кто делать ДВА програмных I2C на одном МК?
Надо наверное всё поудалять к чертям, всё едино никто не заглядывает.
Поделиться42017-08-31 17:43:24
о! благодарю
Александр
Поиск по "I2C"выдал много ссылок, пролистал 5 страниц и задал вопрос...
Поделиться52017-08-31 17:46:44
а почему у меня в Хелпе нет этого же материала? давно компилятор не обновлял?...
Поделиться62017-08-31 18:51:11
Появилось в версии 2.0.7.8.
Поделиться72017-08-31 18:55:00
теперь понятно, почему я не знал...
А еще там поменялась команда $timeout, а я два дня мучился...
Поделиться82017-09-01 14:07:40
И что с ней теперь не так стало? О_о
Поделиться92017-09-01 14:17:29
в старых версиях (до которой точно уже не знаю) команда работала перед соответствующей командой приёма данных
т.е., сперва пишешь
$timeout=2000
Inputbin A
и команда $timeout работала именно на следующую приёма.
Сейчас же эта команда действует на всю программу и её можно поставить в самое начало
Иногда первый вариант удобен, так как работал выборочно, иногда - второй
например, у меня 1 аппаратный uart и 1 - программный.
Каждому по своему $timeout перед использованием
Сейчас же где бы не не поставил $timeout - сразу на все uart
Я три дня бился, не мог понять...
Поделиться102017-09-01 15:36:28
Вот ты заморочился, я всегда (со всех времён) эту опцию использовал на весь код. А динамику выполнения можно было регулировать в конкретном месте, если алгоритм линеен.
Теперь чтобы получить подобный эффект, придется что-то наворачивать вручную.
Поделиться112017-09-01 15:42:34
всё зависит от задачи
аппаратный uart - 19200
1й программный - 2400
2й программный - 4800
а параметры теперь влияют на весь код
условно (!) за 2000 шагов по 19200 проскочит 4 байта, по 4800 - 1, а по 2400 - ни одного. Вот и думай.
Поделиться122017-09-04 12:17:05
короче: я не смог запустить два 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)
Поделиться142017-09-04 15:37:01
У тебя лицензия? Если "да", то выложи проблему на офф форум.
зы: мне это делать не хочется, чтобы потом не играть в "испорченный телефон".
Поделиться152017-09-04 15:38:13
есть
не могу, почему-то снова требует активацию, хотя некоторое время назад я это сделал.
Написал в техподдержку минут 10 назад, жду активации аккаунта...
Поделиться162017-09-04 16:34:30
Там на форуме была тема, Марк решил все лицензии привести к пользователям. В тему или личку просил скидывать им кто есть кто, чтобы он потом добавил "правый" народ в форум, а остальных видимо отсеять.
Поделиться172017-09-04 16:43:58
я добавлялся, прекрасно это помню
Поделиться182017-09-04 16:59:16
Может попробовать повторить процедуру?
Поделиться192017-09-04 17:02:20
сделал еще утром
после нажатия на ту кнопку вижу: "Ваше имя на форуме такое-то. Свяжитесь с суппортом @"
написал, робот отвечает что принято
Жду уже несколько часов.
Поделиться202017-09-06 12:41:24
проблема 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
Поделиться212017-09-06 15:12:55
В хелпе что-то об этом информации минимум. 
