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

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

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

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


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


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

Сообщений 31 страница 60 из 210

31

Может PCF8574 кастрированая, работает только в одну сторону (китайский вариант)?

0

32

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

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


PCF8574Т

Судя по даташиту, это обычная м/сх., без буквы "А". Вот толковый даташит. В нем на 6-й странице есть адресация и обычной PCF8574, и PCF8574A.

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

Согласно документации на микросхему
&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.
http://s4.uploads.ru/zEBKe.jpg

Ну и стало понятно откуда взялся адрес 0х27 - это семибитный адрес.

0

33

В Bascom пишется целый byte, а это 8 бит, а не 7, может в этом причина?

Выше я выкладывал картинку из datasheet - где четко видно, что &H4E - это адрес чтения, а &H4F - адрес записи.

Документация которая у Вас - показывает противоположное, и самое странное работает и у Вас и у меня!

Да, что там говорить, работает, да и ладно. Вопрос в другом, как доделать библиотеки?

0

34

Вот картинка из документации "Texas Instruments" - другой производитель

http://s5.uploads.ru/t/s3CFN.jpg

0

35

Все разжевано, но только для си - здесь

Библиотека для си

0

36

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

Вот картинка из документации "Texas Instruments" - другой производитель

Я, когда разглядывал табличку из моего предыдущего сообщения, нашел ответ на свой вопрос об адресе 0х27 - это не 8-битный, а 7-битный адрес. Теперь все понятно. Не люблю, когда что-то не понимаю...

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

Да, что там говорить, работает, да и ладно. Вопрос в другом, как доделать библиотеки?

Тут уж точно я не помощник :(
Подозреваю, что глюки лезут из-за того, что у нас 4-строчные индикаторы. У них используются два сигнала "Enable": Е1 для первой и второй строки, и Е2 для 3-й и 4-ой. Лично у меня вместо Е2 задействована подстветка. Но библиотека lcd_pcf8574.lib как-то хитро обходит этот момент. Все 4 строки у меня работают нормально, и подсветка тоже работает. Надо только "Config Lcd = 20*4" не забывать указывать. Без него последние ряды съезжают вверх и влево.

Ну и без команды "Toggle _out_rw" индикатор работает некорректно, как я уже писал.

0

37

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

Ну и без команды "Toggle _out_rw" индикатор работает некорректно, как я уже писал


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

Пробовал 20*2, результат тот же (глючит)

0

38

Больше всего добивает, что не хочет эмулироваться в "Протеус"!

Си-шный вариант эмулируется, а оба этих варианта не хотят, хотя к индикатору все сигналы приходят.

Если работать с PCF8574 на прямую, без библиотек, все работает.

0

39

Не путайте адрес чипа и команды!

И так (коль я открыл доку):

- все внешние выводы адреса (ноги) должны быть обязательно подтянуты к + (через резистор) или - (1 или 0, иначе не предсказуемая/случайная реакция..);
- чтобы были адреса чипа 4E и 4F - нужно все ножки адресов включить через ризисторы к питанию (единица на них должна быть)!
- в датащите четко написано, что 27 - это в 7 битной системе счисления без бита R/W (чтения/записи), видимо Си просто в либах так изначально работает (приписывает бит чтения/записи в зависимости от команды);
- (на сколько я увидел, поправьте если не так) разница между "без буквы" и "А" в принудительных установленных битах А3 и А4.

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

Надеюсь всё понятно теперь или нет?

0

40

Вдруг пригодится...
Вот рабочий исходник термометра и измерителя влажности. Датчик - DHT11. Часть исходника (работа с DHT11) позаимствована с avrproject.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                                                     'возвращаемся в главный цикл программы

0

41

Да это все давно понятно, а вот с библиотеками ничего не понятно, разобраться поможете?

0

42

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

Надеюсь всё понятно теперь или нет?


Да, спасибо большое! Вопрос по адресам снят.

0

43

Игорь - во сколько Вам обошелся LCD?

Отредактировано sasha_1973 (2013-07-25 17:24:29)

0

44

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

Да это все давно понятно, а вот с библиотеками ничего не понятно, разобраться поможете?

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

0

45

Александр, меня можно на "ты". Мне так удобнее.

Индикатор обошелся в $15,55 (примерно 500 руб). Пересылка бесплатная. Шел примерно месяц. Но к нам всегда столько времени товары идут, поскольку я живу на расстоянии двух монтировок по карте от Москвы - север Тюменской области.

Кстати, можно найти и дешевле, но поскольку я у этого продавца покупал набор с Ардуиной, то и LCD у него купил, чтобы все в одной посылке приехало.

Только что посмотрел... В районе 50-60 рублей можно купить вот такую платку для обычного LCD 44780:
http://s4.uploads.ru/t/0rEAk.jpg

0

46

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

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

Железо есть, тестирование не вопрос.

Вывод на LCD через обе библиотеки глючит

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

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

Пробовал 20*2, результат тот же (глючит)

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

Больше всего добивает, что не хочет эмулироваться в "Протеус"!

Си-шный вариант эмулируется, а оба этих варианта не хотят, хотя к индикатору все сигналы приходят.

Если работать с PCF8574 на прямую, без библиотек, все работает.

0

47

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

В районе 50-60 рублей можно купить вот такую платку для обычного LCD 44780

Это где такие цены, если не секрет?

0

48

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

Это где такие цены, если не секрет?

Да я все на Ebay покупаю.
вот, например

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

Вообще, прежде в чем-то копаться, нужно железо под это всё, у меня естественно всего такого нет (не использую).

Если у Вас есть время и желание покопаться с библиотекой, то  я готов передать Вам деньги на покупку индикатора i2c. Сам купить не смогу, поскольку моя карточка в Paypal привязана к моему адресу доставки.

0

49

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

поскольку я живу на расстоянии двух монтировок по карте от Москвы - север Тюменской области.


Смотрел, на карте google. Далековато.

0

50

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

я готов передать Вам деньги на покупку индикатора i2c

Буду учавствовать!

0

51

Вообще в Баскоме проблема с либами под i2c дисплеи (там что-то было, уже ранее писал об этом).

Если глючит вывод (то работает, то нет) - значит проверьте сопли на плате, может адрес отваливается и/или висит в воздухе (там же если правильно на единицу вещать все адреса, то надо по хорошему 3 резистора, я бы впрочем вообще бы по лени своей, всё на землю кинул (и адреса изменил в коде)).

зы: а вообще, давно пора свои подпрограммы просто писать/накапливать БД под разные устройства. Я правда не сторонник функций в Баскоме (подглючивают они), чем проще пишешь - тем надежнее и менее ресурсоемко выходит.

0

52

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

Вот ссылка именно на мой индикатор на Ebay.

хотел пройти по ссылке - не открывается (

0

53

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

значит проверьте сопли на плате, может адрес отваливается и/или висит в воздухе (там же если правильно на единицу вещать все адреса, то надо по хорошему 3 резистора, я бы впрочем вообще бы по лени своей, всё на землю кинул (и адреса изменил в коде

Ошибки на плате исключены (2 разные платки), брак железа тоже (6 разных индикаторов), адресацию перебрал все варианты (PCF8574 и PCF8574A).

И снова таки, на си все работает и эмулируется, а с данными библиотеками не хочет.

Отредактировано sasha_1973 (2013-07-25 18:04:50)

0

54

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

хотел пройти по ссылке - не открывается (

http://www.ebay.com/sch/i.html?_odkw=i2 … p;_sacat=0

у меня открылась (Opera)

0

55

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

хотел пройти по ссылке - не открывается (

Странно. Только что проверил, открылась нормально...

0

56

Мне в Си-шной программе понравилось обращение к библиотеке и инициализация индикатора одновременно:

// 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)

0

57

чудеса:

The connection was reset
     
     The connection to the server was reset while the page was loading.


открыл ручками, без редиректа форума

чот я там примеров библиотек не увил под Баском
кстати, инклудами можно прятать свои подпрограммы в другие модули, весьма удобно и хардкодить с нюансами либов баскома ненадо)

0

58

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

чудеса:

открыл ручками, без редиректа форума

чот я там примеров библиотек не увил под Баском
кстати, инклудами можно прятать свои подпрограммы в другие модули, весьма удобно и хардкодить с нюансами либов баскома ненадо)

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

0

59

спасибо.
можете попробовать точно описать/поймать глюк? когда он появляется?

0

60

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

спасибо.
можете попробовать точно описать/поймать глюк? когда он появляется?


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

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

Пробовал 20*2, результат тот же (глючит)


И больше всего убивает, с этими библиотеками не эмулируется в "Протеус" (только не начинайте, "Протеус" глючный, руки кривые, ноги поменяны местами и т.д).

Си-шный вариант прекрасно эмулируется!
В Bascom, если работать с I2c на прямую, тоже все эмулируется!

Не эмулируется только с этими библиотеками! (к LCD все приходит)

Отредактировано sasha_1973 (2013-07-25 18:43:45)

0


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