Страница 26 из 53
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Чт ноя 12, 2015 17:34:06
BOB51
Вообще-то макросы принято отдельным файлом в начале исходника размещать...

Да... вот еще неплохая статья по работе с ассемблером (правда под ПИКи - но правила применимы и к другим семействам) от Виктора Тимофеева:
http://www.pic24.ru/doku.php/osa/articl ... formatting
в частности
http://www.pic24.ru/lib/exe/fetch.php/o ... atting.pdf

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Чт ноя 12, 2015 19:54:26
Пока_без_кота
Спасибо, очень познавательный ресурс, накопировал себе оттуда кучу статей. Вообще стал за собой замечать "синдром плюшкина", где что нахожу интересное по программированию МК, тяну в спец папку. Уже 4 Гб книжек и образцов кода насобирал. Читать не успеваю, в сутках времени не хватает((
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Чт ноя 19, 2015 21:18:00
Пока_без_кота
Доброго времени суток. Чтобы лучше понять работу шины I2C, решил попробовать сам нацарапать простейшую ее реализацию. После чтения апноутов заметил, что байты передаются старшими битами вперед (через rlc). Это приниципиально, или просто исторически сложилось, и реальной роли не играет ? Понимаю, что вопрос не имеет прямого отношения к MCS-51, просто раз буду писать под него, решил спросить здесь.
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Чт ноя 19, 2015 21:30:01
Ser60
Если будете разрабатывать связь между своими устройствами, то передавайте как хотите. Однако, подавляющее большинство сенсоров и других промышленные изделий посылают данные и ожидают команды старшим битом вперед в соответствии со стандартом, т.е. под них следует подстроиться.
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Пт ноя 20, 2015 19:09:14
Пока_без_кота
Спасибо, учту. Теперь такой вопрос. Спецификация шины I²C разрешает изменения на линии SDA только при НИЗКОМ уровне сигнала на линии SCL (исключая старт- и стоп-последовательности). Открываю апноуту Интела и вижу:
Спойлер
Код: Выделить всё
Send_byte: ; Send 1 bytes of informarion located in Accumulator
mov Bit_CNT,#8 ; Set bit count value
SB_Loop:
rlc A ; Send 1 data bit
mov SDA_pin,C ; Put data bit on pin
Release_SCL_High ; Drive SCL HIGH
Delay_3_Cycles ; Delay
clr SCL_pin ; Clear SCL
Delay_3_Cycles ; Delay
djnz Bit_CNT,SB_Loop ; Repeat until all bits sent
setb SDA_pin ; Release data line for acknowledge
Release_SCL_High ; Send clock for acknowledge
Delay_4_Cycles ; Delay
jnb SDA_pin,SB_ex ; Check for valid acknowledge bit
setb No_ACK ; Set status for no acknowledge
SB_ex:
clr SCL_pin ; Finish acknowledge bit
Delay_3_Cycles ; Delay
ret
Эта подпрограмма предполагает, что до ее вызова SCL будет опущена. Может лучше в самой подпрограмме предварительно (перед rlc A) опускать SCL, чтобы наверняка ?
И второе, при неподтверждении передатчиком принятия байта там просто выставляется флаг ошибки, и выполняется выход из подпрограммы. Не лучше ли было еще хотя бы раз или 2 (по счетчику) попытатся передать байт повторно, и только тогда, уже с чистой совестью валить из подпрограммы с флагом "Ахтунг, не принялось!!!" ? Чем мой вариант хуже ?
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Пт ноя 20, 2015 22:17:48
Ser60
Первое: можете и опустить, однако не во всех случаях это гарантирует отсутствие ошибки если перед передачей забыли сформировать сигнал START. Поскольку, если он не сформирован, то интерфейс регламентирует определенную задержку после START до первого фронта на линии SCL. И если она будет меньше чем нужно при быстром процессоре, то устройство на другом конце может не понять. Обычно, задержка эта мала и если проц не шибко шустрый то сработает. Можно, конечно, задержку поставить. Для "быдлопрограмм", как здесь говорят, сойдет. Однако, стремитесь задействовать аппаратные драйверы по возможности. Или если таковой нет, то формировать запросы правильно. Это исключит надобность в "а что если" случаях.
Второе: Если произошла ошибка чтения и ведомое устройство получило NAK, то оно обычно прекращает передачу до появления на линии сигналов STOP и START/RESTART, и Вы это изменить не можете. Поэтому без этого попытку передать байт ещё раз не воспримет. Если-же программируете master и slave девайсы сами, можете и отступить от стандарта. Кроме того, многие устройства автоматически инкрементируют адрес в собственной памяти данных и при попытке повторной передачи байта не могут его декрементировать. Короче, зачем Вам изобретать что-то нестандартное? На стандарты следует реагировать словами типа "ja wohl" и стиснув зубы следовать им, даже если они Вам не нравятся. Поверьте, люди думали много прежде чем их выработать и даже если еони пошли на какие-то компромиссы, то в большинстве случаев они имеют смысл и работают на Ваше-же благо.
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Сб ноя 21, 2015 09:33:18
BOB51
I2C исходно рождена Philips Semiconductors (ныне NXP) посему они и являются законодателями в данной области.
Простейшая шпора для "самопалки" с одним - парой ведомых на шине:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Сб дек 12, 2015 19:47:02
paskal
Вопрос как имитировать внешнюю память в keil.
Очень понадобилось вспомнить старый проект. Проект на отечественном аналоге 8051, на ассемблере. Схема самого устройства на рассыпной логике серии 1533, а МК взаимодействует с внешней периферией как с регистрами с 8-битным адресом. То есть командами типа "movx @r0,a". Проект я перевел в keil, но отлаживаться без имитации регистров совершенно невозможно!
Поэтому вопрос как мне эту память сымитировать.
Имитацию памяти по 16-разрядному адресу (через movx @dptr), я нашел. В отладке View->Memory Windows, далее в окошке с адресом ввести x:0. А как делать то же с памятью по movx a,@r0?
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Сб дек 12, 2015 20:44:17
ARV
почему-то мне кажется, то PROTEUS ISIS отлично сможет имитировать любую периферию классического варианта 51-го семейства
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Сб дек 12, 2015 21:21:12
paskal
Я уже провел огромную работу чтобы завести эту схему в Протеус. Работает жутко медленно. Из-за сложной периферии наверно. Но даже не в этом дело. Мне нужно дебажить проект написанный в кейле. А протеус только запускать скомпилированный hex файл позволит, imho.
И еще что существенно, Протеус не все корректно имитирует. В частности в этом проекте он неправильно читает флеш.
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Сб дек 12, 2015 21:57:10
BOB51
paskal писал(а):Вопрос как имитировать внешнюю память в keil.
...
Правильно указать размещение данных в исходнике проекта и параметры применяемого МК в инклуде, прилагаемом изготовителем компилятора (может и без оного - описание читать надо).
У меня не Кейл, а атмелевский с51аsm, но по синтаксису подобен.
Данные оперативки внутрикристальной dseg (data)
внешнее ОЗУ данных - xseg (xdata)
таблицы в области code или xdata
ну и так далее ( косвенноадресуемое внутреннее ОЗУ, расширенная ОЗУ, флеш еепромка и битовая область) - рекомендую перечитать юзерс гвиде по кейлу для конкретных решений.
Пы.Сы.
Для симуляции подобного проекта и старой доброй DOSовской fd51 достаточно.

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Сб дек 12, 2015 23:16:56
paskal
xseg адресуется через @dptr, и я нашел как его смотреть/редактировать в отладчике. А как @r0 смотреть? В документации уже искал.
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Вс дек 13, 2015 09:17:34
Rtmip
Согласен с
ARV и
BOB51.
paskal писал(а):...А как @r0 смотреть? В документации уже искал.
Точно так же смотреть, посмотрите внимательней на документацию 51-х
Скорее всего у вас порт P2 в "FF" или там что-то отличное от нуля
Просто, допишите в программу такие строчки и все увидите в симуляции "Keil":
Код: Выделить всё
MOV R0, A ;адрес младшего байта
MOV P2, #0 ;обнулить старший байт адреса
MOVX @R0, A ;запись во внешнее ОЗУ
....
MOV R0, A ;адрес младшего байта
MOV P2, #0 ;обнулить старший байт адреса
MOVX A, @R0 ;чтение внешнего ОЗУ
....
Надеюсь, понятно объяснил?

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Вс дек 13, 2015 10:52:40
musor
ктонить в курссе как так работают эти весы там совместимый 51МК и тензомос и 2 плат многоразрядных(15р=сгрупированы из 3х 5разрядов клякса общая ) 7 сегментны с встоеным контром каплей и шиной из 7 проводков на индюки в момент самотеста выдает сначала все 8 потом 1234567890ABCDFпотом напряг батареи потом 0 веса и уставки цен....
хотелось б понять можно ли из всего этого хлама сделать Шкалу цифровую для БП ибо лежит платы без дела
хорощоб чтоб щина к индюку не менялась(там 2 авболютно одинаковых плат индюка(одна для продавана втораядля вас) но на одном еще паян светик на заряд АКБ-платы на шлейф сидят впаралели
мож у кого исходники этих весов есть-посмотреть как там написан вывод на индюки

или готовую переделку платы весов под БП тоже можно
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Вс дек 13, 2015 11:01:26
ARV
Впервые слышу, что протеус работает жутко медленно.
Если периферия у вас цифровая, то крайне рекомендую все резисторы так же сделать цифровыми. Лишние конденсаторы из схемы исключить. И вообще, по максимуму отказаться от аналоговых компонентов. Если периферия аналоговая, то, конечно, советовать сложно, но для отладки программы вполне можно заменить какой-то сложный усилитель сигнала на генератор сигнала уже нужной амплитуды, а в некоторых случаях вообще обойтись переменным резистором. И так далее: вместо моделирования правильной схемы для отладки программы достаточно имитировать сигналы. Не нужно фанатично создавать 100% полную схему в протеусе.
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Вс дек 13, 2015 12:17:56
paskal
Rtmip писал(а):
Скорее всего у вас порт P2 в "FF" или там что-то отличное от нуля
Надеюсь, понятно объяснил?

Точно! Во вкладку Memory в окошко адреса вбил x:0xFF00 и увидел циферки которые можно ввести.
Не догадался я что старшие 8 бит в единицах!
ARV писал(а):Впервые слышу, что протеус работает жутко медленно.
Если периферия у вас цифровая, то крайне рекомендую все резисторы так же сделать цифровыми. Лишние конденсаторы из схемы исключить.
Схема вся цифровая. Но она большая. Правда резисторы на подтяжку я и правда аналоговые замутил, надо будет поменять.
И еще там 7-сегментные индикаторы, может они влияют?
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Пт дек 18, 2015 21:57:37
Пока_без_кота
Доброго времени суток. Прошу помощи по доведению до ума работы с дисплеем HD44780 как с внешней памятью. Значит написал я так, чтобы обращаться к дисплею через косвенную адресацию регистром R0, потому что как выяснилось, при использовании DPTR 6 линий потеряется. Так что что линии RS и R/W я дергаю вручную, Е дергается автоматически через 74НС04. И оно не работает, дисплей показывает 1 черную строку. Порядок инициализации взят из даташита на мой дисплей

Главный цикл
Спойлер
Код: Выделить всё
WriteData_copy equ 3h ; R3
dseg at 7h ; Первые 8 регистров под свои нужды
Stack: ; А дальше пойдет стек
cseg at 0
jmp Main
include 'LCD_on_P0.asm'
Main:
mov SP,#Stack ; Инициализируем стек
call Ini_LCD ; Инициализация LCD
mov WriteData_copy,#41h ; Запишем в видеобуффер код выводимого символа
call Write_LCD_Data ; И выведем его на дисплей
jmp $ ; Зациклимся
end
Файл библиотеки HD44780 - 'LCD_on_P0.asm'
Спойлер
Код: Выделить всё
BF_Flag equ ACC.7
RS equ P3.5
RW equ P3.4
;E equ P3.6(WR) и 3.7(RD) через 74НС04, взводится автоматически, при выполнении команды работы с внешней памятью
LCD_Port equ P0
WriteData equ 3h ; R3
; Не использовать для своих целей R0,R1,R2 они используются для формирования задержек
; Флаг занятости BF, пока 1 - LCD занят, когда 0 - LCD свободен, можно слать команды
cseg
Ini_LCD: ; Инициализация LCD
call Del_30ms ; Стартовая задержка на 30 мс по даташиту
mov LCD_Port,#00111100b ; DL=1, N=1, F=1
call Write_LCD_Ini ; Запись инициализирующей команды
call Del_39mks ; Задержка на 39 мкс по даташиту
mov LCD_Port,#00001100b ; D=1, C=0, B=0
call Write_LCD_Ini ; Запись инициализирующей команды
call Del_39mks ; Задержка на 39 мкс по даташиту
mov LCD_Port,#00000001b ; Очистим дисплей
call Write_LCD_Ini ; Запись инициализирующей команды
call Del_1_53ms ; Задержка на 1,53 мс по даташиту
mov LCD_Port,#00000110b ; I/D=1, SH=0
call Write_LCD_Ini ; Запись инициализирующей команды
ret
Write_LCD_Data: ; Запись данных из ACC в дисплей
clr RS ; Подаем команды, поетому опускаем RS
setb RW ; Будем читать флаг BF, поетому поднимаем RW
push ACC
Wait_Write_Data:
movx A,@R0 ; Считываем состояние линий в аккумулятор, при этом дергаем Е дисплея пином Р3.7 (RD) через 74НС04
jb BF_Flag,Wait_Write_Data ; И проверяем флаг BF
clr RW ; Проверили флаг BF, можно опустить RW
setb RS ; Передаем данные, поетому поднимаем RS
mov A,#WriteData
movx @R0,A ; Собственно запись данных, при этом дергаем Е дисплея пином Р3.6 (WR) через 74НС04
pop ACC
ret
Write_LCD_Comm: ; Запись команды из ACC в дисплей
clr RS ; Подаем команды, поетому опускаем RS
setb RW ; Будем читать флаг BF, поетому поднимаем RW
push ACC
Wait_Write_Comm:
movx A,@R0 ; Считываем состояние линий в аккумулятор, при этом дергаем Е дисплея пином Р3.7 (RD) через 74НС04
jb BF_Flag,Wait_Write_Comm ; И проверяем флаг BF
clr RW ; Проверили флаг BF, можно опустить RW
mov A,#WriteData
movx @R0,A ; Собственно запись команды, при этом дергаем Е дисплея пином Р3.6 (WR) через 74НС04
pop ACC
ret
Write_LCD_Ini: ; Запись инициализируещих команд в дисплей, здесь не анализируется флаг BF
clr RS ; Подаем команды, поетому опускаем RS
clr RW ; Чтения флага BF не будет, поетому опускаем RW
push ACC
mov A,#LCD_Port ; Закинем иницализирующую команду в А
movx @R0,A ; Собственно запись команды, при этом дергаем Е дисплея пином Р3.6 (WR) через 74НС04
pop ACC
setb RS ; Поднимем назад RS
setb RW ; Поднимем назад RW
ret
Del_30ms:
mov R2, #2h
mov R1, #8Dh
mov R0, #33h
djnz R0, $
djnz R1, $-4
djnz R2, $-8
mov R0, #32h
djnz R0, $
ret
Del_1_53ms:
mov R1, #6h
mov R0, #7Fh
djnz R0, $
djnz R1, $-4
ret
Del_39mks:
mov R0,#20
djnz R0,$
ret
end
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Сб дек 19, 2015 08:44:16
Rtmip
Пока_без_кота, здравствуйте!
Думаю это опечатка: 74HC04, ведь это 6 инверторов. 74HC00 - это вы имели ввиду, похоже.
По программе. Когда вы пишите так:
Код: Выделить всё
....mov A,#WriteData....
... mov A,#LCD_Port ; Закинем иницализирующую команду в А....
, то на самом деле вы в аккумулятор загружаете не данные, которые бы хотели там видеть, а адреса!
То есть, 03h и 80h, соответственно. Напишите так:
и все заработает с 74HC00

Правда, в некоторых ДШ утверждают, что линии данных надо переводить в Z состояние после чтения дисплея, иначе конфликт на линиях.
Протеус согласен с этим. В случае с портом Р0, не помню надо это или нет, посмотрите сами внимательнее.
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Сб дек 19, 2015 09:20:06
Пока_без_кота
Rtmip писал(а): Думаю это опечатка: 74HC04, ведь это 6 инверторов. 74HC00 - это вы имели ввиду, похоже...
Доброе утро, уважаемый.
Нет, я использовал 74НС04 сознательно. У меня WR и RD подключены каждый через свой инвертирующий буфер на вход Е дисплея. Просто оставшиеся 4 буфера я хочу использовать для инвертирования сигналов с разнообразных датчиков, так как у них в основном активный высокий логический уровень, а внешние прерывания у MCS-51 только по спаду (или просто низкому уровню). А вот с # я как всегда налажал)) Спасибо за подсказку.
И вообще, я удалил 1 сущность, заменив mov A, LCD_Port на уже существующую mov A, WriteData. Ведь действительно, за счет чего там будет устанавливаться высокий логический уровень, если подтягивающих резисторов нет)) Что-то отличное от 0 мы можем выдать туда только с помощью команд работы с внешней памятью.
Но оно все равно не взлетело, я где-то еще ошибся.
Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..
Добавлено: Вс дек 20, 2015 08:25:24
Rtmip
Доброе утро!
Пока_без_кота писал(а):Но оно все равно не взлетело, я где-то еще ошибся.
Было бы очень удивительно, если бы "оно" заработало!
Давайте разберемся в чем тут дело. По программе, нет вопросов, если учесть мои замечания, которые были ранее. Программа рабочая.
Пока_без_кота писал(а):Нет, я использовал 74НС04 сознательно. У меня WR и RD подключены каждый через свой инвертирующий буфер на вход Е дисплея.
А вот это никуда не годится! Я же уже отмечал эту ошибку. У вас сейчас там
выходы ваших инверторов соединены
вместе и подключены на "Е" дисплея.
В результате конфликт уровней! Пока на одном выходе лог. 0, на другом возникает лог. 1 при чтении или записи дисплея.
Если не хотите использовать дополнительный элемент И-НЕ, то уберите один из инверторов вообще. Выход оставшегося как и был к "Е" дисплея.
А выводы МК "WR" и "RD" подключите
через диоды к входу оставшегося инвертора. Катоды к МК, аноды к инвертору.
Вход ивертора через резистор 7-15 кОм к плюсу питания (подтяжка). Получится элемент И-НЕ
Пока_без_кота писал(а):Ведь действительно, за счет чего там будет устанавливаться высокий логический уровень, если подтягивающих резисторов нет))
А вот действительно, за счет чего? Думаю - подтягивающие резисторы нужны. Поэтому, меняйте схему подключения и все "взлетит"
По поводу программы, если надумаете ее модернизировать, то я бы посоветовал это сделать так:
в основном цикле работать с дисплеем (как сейчас), по прерываниям, таймерам, вызывать подпрограммы обработки датчиков и прочее.
В них сохранять и восстанавливать аккумулятор, а вот при работе с дисплеем можно уже не делать этого, просто закинули в аккумулятор данные,
затем вызвали подпрограмму вывода на дисплей и не волнуемся, что содержимое аккумулятора изменится. Ну это уже на вкус и цвет...
