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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Расширители портов МК


Расширители портов МК

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

1

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

А Вы про расширители 1-Wire упомянули в своем проекте?

Конечно.
DS2408 - прекрасная альтернатива PCF8574.
Есть DS2413, в 4 раза "скромнее", но иногда и этого достаточно.
Первейший "плюс" - их можно установить в точке "исполнителей", дальнобойность интерфейса позволяет.
Разница в ценнике ощутимая даже у китайцев, но оно этого стоит.

0

2

Наткнулся тут на микросхему HCTL-2032, в Datasheet даже пример на бэйсике привёдён для серии AT90xxx
Вот - http://catalog.gaw.ru/index.php?page=do … mp;id=3162
Это аппаратный квадратурный декодер 32 бита.

+1

3

Откопал в закромах КР580ВВ55А...  :blush:
Расширителями эти м/с можно назвать с бо-о-о-о-ольшой натяжкой, но возможности у них весьма большие...
Пока вспоминаю "их"... ;)
В "спектрумовские" времена очень меня выручали.
Взял как-то 6 шт, осталось 3 (которые нашел)... ;)

UPD.
Колдую в Протеусе и Bascom, вспоминаю эту микруху... ;)
Образуется что-то реальное - выложу.

Отредактировано Nord (2018-05-24 22:25:26)

0

4

Для процессоров имело смысл, но для МК думаю нет, потому что нужно много выводов.

0

5

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

DS2408 - прекрасная альтернатива PCF8574

Может кто осилит дисплей 20х4 через 1-wire интерфейс закодить?
Было бы интересно, т.к. энтот интерфейс метров на 50 реально лупит, да и датчиков можно ещё на шину повесить, например клавиатуру или термодатчики или исполнительные устройства. Все про всё ТРИ провода вместе с питанием! Крутыбл.

0

6

-NMi- написал(а):

Может кто осилит дисплей 20х4 через 1-wire интерфейс закодить?

Идея обалденная !

Тут без "пристёжки" не обойтись будет.
Для I2C есть библиотека, через нее и работают, а 1-Wire шарашит побайтно на софтовом уровне.

Как вариант, запупенить после DS2408 какой-нибудь МК и им обрабатывать прилетевшее.
Я так поступил здесь Часовой интерфейс

Отредактировано Nord (2018-05-25 10:30:01)

0

7

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

а 1-Wire шарашит побайтно на софтовом уровне.

Загляни в LCD_I2C библиотеку, в самый низ, и ты удивишься - PCF то-же "шарашит" побайтно.  :D

0

8

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

запупенить после DS2408 какой-нибудь МК и им обрабатывать прилетевшее

В таком случае DS2408 не нужна. Берём "какойнибудь МК" и обрабатываем "прилетевшее"
Да и третий провод уже не нужен, ДВУМЯ проводами уже можно обойтись... :unsure:  причём с LCD
Прикинь, какая экономия, если на элеваторе стоит 180 датчиков в одной банке??? :D

0

9

-NMi- написал(а):

Загляни в LCD_I2C библиотеку, в самый низ, и ты удивишься - PCF то-же "шарашит" побайтно.

Не удивлюсь, потому что это и так понятно и с этим никто не спорит. ;)

А в плане LCD_I2C, так я про это же и говорю - тут уже описана работа с дисплеем и пользователю не надо заморачиваться, он в программе пользуется обычными операторами, а библиотека все остальное делает.

Для 1-Wire подобной библиотеки нет, я, по крайней мере, не встречал, потому и говорю, что информацию дисплею придется гнать побайтно самостоятельно.

0

10

-NMi- написал(а):

В таком случае DS2408 не нужна. Берём "какойнибудь МК" и обрабатываем "прилетевшее"

Городить софтовый 1-Wire Slave ?
Нет желания...

0

11

Пётр написал(а):

Для процессоров имело смысл, но для МК думаю нет, потому что нужно много выводов.

У Z80 выводов не больше... ;)
Да и при использовании WG12864 или подобных что-то никто не заморачивается... ;)

0

12

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

У Z80 выводов не больше

У него есть шина адреса и данных, к которым подключается КР580ВВ55А. У МК наружу это не выведено.
КР580ВВ55А нужно 8 выводов под шину данных и несколько для управления. Может получится так что для расширителя портов на КР580ВВ55А нужен другой расширитель, потому что у МК нет столько свободных выводов.
Поэтому я написал.

Пётр написал(а):

Для процессоров имело смысл, но для МК думаю нет, потому что нужно много выводов.

0

13

Пётр написал(а):

Может получится так что для расширителя портов на КР580ВВ55А нужен другой расширитель, потому что у МК нет столько свободных выводов.
Поэтому я написал.
Пётр написал(а):Для процессоров имело смысл, но для МК думаю нет, потому что нужно много выводов.

Я же не пытаюсь доказать, что этот монстр прямо-таки панацея... ;)
Да и далеко не у всех он пылится в кладовке... ;)

0

14

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

Городить софтовый 1-Wire Slave ?
Нет желания...

Нет конечно. Мысли "ширше" Зачем тебе 1W вообще нужен, если есть МК в каждом девайсе.
В качестве подсказки вот такой вектор для LCD:123,14,1,1," Hello Bascom "
Что к чему соответственно: <адрес на шине><кол-во байт в сообщении><строка><отступ><что печатаем>

0

15

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

Я же не пытаюсь доказать, что этот монстр прямо-таки панацея

Ну понятно, что есть чипы - есть желание применить. Непонятен в чем весь сыр-бор, собирай, вспоминай и реализуй. Обычным людям - это без надобности. Вообще раньше чипы делали умные люди, для сложных решений, сейчас в большинстве случаев всё упразднилось.

+1

16

-NMi- написал(а):

В качестве подсказки вот такой вектор...

И что я должен делать дальше ? ;)

Бросить все и начать размышлять ?
Мне это (в данный момент) не нужно.
Думаю, в дальнейшем тоже... ;)

Если у вас есть какие-то прикидки для решения вашего предложения - карты в руки !
"Я полезных перспектив - никогда не супротив" (с) Л.Филатов

Отредактировано Nord (2018-05-26 17:35:52)

0

17

-NMi- написал(а):

Может кто осилит дисплей 20х4 через 1-wire интерфейс закодить?

Вот вариант "навскидку"...
Только, чтоб вывести в двух строках слова:
"Transfer"
"Кириллица"...
Творилось на основе опыта работы отсюда Кириллица на китайских OLED дисплеях
После "шлифовки", код, возможно будет более "человечен"...
В "прогоне" нигде не проверял, но и не пойдет из-за незавершенности фрагмента кода передачи на LCD конкретного текста (не заморачивался).
На данном этапе компилятор не ругается, но программа работать не будет...
Да и не заморачивался работоспособностью, честно говоря...
32% в Mega8, только ради вывода "где-то там чего-то улетевшего" ?  :canthearyou:

Вопрос в другом - стоит ли ЭТО того, чтоб не размениваться на "Берём "какойнибудь МК" и обрабатываем "прилетевшее"" ? ;)
Тот же упомянутый "часовой интерфейс" при работе по I2С с модулем на ТМ1637 в Mega48 занимает всего 27%...

Не удивлюсь брыканиям в стиле "кто так кодит"... ;)
Как могу, так и "шкодю"... ;)

Код:
$Regfile="m8def.dat"
$Crystal=4000000
$hwstack=16
$swstack=16
$framesize=32


Dim sostwr As Byte
Dim sostwrh As Byte
Dim sostwrl As Byte
Dim sostrd As Byte
Dim sostinv As Byte
Dim sosttst As Byte
Dim cnt As Byte
Dim col As Byte
Dim conf As Byte
Dim row As Byte
Dim pozlcd As Byte
Dim a As Byte
'Dim stroka As String * 40

'=========================================================================
'                                Константы для дисплейных команд
Const clrlcd = &B00000100
'conf = &H00010100
'=========================================================================
'                        Подключение дисплея к DS2408
'LCD.0                        ' RS             0 - команда/ 1 - данные
'LCD.1                        ' RW            1 - чтение из дисплея/ 0 - запись в дисплей
'LCD.2                        ' E                1 - подготовка/ 1->0 передача
'LCD.3                        '
'LCD.4                        ' DB4
'LCD.5                        ' DB5
'LCD.6                        ' DB6
'LCD.7                        ' DB7
' Пример для МК:
'Config Lcdpin = Pin , Db4 = PortD.4 , Db5 = PortD.5 , Db6 = PortD.6 , Db7 = PortD.7 , E = PortD.2 , Rs = PortD.0 , Rw = PortD.1
'                        Байт конфигурации
'conf.0                        ' 1 - включить курсор "_"
'conf.1                        ' 1 - включить курсор " "
'conf.2                        ' 1 - две строки
'conf.3                        ' 1 - четыре строки
'conf.4                        ' 0 - менее 16 символов, 1 - 16 и более символов
'conf.5                        ' 0 - 20 символов, 1 - 40 символов
'conf.6                        '
'conf.7                        '
' Например:
'Config Lcd = 16 * 2
'Cursor Off
'=========================================================================
'                                Формируем массив для нужной длины строки
Dim stroka(40) As Byte

Dim transfer As String * 40
'=========================================================================
'                                    ИНИЦИАЛИЗАЦИЯ  И  НАСТРОЙКА  ДИСПЛЕЯ
'=========================================================================
'                                                Ждем готовности дисплея
busyflag:
sostwr = &B00000110
sostinv = Not sostwr
1wreset PINB, 0                                 ' Сброс по шине
1wwrite &HCC, 1, PINB, 0                        ' Команда Skip ROM
1wwrite &H5A, 1, PINB, 0
1wwrite sostwr, 1, PINB, 0
1wwrite sostinv, 1, PINB, 0
1wreset PINB, 0                                ' Сброс по шине
Gosub delay10                                ' задержка
sostwr = &B00000010
sostinv = Not sostwr
1wreset PINB, 0                                ' Сброс по шине
1wwrite &HCC, 1, PINB, 0                        ' Команда Skip ROM
1wwrite &H5A, 1, PINB, 0
1wwrite sostwr, 1, PINB, 0
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)                        ' Считываем ответ от чипа
a = sostrd                                ' Нас интересует сейчас только первый байт
sostrd = 1wread(1, PINB, 0)
1wreset PINB, 0                                ' Сброс по шине
IF a.7 = 1 THEN GOTO busyflag

'=========================================================================
'                                                Инициализация дисплея
sostwr = &B00000100
sostinv = Not sostwr
1wreset PINB, 0                                 ' Сброс по шине
1wwrite &HCC, 1, PINB, 0                        ' Команда Skip ROM
1wwrite &H5A, 1, PINB, 0
1wwrite sostwr, 1, PINB, 0
1wwrite sostinv, 1, PINB, 0
1wreset PINB, 0                                 ' Сброс по шине
Gosub delay10                                ' задержка
'--------------------------------------------------------------------------------------------------------------------------------------
'                                                Команда установок дисплея
'                                                Передача старшей тетрады команды
sostwr = &B00100100
sostinv = Not sostwr
1wreset PINB, 0                                 ' Сброс по шине
1wwrite &HCC, 1, PINB, 0                        ' Команда Skip ROM
1wwrite &H5A, 1, PINB, 0
1wwrite sostwr, 1, PINB, 0                        ' Старшая тетрада команды дисплея
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
sostwr = sostrd
sostwr.2 = 0
sostinv = Not sostwr
1wwrite sostwr, 1, PINB, 0                        ' E=0 - передача в дисплей
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
1wreset PINB, 0                                 ' Сброс по шине
Gosub delay10                                ' задержка
'                                                Повтор передачи старшей тетрады команды
sostwr = &B00100100
sostinv = Not sostwr
1wreset PINB, 0                                 ' Сброс по шине
1wwrite &HCC, 1, PINB, 0                        ' Команда Skip ROM
1wwrite &H5A, 1, PINB, 0
1wwrite sostwr, 1, PINB, 0                        ' Старшая тетрада команды дисплея
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
sostwr = sostrd
sostwr.2 = 0
sostinv = Not sostwr
1wwrite sostwr, 1, PINB, 0                        ' E=0 - передача в дисплей
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
1wreset PINB, 0                                 ' Сброс по шине
Gosub delay10                                ' задержка
'                                                Передача младшей тетрады команды
sostwr = &B10000100
sostinv = Not sostwr
1wreset PINB, 0                                 ' Сброс по шине
1wwrite &HCC, 1, PINB, 0                        ' Команда Skip ROM
1wwrite &H5A, 1, PINB, 0
1wwrite sostwr, 1, PINB, 0                        ' Младшая тетрада команды дисплея
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
sostwr = sostrd
sostwr.2 = 0
sostinv = Not sostwr
1wwrite sostwr, 1, PINB, 0                        ' E=0 - передача в дисплей
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
1wreset PINB, 0                                 ' Сброс по шине
Gosub delay10                                ' задержка
'--------------------------------------------------------------------------------------------------------------------------------------
'                                                Команда очистки дисплея
sostwr = clrlcd
Gosub form_com
Gosub com_lcd
'========================================================================
Do

row = 1
col = 1
Gosub 1wlocate
sostwr = pozlcd
Gosub form_com
Gosub com_lcd

transfer = "Transfer"                                ' Передача строки в указанную позицию
transfer = Trim(transfer)
Gosub 1wtext
Gosub 1wsend

Wait 2

row = 2
col = 1
Gosub 1wlocate
sostwr = pozlcd
Gosub form_com
Gosub com_lcd

transfer = "Kёpё""ёеa"
transfer = Trim(transfer)
Gosub 1wtext
Gosub 1wsend

Wait 2

sostwr = clrlcd                                        ' Очистка экрана
Gosub form_com
Gosub com_lcd

Loop
End
'=========================================================================
'                                                Определение позиции вывода
1wlocate:
If row = 1 Then pozlcd = &H00
If row = 2 Then pozlcd = &H40
If row = 3 Then pozlcd = &H14
If row = 4 Then pozlcd = &H54
a = col - 1
pozlcd = pozlcd + a
pozlcd.7 = 1
Return
'=========================================================================
'                                                Подготовка данных для отправки
1wtext:
cnt = Len(transfer)
For a = 1 To cnt
        stroka(a) = Asc(transfer)
Next a
Return
'=========================================================================
'                                                Отправка данных на DS2408
1wsend:
1wreset PINB, 0
1wwrite &HCC, 1, PINB, 0
1wwrite &H5A, 1, PINB, 0
For a = 1 To cnt
sostwr = stroka(a)
sostinv = Not sostwr
1wwrite sostwr, 1, PINB, 0
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
Next a
1wreset PINB, 0
Return
'=========================================================================
'                                                Подготовка байтов команды
form_com:
sostwrh = 0
sostwrl = 0
sostwrh.7 = sostwr.7
sostwrh.6 = sostwr.6
sostwrh.5 = sostwr.5
sostwrh.4 = sostwr.4
sostwrh.3 = 0
sostwrh.2 = 1
sostwrh.1 = 0
sostwrh.0 = 0

sostwrl.7 = sostwr.3
sostwrl.6 = sostwr.2
sostwrl.5 = sostwr.1
sostwrl.4 = sostwr.0
sostwrl.3 = 0
sostwrl.2 = 1
sostwrl.1 = 0
sostwrl.0 = 0
Return
'=========================================================================
'                                                Передача команды на дисплей
com_lcd:
'                                                Передача старшей тетрады команды
sostwr = sostwrh
sostinv = Not sostwr
1wreset PINB, 0                                 ' Сброс по шине
1wwrite &HCC, 1, PINB, 0                        ' Команда Skip ROM
1wwrite &H5A, 1, PINB, 0
1wwrite sostwr, 1, PINB, 0                        ' Старшая тетрада команды дисплея
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
sostwr = sostrd
sostwr.2 = 0
sostinv = Not sostwr
1wwrite sostwr, 1, PINB, 0                        ' E=0 - передача в дисплей
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
1wreset PINB, 0                                 ' Сброс по шине
Gosub delay10                                ' задержка
'                                                Передача младшей тетрады команды
sostwr = sostwrl
sostinv = Not sostwr
1wreset PINB, 0                                 ' Сброс по шине
1wwrite &HCC, 1, PINB, 0                        ' Команда Skip ROM
1wwrite &H5A, 1, PINB, 0
1wwrite sostwr, 1, PINB, 0                        ' Младшая тетрада команды дисплея
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
sostwr = sostrd
sostwr.2 = 0
sostinv = Not sostwr
1wwrite sostwr, 1, PINB, 0                        ' E=0 - передача в дисплей
1wwrite sostinv, 1, PINB, 0
sostrd = 1wread(1, PINB, 0)
sostrd = 1wread(1, PINB, 0)
1wreset PINB, 0                                 ' Сброс по шине
Return
'=========================================================================
delay10:                                ' п/п задержки
LDI R18, 10                                ' в регистр R18 значение SPEED
delay14loop:
DEC R18                                ' уменьшение на 1 содержимого R18
BRNE delay14loop                        ' переход, пока флаг Z не будет равен 0
ret                                        ' выход из п/п задержки после выполнения ~10 тактов
'=========================================================================

Отредактировано Nord (2018-05-26 22:05:34)

0

18

Ну... можешь же, если захочешь  :blush:
Тока я главного не вижу, где процедура инициализации дисплея и перевод его на 4-х байтовый режим и прочие прелести. Он, дисплей, без первоначальной инициализации работать не будет, проверено лично мной.
А так, да, на ассемблере некоторые вещи (процедуры) причесать и будет красиво  :music:

0

19

-NMi- написал(а):

Тока я главного не вижу, где процедура инициализации дисплея и перевод его на 4-х байтовый режим и прочие прелести.

Куда смотрим ..? ;)
От метки busyflag и до цикла "Do .... Loop".
Перевод в 4-битный режим, а из "прелестей" только очистка экрана.
Для данного примера большего не нужно...

Отредактировано Nord (2018-05-27 11:16:34)

0

20

И работает, и без глюков??
----------
Вот процедура инициализации 4-х битного режима прямо из "букваря" от дисплея. Ноги дисплея, младший ниббл убран:
Биты D7-D4 в бинарном представлении:
0011
0011
0011
0011
1000
1000
0001
0110
Это команды для дисплея а не данные.
Нога Е стробирующая пропущена для простоты понимания.
Лично у меня только после этих команд дисплей начал работать правильно.  :P

0

21

-NMi- написал(а):

И работает, и без глюков??

Ну написано же все в #17, откуда и что взято для последующего "перевода" под 1-Wire, работает или нет !
Наискосок читаем или через абзац ? :canthearyou:
Четко же дал понять, что приведенный код - чисто для демонстрации монструозности...

Отредактировано Nord (2018-05-27 19:02:37)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Расширители портов МК