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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Помогите с запуском LCD 4x20 по i2c


Помогите с запуском LCD 4x20 по i2c

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

1

Купил себе на пощупать Arduino Uno (Atmega328) и дополнительно к ней индикатор HD44780 с платкой-переходником на i2c.
Никак не могу добиться, чтобы он хоть что-то на экране показал. Перекопал кучу ресурсов, но результат отрицательный.
Сам индикатор живой, проверял заливкой скетча из Arduino-овской среды разработки. Там он хоть что-то на экран выводит, и моргает подсветкой. Но поскольку я с Си даже не на "Вы", а на "Кто это?!", то для меня переход на Си - не вариант.

Добавил в Bascom библиотеку lcd_i2c.lib, изобразил простенькую программку, но увы... Может есть у кого примеры работы с этим индикатором?
Вот листинг (комментарии остались от оригинала):

Код:
$regfile = "m328def.dat"                                    ' used micro
$crystal = 16000000                                         ' used xtal

Rem $sim

$lib "Lcd_i2c.lib"                                          'My i2c driver for the LCD
Config I2cdelay = 1
Const Pcf8574_lcd = &H40                                    'Defines the address of the I/O expander for LCD

Config Scl = Portb.1                                        'Configure i2c SCL
Config Sda = Portb.2                                        'Configure i2c SDA
Config Lcd = 20 * 4

Dim _lcd_e As Byte                                          'Needed to control 4 line LCD
_lcd_e = 128

Cls
Cursor Blink
Lcd "test"

End

Да, в описании индикатора было указано: I2C Address: 0x27, в PDF на м/схему i2c (PCF8574) указано, что если ноги 1,2,3 не сидят на земле, то адрес устройства равен &H40. Ноги звонил, на земле не сидят.

Пните меня в нужном направлении, плиз...

0

2

я пробовал Этот вариант, так ничего и не добился. Люди выкладывают, правда в основном на "Си".

0

3

Обратите внимание на "PCF8574" или "PCF8574(N)"!!!

Вот адресация

'*******************************************************************************
'***************-----------*****************************************************
'***************| Pcf8574 |*****************************************************
'***************-----------*****************************************************
'**********| A0 | A1 | A2 | code |**********************************************
'**********| 0  | 0  | 0  | &H40 |**********************************************
'**********| 1  | 0  | 0  | &H42 |**********************************************
'**********| 0  | 1  | 0  | &H44 |**********************************************
'**********| 1  | 1  | 0  | &H46 |**********************************************
'**********| 0  | 0  | 1  | &H48 |**********************************************
'**********| 1  | 0  | 1  | &H4A |**********************************************
'**********| 0  | 1  | 1  | &H4C |**********************************************
'**********| 1  | 1  | 1  | &H4E |**********************************************
'*******************************************************************************
'*******************************************************************************
'*********** Const Pcf8574 = &H40 **********************************************
'*********** Const Pcf8574 = &H42 **********************************************
'*********** Const Pcf8574 = &H44 **********************************************
'*********** Const Pcf8574 = &H46 **********************************************
'*********** Const Pcf8574 = &H48 **********************************************
'*********** Const Pcf8574 = &H4A **********************************************
'*********** Const Pcf8574 = &H4C **********************************************
'*********** Const Pcf8574 = &H4E **********************************************
'*******************************************************************************
'*******************************************************************************
'*********** Const Pcf8574 = &H41 **********************************************
'*********** Const Pcf8574 = &H43 **********************************************
'*********** Const Pcf8574 = &H45 **********************************************
'*********** Const Pcf8574 = &H47 **********************************************
'*********** Const Pcf8574 = &H49 **********************************************
'*********** Const Pcf8574 = &H4B **********************************************
'*********** Const Pcf8574 = &H4D **********************************************
'*********** Const Pcf8574 = &H4F **********************************************
'*******************************************************************************

Если "PCF8574(A)", то адресация другая

0

4

ignel написал(а):

Да, в описании индикатора было указано: I2C Address: 0x27, в PDF на м/схему i2c (PCF8574) указано, что если ноги 1,2,3 не сидят на земле, то адрес устройства равен &H40. Ноги звонил, на земле не сидят.

&H40 - 3 вывода на земле!!!

0

5

sasha_1973 написал(а):

я пробовал Этот вариант, так ничего и не добился. Люди выкладывают, правда в основном на "Си".

Я его тоже пробовал. Не то что запустить, скомпилировать не смог. BASCOM кучу ошибок в лог вывалил, и на этом все дело кончилось. :(

Отредактировано ignel (2013-07-12 01:11:51)

0

6

Прочитайте название микросхемы. Если буква "А" присутствует, смените адресацию.

И не забудте, &H40 - 3 вывода на земле!!!

0

7

Подключаем LCD на HD44780 через I2C расширитель PCF8574

Внимательно прочитайте про адресацию!

Вот ещё

Отредактировано sasha_1973 (2013-07-12 01:16:16)

0

8

Если вдруг получится, поделитесь пожалуйста исходником!

0

9

sasha_1973 написал(а):

Прочитайте название микросхемы. Если буква "А" присутствует, смените адресацию.

У меня стоит PCF8574"Т"

Вот такая табличка шла в архиве с библиотекой lccd_i2c:
http://s5.uploads.ru/TJWzS.jpg

0

10

sasha_1973 написал(а):

Если вдруг получится, поделитесь пожалуйста исходником!

Обязательно!

Сегодня явно не мой день. Весь вечер просидел около Ардуины и индикатора, и ничего не добился. Решил попробовать подключить другой LCD (2x16) по стандартной 4-битной схеме. И тот молчит. Хватит на сегодня, я думаю. Утро ночи мудренее. Сама Ардуина работает, это точно. Диодиками я поморгал...

Вот же я тормоз :(
Действительно по ногам адресации с точностью до наоборот определил!

Отредактировано ignel (2013-07-12 01:32:57)

0

11

ignel написал(а):

Обязательно!

Сегодня явно не мой день. Весь вечер просидел около Ардуины и индикатора, и ничего не добился. Решил попробовать подключить другой LCD (2x16) по стандартной 4-битной схеме. И тот молчит. Хватит на сегодня, я думаю. Утро ночи мудренее. Сама Ардуина работает, это точно. Диодиками я поморгал...

Вот же я тормоз
Действительно по ногам адресации с точностью до наоборот определил!

Отредактировано ignel (Сегодня 00:32:57)


Не ошибается тот, кто ничего не делает!

Попробуйте отключить индикатор (если на разъёме), и передать, прочитать данные с PCF8574 (поморгать светиком, прочитать кнопку).
Так сказать - покаскадная проверка.

Помните, что:

************************************************************

   Const Pcf8574_чтение = &H41       '> Адресация чтения PCF8574
   Const Pcf8574_запись = &H40       '> Адресация записи PCF8574

************************************************************

   Не забудте про подтяжку шины I2c, (резюки 10к на +5В)

************************************************************

Здесь всё, что Вам нужно

Здесь   - эмуляция

Следующим этапом, заставте работать LCD от другого МК.
Недавно подключал LCD, заработал на 3-м контроллере, хотя МК все рабочие.

Обратите внимание на подключение контрастности (может он работает, но Вы ничего не видите).

Надеюсь это у Вас временные трудности.
Удачи!

После 20.00, на связи.

Отредактировано sasha_1973 (2013-07-12 06:41:53)

0

12

sasha_1973 написал(а):

Попробуйте отключить индикатор (если на разъёме), и передать, прочитать данные с PCF8574 (поморгать светиком, прочитать кнопку).
Так сказать - покаскадная проверка.

Увы, платка к индикатору припаяна. Но если варианты кончатся, буду отпаивать.

sasha_1973 написал(а):

Помните, что:

************************************************************

Const Pcf8574_чтение = &H41       '> Адресация чтения PCF8574
Const Pcf8574_запись = &H40       '> Адресация записи PCF8574

************************************************************

Залил в Ардуино еще раз сэмпловый скетч из среды разработки Arduino. Выяснил, что индикатор подает признаки жизни только на адресе 0х27. Тогда он начинает хаотично моргать подсветкой, и выводит "0" в последнем знакоместе верхнего ряда. На адреса из таблички, которую я постил в предыдущем сообщении, не откликается никак. Собственно, продавец в описании так и писал, что у индикатора адрес 0х27. Насколько я понял из копания по инету, это в Си константа в шестнадцатеричном виде... Т.е. и в нашем случае, в Bascom, тоже нужно указывать этот же адрес.

sasha_1973 написал(а):

Здесь всё, что Вам нужно

Спасибо! Ценная информация!

sasha_1973 написал(а):

Следующим этапом, заставте работать LCD от другого МК.
Недавно подключал LCD, заработал на 3-м контроллере, хотя МК все рабочие.

Еще одной Ардуины, или голого контроллера у меня нет. Я с Ардуинкой-то второй день копаюсь только. Так сказать - свисток от чайника. Когда-то немного копался в Bascom, и тестировал прошивку в Proteus, вот и весь мой опыт.

sasha_1973 написал(а):

Обратите внимание на подключение контрастности (может он работает, но Вы ничего не видите).

Контрастность в норме, 1 и 3 ряды чуть затемнены. Я уже раньше наступал на эти грабли (вешал LCD 20x4 на LPT компьютера для вывода системной информации), помню про такую штуку.

sasha_1973 написал(а):

Надеюсь это у Вас временные трудности.
Удачи!

Спасибо, Александр! Я тоже на это надеюсь.
А то уже руки опускаются. Вчера практически с обеда с ним бьюсь, и с нулевым эффектом.
В наборе с Ардуиной столько интересных датчиков в комплекте, а поработать с ними никак - некуда инфу выводить.

sasha_1973 написал(а):

После 20.00, на связи.

Отредактировано sasha_1973 (Сегодня 09:26:09)

+1

13

Ещё раз, посмотрите на название PCF8574 !!!
От одной буквы, может поменяться, что угодно (особенно адресация) !!!

Попробуйте светик, через резюк, параллельно LCD? думаю ничего страшного не будет!

Чего это руки опускаются!
Я с этим подключением, возился 2 месяца, и до сих пор желание не пропало, а Вы только пол дня.

Отредактировано sasha_1973 (2013-07-12 07:11:05)

0

14

Нашел еще один скетч для Wiring (родная среда разработки для Arduino), который как раз занимается тем, что сканирует все устройства i2c, и выводит результат на виртуальный терминал. Таки индикатор сидит на 0х27.

Со светодиодиком да, надо побаловаться. Может выкопаю из залежей свой осциллограф, и посмотрю - идет ли вообще что-нибудь из сигналов.

sasha_1973 написал(а):

Чего это руки опускаются!
Я с этим подключением, возился 2 месяца, и до сих пор желание не пропало, а Вы только пол дня.


Да тут как пошло все не ровно с самого начала приобретения, так и не выпрямится никак. На Ebay китайцы обманули - вместо Arduino Mega 2560 прислали Arduino Uno, сейчас открыл кейс на Ебее по этому поводу. Пока переписываемся. Позавчера весь день пытался Ардуину подружить с Bascom. Хоть в Bascom и заявлена поддержка прошивки Ардуино, у меня на двух машинах Баском наотрез отказался видеть платку. Пришлось подставить костылик - программку внешнего программатора. Сейчас Ардуина шьется прямо из Bascom. Но теперь еще и индикатор упирается.

Ладно, прорвемся, я думаю :) .

0

15

1. Китайцы - овощи, большинство торгуют и не разбираются вообще в электронике, главное экран похож, а какой он там I2c или SPI - им пофиг. Так же со всем остальным. Скажу даже больше, один и тот же индикатор может иметь внутрений контроллер с разными кодами/адресами управления (приходится проверять вручную).
2. Что это за такая либа "Lcd_i2c.lib"?
3. "config lcd" - не работает с i2c. Lcd "test" - не прокатит. В баскоме вообще нет нормальной, универсальной библиотеки для работы с i2c индикаторами на разных контроллерах (есть там вроде одна какая-то и то редко используется в реале). Как писал сам автор баскома, он бы может и рад писать такие либы, только ему нужен в наличии (на руках) такое железо. В общем адекватное желание...
4. Желательно подключаем к МК i2c шину на отведенные для этого ноги.
5. Используем библиотеку $lib "I2C_TWI.LBX", если хотим аппаратный i2c с ножек МК (в пункте N4), иначе по умолчанию баском программно использует i2c (аля эмулиция). У XMega всё по другому..
6. Любые i2c индикаторы управляешь сам напрямую через команды "I2cstart", "I2cwbyte"....в итоге можно получить нечто подобное.
7. Можно и самому либу сворганить под контроллер индикатора, но для этого нужен навык  и не малый.

Отредактировано RDW (2013-07-12 11:06:48)

0

16

1. Сейчас выяснил две вещи и окончательно убедился еще в одной: все-таки индикатор i2c, и он работает. Но опять же, все это выяснил с помощью скетча в Wiring, который пишется на Си. И адрес у него точно 0х27.

2. Я много страниц перерыл, не помню точно где его нашел, поэтому даю ссылку на сохраненную мной копию. В архиве библиотеки для LCD с i2c, клавиатуры с i2c, пара небольших PDF и примерчиком на бейсике.

3. Я же буквально позавчера взял в руки Ардуинку, так что могу нести всякую чушь. Мне еще долго предстоит бежать по граблям...
Эх, посодействовать бы автору Bascom-а в в плане индикатора.

4. Да, на отведенные ноги (4, 5) и подключал. Я уже кучу портов перепробовал...

5, 6, и особенно 7. Этот вес мне пока не взять. С моими знаниями на данный момент проще подключить LCD по стандартной 4-битной схеме. Но я еще помучаюсь с i2c. Оторвать индикатору платку со спины я всегда успею :)

0

17

Сделал еще один подход к индикатору. Покопался в библиотеке LCD_I2C, взятой с сайта Bascom (вот где я брал библиотеку...) . Обнаружил, что в ней другая распиновка индикатора.
У них распиновка между PCF8574 - HD44780 такая:
P0 - D4
P1 - D5
P2 - D6
P3 - D7
P4 - RS
P5 - RW (not used, set to 0 to ground for write)
P6 - E2 (on 1 or 2 line display nc)
P7 - E1

Прозвонил свой индикатор. У меня распиновка такая:

8574 - LCD

4 (P0)  - 4 (Register Select)
5 (P1)  - 5 (R/W)
6 (P2)  - 6 (Enable)
7 (P3)  - 15 (??? Light On)
8 (Vss) -
9 (P4)  - 11 (Data 4)
10 (P5)  - 12 (Data 5)
11 (P6)  - 13 (Data 6)
12 (P7)  - 14 (Data 7)

А вот кусок из библиотеки, который похоже отвечает за то, куда и какие выводы цепляются:
[_Init_LCD]
_Init_LCD:
*BASIC: waitms 50
ldi r16,&hc0       ; this is to make the initialization on both halfs of a 4-line LCD
Ldi _temp1, &h03   ; at init-time I call all routines before _lcd_e is loaded into r16
Rcall _Send_to_LCD
*BASIC: waitms 4
Rcall _Send_to_LCD
Rcall _Send_to_LCD
Ldi _temp1, &h02
Rcall _Send_to_LCD
Ldi _temp1, &h28
Rcall _Write_lcd_byte  ;RS flag should to be 0, so jump directly to write byte
Ldi _temp1, &h08
Rcall _Write_lcd_byte
Ldi _temp1, &h0c
Rcall _Write_lcd_byte
Ldi _temp1, &h01
Rjmp _Write_lcd_byte
[END]

Увы, это я не осилю. Может у кого нибудь будет время и желание покопаться?

0

18

Mrshilov написал(а):

Это кусок инициализации, а нужно переставлять биты в temp1 в последней части с метки _Send_to_LCD:. Но есть уже готовый вариант:
На сайте Bascom в AN #118 в файле для скачивания есть каталог ModByLudwig с модифицированной библиотекой. В ней можно выбирать ноги 8574 как угодно.
А есть еще такой вариант. Тут еще и с включением подсветки.

Здесь всё, что нужно, может у кого получиться запустить!

0

19

Вот, со скрипом, но зато 100% работает - скачать 

Ссылку в предыдущем посте давал "Mrshilov"

Все остальные варианты, пока, так и не заработали.

http://s4.uploads.ru/t/RXYVJ.jpg

Отредактировано sasha_1973 (2013-07-24 05:16:58)

0

20

Я СДЕЛАЛ ЭТО!!! :)

Индикатор, подключенный по i2c, заработал!
Спасибо вам, други! Без вашей помощи я бы еще долго сидел и разглядывал пустые знакоместа...

Если подвести краткий итог, то я пробежал по всем граблям, которые были вокруг. При чем грабли были детские, с черенком который по длине в аккурат мне ниже пояса.
Увы, микроконтроллеры я начал щупать совсем недавно, поэтому и ошибки такие очевидные. Итак...

- Не всегда адрес, который указан явно (помните, я говорил про адрес 0х27?) соответствует истине. Хотя, скорее это ошибка моего незнания. Я посчитал, что если в Си указан такой шестнадцатеричный адрес, то и в Bascom он тоже будет такой. На самом деле адрес индикатора в Bascom-е будет &H4E. Вот этот момент я, кстати, и не понял до сих пор. Вроде и там, и тут 16-ричка указана... Выяснил это запустив программный сканер устройств i2c. Программу писал не я. Нашел на просторах инета. Вот листинг, вдруг кому пригодится?

Код:
$regfile = "m328def.dat"
$crystal = 16000000
'-----------------------------------------------------------------------------------------
Dim Yn As String * 1
Dim Adrs As Word
Dim Row As Word

Config Sda = Portc.4
Config Scl = Portc.5

I2cinit

Print Chr(&H1b) ; "[2J";
Input "Would You like to see all devices on i2c bus (y/n)" , Yn
If Yn = "y" Then
 Print "i2c-device locator 1=no device 0=device present"
 Print ""
 Print "            0    2    4    6    8    A    C    E"
 Print " 0000 " ;
 For Adrs = 0 To 254 Step 2
   Row = Adrs Mod 16
   If Row = 0 And Adrs > 0 Then
   Print
   Print " " ; Hex(adrs) ; " ";
   End If
   I2cstart
   I2cwbyte Adrs
   Print " " ; Err ; "   ";
   I2cstop
 Next Adrs
 Print
End If
Print
Print "Any key to continue..."
End

- Второе: Библиотека, скачанная с сайта mcselec.com не помогла. И та, что лежит в папке "ModByLudwig" - тоже. Хотя, как справедливо указал мне Mrshilov (извиняюсь, не знаю имени), в ней и можно назначать свои пины на порты м/с PCF8574, но с моим индикатором это не сработало. У него нет вывода Е2. Вместо него к ножке порта прикручена подсветка. В итоге он работает, но вместо вывода текста в 3 и 4-ю строки, начинает моргать подсветкой. Заработала библиотека из архива, который прислал Александр

- Третье: Подтяжка шин SDA и SCF нужна обязательно! Спасибо, Александр! Не стоило мне забывать про резисторы 10 кОм. И не стоило надеяться на внутреннюю подтяжку...

Из немецкого описания не совсем понял про команду "Toggle _out_rw". Хоть я и учил его в школе, но учебник искурил еще в пятом классе, а Гугловский переводчик переводит эээ... Своеобразно, скажем... Методом тыка выяснил, что без этой команды индикатор остается мертвым, или несет всякий мусор. Разрешение на запись данных в индикатор?

Да! Если скомандовать "_out_e2 = 1", то включится подсветка. При этом ничего на экране не рушится, все данные выводятся исправно.

Вот пробный исходник, с которым индикатор работает нормально:

Код:
'--------------------------- Указываем тип МК и его частоту ------------------------------
$regfile = "m328def.dat"
$crystal = 16000000
'-----------------------------------------------------------------------------------------

$lib "lcd_pcf8574.lib"                                         'Подключаем библиотеку

Dim _out_rw As Byte
Dim _out_e2 As Byte
Dim _lcd_e As Byte                                          ' NEEDED To Control 4 Line Lcd

Config I2cdelay = 1
Config Scl = Portc.5                                        ' Конфигурим I2c Scl
Config Sda = Portc.4                                        ' Конфигурим I2c Sda
Config Lcd = 20 * 4

Const Pcf8574_lcd = &H4E                                    ' Адрес индикатора
Const Pcf_e2_is_output = 1                                  ' festlegen das E2 ein Ausgang ist
Const Pcf_rw_is_output = 1                                  ' festlegen das RW ein Ausgang ist

' Раскидываем пины индикатора по ножкам PCF8574

Const Pcf_rs = 0
Const Pcf_rw = 1
Const Pcf_e1 = 2
Const Pcf_e2 = 3
Const Pcf_d4 = 4
Const Pcf_d5 = 5
Const Pcf_d6 = 6
Const Pcf_d7 = 7

_lcd_e = 192                                                ' 64=E2 (вывод в 3-ю и 4-ю строки) 128=E1 (вывод в 1-ю и 2-ю строки) 192=E1+E2 (вводим во все четыре строки)
_out_rw = 1                                                 ' Ausgang ein schalten - вот тут не понял... Очень сильное колдунство
_out_e2 = 1

Cls                                                         'Чистим индикатор

Do                                                          ' И в цикле выводим строки на экран
Locate 1 , 1
Lcd "Line 1"
Locate 2 , 1
Lcd "Line 2"
Locate 3 , 1
Lcd "Line 3"
Locate 4 , 1
Lcd "Line 4"

Toggle _out_rw .
Wait 1

'Toggle _out_e2                                              'Подсветку включим? Если "_out_e2 = 1", то включена. Если "_out_e2 = 0", то выключена
Loop

End

Индикатор уже исправно показывает температуру и влажность с датчика DHT11 :) .

Еще раз огромное спасибо вам за помощь!!!

Чуть позже найду и заброшу в тему фото своего индикатора со стороны платки i2c, дабы его можно было опознать визуально и не терять время на забег по граблям.

+2

21

Прозвоните выводы 1, 2, 3 - на соответствие таблице ниже:

Адресация PCF8574

'------------------------------------------------------------------
'|             |  PCF8574,PCF8574N, PCF8575 |  PCF8574A, PCF8574AP |
'|-------------|----------------------------|----------------------|
'|  A0  A1  A2 |     Чтение  |   Запись     |   Чтение  |  Запись  |
'|-------------|-------------|--------------|-----------|----------|
'|  0   0   0  |      &H40   |     &H41     |    &H70   |   &H71   |
'|  1   0   0  |      &H42   |     &H43     |    &H72   |   &H73   |
'|  0   1   0  |      &H44   |     &H45     |    &H74   |   &H75   |
'|  1   1   0  |      &H46   |     &H47     |    &H76   |   &H77   |
'|  0   0   1  |      &H48   |     &H49     |    &H78   |   &H79   |
'|  1   0   1  |      &H4A   |     &H4B     |    &H7A   |   &H7B   |
'|  0   1   1  |      &H4C   |     &H4D     |    &H7C   |   &H7D   |
'|  1   1   1  |      &H4E   |     &H4F     |    &H7E   |   &H7F   |
'------------------------------------------------------------------

Время вывода 20 символов в 4 строках, при "Config I2cdelay = 1" - 116 ms

Отредактировано sasha_1973 (2013-07-24 20:04:00)

0

22

Вот 2 рабочих варианта (проверено в железе), правда оба работают с глюками!

Может у кого нибудь из "гуру" найдется время, довести библиотеки до ума.

На основе библиотеки "lcd_pcf8574.lib"

'--------------------------- Указываем тип МК и его частоту ------------------------------
  $regfile = "m8def.dat"
  $crystal = 8000000
'-----------------------------------------------------------------------------------------

  $lib "lcd_pcf8574.lib"       'Подключаем библиотеку

  Dim _out_rw As Byte
  Dim _out_e2 As Byte
  Dim _lcd_e As Byte       ' NEEDED To Control 4 Line Lcd

  Config I2cdelay = 1
  Config Scl = Portc.5       ' Конфигурим I2c Scl
  Config Sda = Portc.4       ' Конфигурим I2c Sda
  Config Lcd = 20 * 4

'-------------------------------------------------------------------------------
'------------------------------------------------------------------
'|             |  PCF8574,PCF8574N, PCF8575 |  PCF8574A, PCF8574AP |
'|-------------|----------------------------|----------------------|
'|  A0  A1  A2 |     Чтение  |   Запись     |   Чтение  |  Запись  |
'|-------------|-------------|--------------|-----------|----------|
'|  0   0   0  |      &H40   |     &H41     |    &H70   |   &H71   |
'|  1   0   0  |      &H42   |     &H43     |    &H72   |   &H73   |
'|  0   1   0  |      &H44   |     &H45     |    &H74   |   &H75   |
'|  1   1   0  |      &H46   |     &H47     |    &H76   |   &H77   |
'|  0   0   1  |      &H48   |     &H49     |    &H78   |   &H79   |
'|  1   0   1  |      &H4A   |     &H4B     |    &H7A   |   &H7B   |
'|  0   1   1  |      &H4C   |     &H4D     |    &H7C   |   &H7D   |
'|  1   1   1  |      &H4E   |     &H4F     |    &H7E   |   &H7F   |
'------------------------------------------------------------------
'-------------------------------------------------------------------------------

  Const Pcf8574_lcd = &H7F       ' Адрес микросхемы индикатора
  Const Pcf_e2_is_output = 1       ' festlegen das E2 ein Ausgang ist
  Const Pcf_rw_is_output = 1       ' festlegen das RW ein Ausgang ist

' Раскидываем пины индикатора по ножкам PCF8574

  Const Pcf_rs = 0
  Const Pcf_rw = 1
  Const Pcf_e1 = 2
  Const Pcf_e2 = 3
  Const Pcf_d4 = 4
  Const Pcf_d5 = 5
  Const Pcf_d6 = 6
  Const Pcf_d7 = 7

  _lcd_e = 128      ' 64=E2 (вывод в 3-ю и 4-ю строки) 128=E1 (вывод в 1-ю и 2-ю строки) 192=E1+E2 (вводим во все четыре строки)
'  _out_rw = 1       ' Ausgang ein schalten - вот тут не понял... Очень сильное колдунство
'  _out_e2 = 1

  Cls               'Чистим индикатор

'-------------------------------------------------------------------------------
  Do

    Locate 1 , 1
    Lcd "Aa ІBіЎґагEeЈ¶¤·Ґё¦№"       ' "АаБбВвГгДдЕеЖжЗзИиЙй"

    Locate 2 , 1
    Lcd "Kє§»MјHЅOoЁѕPpCcTї©y"       ' "КкЛлМмНнОоПпРрСсТтУу"

    Locate 3 , 1
    Lcd "ЄдXxбе«А¬Бвж­В®ГbД®Е"       ' "ФфХхЦцЧчШшЩщЪъЫыЬьЭэ"

    Locate 4 , 1
    Lcd "°Ж±З                "       ' "ЮюЯя                "

' Не понятно зачем, без него работает.
'    Toggle _out_rw

' Коммутация подсветки
'    Toggle _out_e2

  Loop
End
'-------------------------------------------------------------------------------
'*******************************************************************************

Используемая библиотека "Lcd_i2c.lib"

$regfile = "m8def.dat"
  $crystal = 8000000
  $hwstack = 40
  $swstack = 16
  $framesize = 32

  $lib "Lcd_i2c.lib"       ' Используемая библиотека

  Config I2cdelay = 1

'-------------------------------------------------------------------------------
'------------------------------------------------------------------
'|             |  PCF8574,PCF8574N, PCF8575 |  PCF8574A, PCF8574AP |
'|-------------|----------------------------|----------------------|
'|  A0  A1  A2 |     Чтение  |   Запись     |   Чтение  |  Запись  |
'|-------------|-------------|--------------|-----------|----------|
'|  0   0   0  |      &H40   |     &H41     |    &H70   |   &H71   |
'|  1   0   0  |      &H42   |     &H43     |    &H72   |   &H73   |
'|  0   1   0  |      &H44   |     &H45     |    &H74   |   &H75   |
'|  1   1   0  |      &H46   |     &H47     |    &H76   |   &H77   |
'|  0   0   1  |      &H48   |     &H49     |    &H78   |   &H79   |
'|  1   0   1  |      &H4A   |     &H4B     |    &H7A   |   &H7B   |
'|  0   1   1  |      &H4C   |     &H4D     |    &H7C   |   &H7D   |
'|  1   1   1  |      &H4E   |     &H4F     |    &H7E   |   &H7F   |
'------------------------------------------------------------------
'-------------------------------------------------------------------------------

  Const Pcf8574_lcd = &H7F       ' Адрес микросхемы

  Config Scl = Portc.5       ' Конфинурация аппаратного i2c
  Config Sda = Portc.4

  Dim _lcd_e As Byte
   _lcd_e = 192      ' 64=E2 (вывод в 3-ю и 4-ю строки) 128=E1 (вывод в 1-ю и 2-ю строки) 192=E1+E2 (вводим во все четыре строки)

  Const Pcf_rs = 0
  Const Pcf_rw = 1
  Const Pcf_e1 = 2
  Const Pcf_e2 = 3
  Const Pcf_d4 = 4
  Const Pcf_d5 = 5
  Const Pcf_d6 = 6
  Const Pcf_d7 = 7

  Do

    Locate 1 , 1
    Lcd "Aa ІBіЎґагEeЈ¶¤·Ґё¦№"       ' "АаБбВвГгДдЕеЖжЗзИиЙй"
    Locate 2 , 1
    Lcd "Kє§»MјHЅOoЁѕPpCcTї©y"       ' "КкЛлМмНнОоПпРрСсТтУу"
    Locate 3 , 1
    Lcd "ЄдXxбе«А¬Бвж­В®ГbД®Е"       ' "ФфХхЦцЧчШшЩщЪъЫыЬьЭэ"
    Locate 4 , 1
    Lcd "°Ж±З                "       ' "ЮюЯя"

  Loop
End

http://s4.uploads.ru/t/QcV6o.jpg

Исходники + библиотеки - скачать

Отредактировано sasha_1973 (2013-07-25 09:59:54)

0

23

sasha_1973 написал(а):

Прозвоните выводы 1, 2, 3 - на соответствие таблице ниже:


1,2,3 выводы сидят на +5, т.е. адрес &H4E

Все равно не пойму, почему если пользоваться Си, то адрес у индикатора получается 0х27, а если работать с ним из Bascom, то адрес индикатора становится &H4E .
При чем, в обоих случаях индикатор работает как положено. В чем разница системы исчисления? Насколько я понял, и в первом случае тоже шестнадцатеричка используется...

Второй вариант тестовой программы из предыдущего сообщения (который с библиотекой Lcd_i2c.lib) у меня не завелся. Первый, с библиотекой lcd_pcf8574.lib запустился нормально (только адрес индикатора поменял на свой). А в чем выражаются глюки?

Отредактировано ignel (2013-07-25 15:31:54)

0

24

27 - 00100111
4E - 01001110

как бы логику можно просмотреть (смещение на 1 бит), но чтобы понять реально почему так, то нужно сравнить код Си с Басиком
а лучше верить датащиту на чип (может быть ошибка в библиотеке)

0

25

RDW написал(а):

27 - 00100111
4E - 01001110

как бы логику можно просмотреть (смещение на 1 бит), но чтобы понять реально почему так, то нужно сравнить код Си с Басиком
а лучше верить датащиту на чип (может быть ошибка в библиотеке)

В высшей степени странно!

Адрес &H4E - это адрес чтения PCF8574 с 1, 2, 3 выводами на +5В

0

26

Вот ссылка именно на мой индикатор на Ebay. Там ниже явно указано:
Specification
Interface: I2C
I2C Address: 0x27
Pin Definition : GND、VCC、SDA、SCL
Back lit (Blue with White char color)
Supply voltage: 5V
PCB Size : 98mm×60mm
Contrast Adjust :  Potentiometer
Backlight Adjust : Jumper

И есть примерчик на Си.

sasha_1973 написал(а):

В высшей степени странно!

Адрес &H4E - это адрес чтения PCF8574 с 1, 2, 3 выводами на +5В


Хм. Могу видео работы на этом адресе записать и прислать...

0

27

На микросхеме какая буква в конце, на картинке не видно

0

28

как показала практика использования сверх-дешевых, китайских изделий - у этих "братьев" вообще нет никакой сертификации и выдержки стандартов
адреса могут ляпать с потолка (так же и другие хар-ки самого изделия)

0

29

http://s4.uploads.ru/t/5Sich.jpg

Согласно документации на микросхему

&H4E = 0100 1110 = 1, 2, 3 выводы на +5В = чтение

&H4F= 0100 1111 = 1, 2, 3 выводы на +5В = запись

Как может, что-то выводиться, если это адрес чтения?

Отредактировано sasha_1973 (2013-07-25 16:16:57)

0

30

Ув. RDW!

Нет желания разобраться с библиотеками?

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Помогите с запуском LCD 4x20 по i2c