Может PCF8574 кастрированая, работает только в одну сторону (китайский вариант)?
Помогите с запуском LCD 4x20 по i2c
Сообщений 31 страница 60 из 220
Поделиться322013-07-25 16:24:01
На микросхеме какая буква в конце, на картинке не видно
PCF8574Т
Судя по даташиту, это обычная м/сх., без буквы "А". Вот толковый даташит. В нем на 6-й странице есть адресация и обычной PCF8574, и PCF8574A.
Согласно документации на микросхему
&H4E = 0100 1110 = 1, 2, 3 выводы на +5В = чтение
&H4F= 0100 1111 = 1, 2, 3 выводы на +5В = запись
Как может, что-то выводиться, если это адрес чтения?
Судя по этому же даташиту Вы путаете. На табличке ниже явно видно, что Address Byte Value Write=&H4E, Address Byte Value Read=&H4F . Т.е. в микросхему данные пишем по &H4E.
Ну и стало понятно откуда взялся адрес 0х27 - это семибитный адрес.
Поделиться332013-07-25 16:33:54
В Bascom пишется целый byte, а это 8 бит, а не 7, может в этом причина?
Выше я выкладывал картинку из datasheet - где четко видно, что &H4E - это адрес чтения, а &H4F - адрес записи.
Документация которая у Вас - показывает противоположное, и самое странное работает и у Вас и у меня!
Да, что там говорить, работает, да и ладно. Вопрос в другом, как доделать библиотеки?
Поделиться352013-07-25 16:47:14
Все разжевано, но только для си - здесь
Поделиться362013-07-25 16:58:14
Вот картинка из документации "Texas Instruments" - другой производитель
Я, когда разглядывал табличку из моего предыдущего сообщения, нашел ответ на свой вопрос об адресе 0х27 - это не 8-битный, а 7-битный адрес. Теперь все понятно. Не люблю, когда что-то не понимаю...
Да, что там говорить, работает, да и ладно. Вопрос в другом, как доделать библиотеки?
Тут уж точно я не помощник 
Подозреваю, что глюки лезут из-за того, что у нас 4-строчные индикаторы. У них используются два сигнала "Enable": Е1 для первой и второй строки, и Е2 для 3-й и 4-ой. Лично у меня вместо Е2 задействована подстветка. Но библиотека lcd_pcf8574.lib как-то хитро обходит этот момент. Все 4 строки у меня работают нормально, и подсветка тоже работает. Надо только "Config Lcd = 20*4" не забывать указывать. Без него последние ряды съезжают вверх и влево.
Ну и без команды "Toggle _out_rw" индикатор работает некорректно, как я уже писал.
Поделиться372013-07-25 17:01:56
Ну и без команды "Toggle _out_rw" индикатор работает некорректно, как я уже писал
Пробовал и с ней и без неё, глючит (то выводит нормально, пару раз передернуть питание, выводит, что хочет).
Пробовал 20*2, результат тот же (глючит)
Поделиться382013-07-25 17:08:20
Больше всего добивает, что не хочет эмулироваться в "Протеус"!
Си-шный вариант эмулируется, а оба этих варианта не хотят, хотя к индикатору все сигналы приходят.
Если работать с PCF8574 на прямую, без библиотек, все работает.
Поделиться392013-07-25 17:16:34
Не путайте адрес чипа и команды!
И так (коль я открыл доку):
- все внешние выводы адреса (ноги) должны быть обязательно подтянуты к + (через резистор) или - (1 или 0, иначе не предсказуемая/случайная реакция..);
- чтобы были адреса чипа 4E и 4F - нужно все ножки адресов включить через ризисторы к питанию (единица на них должна быть)!
- в датащите четко написано, что 27 - это в 7 битной системе счисления без бита R/W (чтения/записи), видимо Си просто в либах так изначально работает (приписывает бит чтения/записи в зависимости от команды);
- (на сколько я увидел, поправьте если не так) разница между "без буквы" и "А" в принудительных установленных битах А3 и А4.
Вообще чтобы впредь такой путаницы не было и была ясность в голове, нужно писать в бинарном виде (для баскома)!
Надеюсь всё понятно теперь или нет?
Поделиться402013-07-25 17:19:25
Вдруг пригодится...
Вот рабочий исходник термометра и измерителя влажности. Датчик - DHT11. Часть исходника (работа с DHT11) позаимствована с wwwavrproject.ru. Вывод на индикатор через i2c.
'--------------------------- Указываем тип МК и его частоту ------------------------------
$regfile = "m328def.dat"
$crystal = 16000000
'-----------------------------------------------------------------------------------------
'---------------------------- Конфигурим LCD ---------------------------------------------
'Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.3 , Rs = Portb.2
'Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
$lib "lcd_pcf8574.lib"
Config I2cdelay = 1
Config Scl = Portc.5 ' CONFIGURE I2c Scl
Config Sda = Portc.4 ' Configure I2c Sda
Config Lcd = 20 * 4
Const Pcf8574_lcd = &H4E ' Defines the address of the I/O expander for LCD
Const Pcf_e2_is_output = 1 ' festlegen das E2 ein Ausgang ist
Const Pcf_rw_is_output = 1 ' festlegen das RW ein Ausgang ist
' festlgen welcher Pin vom PCF8574 welchen Pin vom LCD ansteuern soll
Const Pcf_rs = 0
Const Pcf_rw = 1
Const Pcf_e1 = 2 '2
Const Pcf_e2 = 3 '3
Const Pcf_d4 = 4
Const Pcf_d5 = 5
Const Pcf_d6 = 6
Const Pcf_d7 = 7
Cursor Off
Cls
'-----------------------------------------------------------------------------------------
'объявление подпрограммы
Declare Sub Get_th(t As Byte , H As Byte)
Config Serialin = Buffered , Size = 128
Config Serialout = Buffered , Size = 128
'подключение датчика к PortD.6
Dht_put Alias Portd.6
Dht_get Alias Pind.6
Dht_io_set Alias Ddrd.6
Dim _out_rw As Byte
Dim _out_e2 As Byte
Dim _lcd_e As Byte
Dim T As Byte 'перееменная для хранения температуры
Dim H As Byte 'переменная для хранения влажности
Dim Crc As Byte 'переменная для хранения байта четности
Dim Mybyte As Byte
Dim Sensor_data As String * 40 'сюда будут записываться данные отсылаемые датчиком
Dim Tmp_str8 As String * 8
Dim Count As Byte 'переменная для подсчета принятых бит
_lcd_e = 192 ' 64=E2 128=E1 192=E1+E2
_out_rw = 1 ' Ausgang ein schalten
_out_e2 = 1
Enable Interrupts
Set Dht_io_set
Set Dht_put
Toggle _out_rw
Lcd "AVRproject.ru"
Lowerline
Lcd "DHT11 sensor"
Waitms 1500
Do
'Waitms 1500
'Вместо задержки опроса датчика на 1.5 секунды вставил в 19-ю позицию
'анимацию на 2 секунды, которая заодно и показывает что программа не висит, а работает.
Call Get_th(t , H)
Cls
Lcd " Temp: " ; T ; "C"
Lowerline
Lcd "Humidity: " ; H ; "%"
Thirdline
Lcd " Date: "
Fourthline
Lcd " Time: "
Locate 1 , 19
Lcd "." : Wait 1
Locate 1 , 19
Lcd "o" : Wait 1
Locate 1 , 19
Lcd "O" : Wait 1
Locate 1 , 19
Lcd "o" : Wait 1
Loop
Sub Get_th(t As Byte , H As Byte)
Count = 0
Sensor_data = ""
Set Dht_io_set 'делаем PD.6 выходом
Reset Dht_put 'прижимаем шину к земле
Waitms 25 'ждем не менее 18мс
Set Dht_put 'отпускаем шину
Waitus 40
Reset Dht_io_set 'делаем PD.6 входом
Waitus 40 'ждем 40 мкс
If Dht_get = 1 Then 'если на нем по прежнему 1
H = 1 'значит датчик не ответил
Exit Sub 'выходим из подпрограммы
End If
'если датчик ответил и прижал шину к земле продолжаем работу
Waitus 80 'ждем еще 80 мкс
If Dht_get = 0 Then 'если на линии по прежнему 0
H = 2 'значит датчик сошел с ума
Exit Sub 'выходим из подпрограммы
End If
'если все нормально и датчик ответил правильно, тогда продолжаем
While Dht_get = 1 : Wend 'ждем пока на шине появится 1
Do 'начинаем принимать 40 бит данных
While Dht_get = 0 : Wend 'ждем появления на шине 0
Waitus 30 'после появления 0 ждем 30мкс
If Dht_get = 1 Then 'если на шине 1
Sensor_data = Sensor_data + "1" 'записываем в переменную эту единицу
While Dht_get = 1 : Wend 'и ждем пока датчик отправит следующий бит
Else 'иначе, если там был 0
Sensor_data = Sensor_data + "0" 'записываем этот 0 в переменную
End If
Incr Count 'увеличиваем счетчик на 1
Loop Until Count = 40 'повторяем пока счетчик не досчитает до 40
Set Dht_io_set
Set Dht_put
'начинаем раскладывать полученные данные
Tmp_str8 = Left(sensor_data , 8) 'берем левые 8 символов переменной
H = Binval(tmp_str8) 'это целая часть влажности
Tmp_str8 = Mid(sensor_data , 17 , 8) 'вытаскиваем 8 символов из середины
T = Binval(tmp_str8) 'это целая часть температуры
Tmp_str8 = Right(sensor_data , 8) 'правые 8 символов
Crc = Binval(tmp_str8) 'проверочные данные
'проверка контрольной суммы
Mybyte = T + H 'складываем значение температуры и влажности
If Mybyte <> Crc Then 'если контрольная сумма не сошлась
H = 3 'значит полученные данные не верны
End If
End Sub 'возвращаемся в главный цикл программыПоделиться412013-07-25 17:19:48
Да это все давно понятно, а вот с библиотеками ничего не понятно, разобраться поможете?
Поделиться422013-07-25 17:21:20
Надеюсь всё понятно теперь или нет?
Да, спасибо большое! Вопрос по адресам снят.
Поделиться432013-07-25 17:21:22
Игорь - во сколько Вам обошелся LCD?
Отредактировано sasha_1973 (2013-07-25 17:24:29)
Поделиться442013-07-25 17:39:41
Да это все давно понятно, а вот с библиотеками ничего не понятно, разобраться поможете?
А что там с библиотеками не так (пардон, на этот счет не следил)?
Вообще, прежде в чем-то копаться, нужно железо под это всё, у меня естественно всего такого нет (не использую).
Поделиться452013-07-25 17:40:12
Александр, меня можно на "ты". Мне так удобнее.
Индикатор обошелся в $15,55 (примерно 500 руб). Пересылка бесплатная. Шел примерно месяц. Но к нам всегда столько времени товары идут, поскольку я живу на расстоянии двух монтировок по карте от Москвы - север Тюменской области.
Кстати, можно найти и дешевле, но поскольку я у этого продавца покупал набор с Ардуиной, то и LCD у него купил, чтобы все в одной посылке приехало.
Только что посмотрел... В районе 50-60 рублей можно купить вот такую платку для обычного LCD 44780:
Поделиться462013-07-25 17:43:57
А что там с библиотеками не так (пардон, на этот счет не следил)?
Вообще, прежде в чем-то копаться, нужно железо под это всё, у меня естественно всего такого нет (не использую).
Железо есть, тестирование не вопрос.
Вывод на LCD через обе библиотеки глючит
Пробовал и с ней и без неё, глючит (то выводит нормально, пару раз передернуть питание, выводит, что хочет).
Пробовал 20*2, результат тот же (глючит)
Больше всего добивает, что не хочет эмулироваться в "Протеус"!
Си-шный вариант эмулируется, а оба этих варианта не хотят, хотя к индикатору все сигналы приходят.
Если работать с PCF8574 на прямую, без библиотек, все работает.
Поделиться472013-07-25 17:44:59
В районе 50-60 рублей можно купить вот такую платку для обычного LCD 44780
Это где такие цены, если не секрет?
Поделиться482013-07-25 17:53:31
Это где такие цены, если не секрет?
Да я все на Ebay покупаю.
вот, например
Вообще, прежде в чем-то копаться, нужно железо под это всё, у меня естественно всего такого нет (не использую).
Если у Вас есть время и желание покопаться с библиотекой, то я готов передать Вам деньги на покупку индикатора i2c. Сам купить не смогу, поскольку моя карточка в Paypal привязана к моему адресу доставки.
Поделиться492013-07-25 17:53:43
поскольку я живу на расстоянии двух монтировок по карте от Москвы - север Тюменской области.
Смотрел, на карте google. Далековато.
Поделиться502013-07-25 17:56:49
я готов передать Вам деньги на покупку индикатора i2c
Буду учавствовать!
Поделиться512013-07-25 17:58:43
Вообще в Баскоме проблема с либами под i2c дисплеи (там что-то было, уже ранее писал об этом).
Если глючит вывод (то работает, то нет) - значит проверьте сопли на плате, может адрес отваливается и/или висит в воздухе (там же если правильно на единицу вещать все адреса, то надо по хорошему 3 резистора, я бы впрочем вообще бы по лени своей, всё на землю кинул (и адреса изменил в коде)).
зы: а вообще, давно пора свои подпрограммы просто писать/накапливать БД под разные устройства. Я правда не сторонник функций в Баскоме (подглючивают они), чем проще пишешь - тем надежнее и менее ресурсоемко выходит.
Поделиться522013-07-25 18:01:01
Вот ссылка именно на мой индикатор на Ebay.
хотел пройти по ссылке - не открывается (
Поделиться532013-07-25 18:02:19
значит проверьте сопли на плате, может адрес отваливается и/или висит в воздухе (там же если правильно на единицу вещать все адреса, то надо по хорошему 3 резистора, я бы впрочем вообще бы по лени своей, всё на землю кинул (и адреса изменил в коде
Ошибки на плате исключены (2 разные платки), брак железа тоже (6 разных индикаторов), адресацию перебрал все варианты (PCF8574 и PCF8574A).
И снова таки, на си все работает и эмулируется, а с данными библиотеками не хочет.
Отредактировано sasha_1973 (2013-07-25 18:04:50)
Поделиться542013-07-25 18:03:22
хотел пройти по ссылке - не открывается (
http://www.ebay.com/sch/i.html?_odkw=i2 … p;_sacat=0
у меня открылась (Opera)
Поделиться552013-07-25 18:05:49
хотел пройти по ссылке - не открывается (
Странно. Только что проверил, открылась нормально...
Поделиться562013-07-25 18:16:13
Мне в Си-шной программе понравилось обращение к библиотеке и инициализация индикатора одновременно:
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
// addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
Одна строка и все, работаем с индикатором.
Отредактировано ignel (2013-07-25 18:25:52)
Поделиться572013-07-25 18:16:16
чудеса:
The connection was reset
The connection to the server was reset while the page was loading.
открыл ручками, без редиректа форума
чот я там примеров библиотек не увил под Баском
кстати, инклудами можно прятать свои подпрограммы в другие модули, весьма удобно и хардкодить с нюансами либов баскома ненадо)
Поделиться582013-07-25 18:21:10
чудеса:
открыл ручками, без редиректа форума
чот я там примеров библиотек не увил под Баском
кстати, инклудами можно прятать свои подпрограммы в другие модули, весьма удобно и хардкодить с нюансами либов баскома ненадо)
Поделиться592013-07-25 18:27:16
спасибо.
можете попробовать точно описать/поймать глюк? когда он появляется?
Поделиться602013-07-25 18:39:17
спасибо.
можете попробовать точно описать/поймать глюк? когда он появляется?
Пробовал и с ней и без неё, глючит (то выводит нормально, пару раз передернуть питание, выводит, что хочет).
Пробовал 20*2, результат тот же (глючит)
И больше всего убивает, с этими библиотеками не эмулируется в "Протеус" (только не начинайте, "Протеус" глючный, руки кривые, ноги поменяны местами и т.д).
Си-шный вариант прекрасно эмулируется!
В Bascom, если работать с I2c на прямую, тоже все эмулируется!
Не эмулируется только с этими библиотеками! (к LCD все приходит)
Отредактировано sasha_1973 (2013-07-25 18:43:45)
