Страница 265 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб дек 19, 2015 22:56:06
Jack_A
Ну почти убедили. Я в своих железках, разошедшихся в сотнях экземпляров в самые-самые промышленные условия, выводил инфу по классике : появилась - скинул. Жалоб не было. А от помех может не только ЖКИ слететь, но и функционал прибора пострадать. Не получится так: больному хорошо под наркозом, а что унутре - вскрытие покажет

?
Впрочем, это отвлечение в сторону.
Насчет : опрос флага увеличит время... При выводе - да. А в паузах при стабильной инф. время уходит только на опрос флага. В целом в среднем - должно быть короче.
Жаль, что я уже не практикую, попробовал бы; интересный вариант.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 10:07:04
Demiurg
Jack_A писал(а):...
Пример использования такого способа работы с дисплеем. На видео VFD, но это полный функциональный аналог ЖКИ.
Лень заново писать, скопировал с другого форума:
концепция:
Смотрим в сторону ПЛК. Есть модуль процессора, панель оператора, расширение ввода-вывода. Эти блоки абсолютно самостоятельны. В модуле процессора крутится только программа цикла работы оборудования. Панель оператора вообще модуль с собственной операционной системой. Для панели оператора создается свой проект. И для вывода информации панель операторы опрашивает модуль процессора, тот выдает нужные данные. Набор данных зависит от состояния, в котором находится программа панели оператора. Скажем исходный режим - отображение одной информации, при входе в параметры отображается другая информация.
Именно такой подход я использую в последнее время в своих проектах. Только модули программные. Модуль аппаратной части дисплея. Модуль вывода информации. Модуль управления устройством, для которого текущий проект и создается. И этот подход полностью себя оправдал. Все модули абсолютно самостоятельны. Нет взаимосвязей. Легко отлаживать и проекты создаются в разы быстрее.
Если вы собираетесь использовать графический дисплей, тем более для станка, то для дисплея вам нужно создать отдельный проект, который будет получать значения переменных, рабочие данные. И в зависимости от состояния показывать нужную информацию. То есть, делать что-то вроде панели оператора.
Плюсы - проекты гораздо легче создавать и отлаживать. Разгружается "модуль процессора". Он теперь занят только циклом работы оборудования.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 10:25:53
dr.doc
Александр Писанец (у него канал на youtube) решил проблему помех с дисплеем след. образом: с некоторой периодичностью считывается информация из дисплея и сравнивается с той, что ему передали из буфера. При не совпадении - повторная инициализация (своего рода watchdog timer).
Как показывает практика, на дисплее остается часть кракозябр. Поэтому нужно либо очищать его (примерно 4,1 мС) либо инициализировать его, не дожидаясь установления питания (около 6 мС).
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 10:30:04
Demiurg
dr.doc писал(а):...
У меня дисплей работает без опроса флага и только на прием данных. Каждый полный цикл обновления переинициализация дисплея. То есть каждые 20*4+4 адреса строк = 84 мс. Но! VFD дисплей работает быстро, у него вообще нет задержек.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 10:40:51
dr.doc
Вы когда нибудь помехи хорошие ловили? У меня была ситуация со стабилизатором сетевого напряжения, когда watchdog сбрасывался несколько раз перед тем как сработать. Выявлялось так: динамическая индикация на семисегментник в прерываниях по 250 мкС. Собака настроена на 30 мС (примерно). Период сетевого напряжения (отсчеты АЦП) "вдвигаются" в буфер. Происходит расчет текущего значения, а потом выносится решение о переключении выходов реле и обновление выводимого значения на индикатор. Watchdog сбрасывается только после обновления выводимого на семисегментник значения, т.е. примерно через 22 мС.
От помех "завис" контроллер - горела только одна цифра. И продолжительность ее свечения составляла примерно одну секунду. Собаку проверял специально отдельным участком кода при помощи осциллографа и "иголки" на выводе контроллера. Думаю, что 44780 в этих условиях просто потух бы...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 10:45:44
Demiurg
Я хорошие помехи словил один раз, еще на заре своей практики. МК сбрасывался при включении электромагнитных клапанов на 220 V. Сделал из этого выводы, и больше никогда "не ловил помех".
Борьба с помехами - комплексная. Развивать эту тему не буду. Некогда. Методы борьбы с помехами подробно описаны в различных источниках.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 10:56:33
dr.doc
Суть не в борьбе с ними, а в том, что постоянное обновление дисплея иногда даже вредно, т.к. не всегда понятно, от чего происходит та или иная нештатная ситуация. А дисплей - этакий индикатор. Просто нужно решить для себя, что важнее: устойчивая работа узла или стабильный вывод показаний. Я, например, столкнувшись раз с подобным, сделал для себя след.: раз в 0,5-1 сек. (если не требуется чаще) читаю дисплей, сравниваю с буфером, после этого либо сразу пишу новые данные, либо иду на инициализацию, а потом пишу данные.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 11:03:25
Demiurg
Попробуйте сделать простой опыт. Соберите макетку с минимумом. МК, кварц, дисплей. Забейте все знакоместа чем-нибудь. И оставьте все дело включенным на длительное время (несколько суток). Ессно, БП должен быть с хорошим качеством питания. И я вам гарантирую, через некоторое время работы на дисплее будут кракозябры. Кстати, дисплей можно не забивать данными. Достаточно проинициализировать его.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 15:07:50
Shark-vc
Demiurg писал(а):Shark-vc писал(а):...
У тебя либо инициализация хромает, либо аппаратная часть (непропай, замыкание, обрыв). Возможно просто нужно подкрутить контростность.
Я даю тебе архив с рабочей либой для ЖКИ. У меня 20х4, 4-битный интерфейс. Работает либа так: раз в 1 мс, посимвольно отправляется содержимое буфера на дисплей. В программе работаем с буфером. Но можно работать и напрямую с дисплеем. Разбирайся сам. Отвечу только на уточняющие вопросы.
вы в чем писали? я не могу открыть проект. Я например работал в протеусе 8.1.
Есть еще люди которые знают и могут помочь с ЖКИ lm016l на АТмеле 8535 , на ассемблере?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 15:15:47
dr.doc
Четырехбитное - делал. Исходник для ATtiny2313, но принципиальной разницы нет. Код под Atmel Studio.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 15:16:42
Demiurg
Shark-vc писал(а):...
AVR-Studio 4.19
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 15:46:01
OKF
Demiurg писал(а):Попробуйте сделать простой опыт. Соберите макетку с минимумом. МК, кварц, дисплей. Забейте все знакоместа чем-нибудь. И оставьте все дело включенным на длительное время (несколько суток). Ессно, БП должен быть с хорошим качеством питания. И я вам гарантирую, через некоторое время работы на дисплее будут кракозябры. Кстати, дисплей можно не забивать данными. Достаточно проинициализировать его.
О)) Супер! От альфа частиц штоле? Однако... И как только тогда всё ВООБШЕ работает!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 15:50:21
dr.doc
Вполне возможно что и от них... Только речь шла про частоту обновления дисплея и возможность ее порчи за длительное время. Только как - то слабо соотносится заявленный автором интервал обновления данных в 1 мС и несколько суток.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 17:05:23
Shark-vc
Demiurg писал(а):Shark-vc писал(а):...
AVR-Studio 4.19
к сожалению на виндовс 10 у меня отказывается ставиться. Попробовал так же скачать с сайта атмел последнюю версию, выдает ошибку при скачивании.
Народ,хелп, помогите с ЖКИ lm016l , курсовая из-за него идет под каток :с
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс дек 20, 2015 21:05:05
СКАЗОЧНИК
Shark-vc писал(а):курсовая из-за него идет под каток :с
А вот это вы зря сказали... Теперь точно никто не поможет. По крайней мере бесплатно. и в этой теме, которая про ассемблер, а не про дисплеи. И так уже срачу развели.
простите за оффтоп. Можно его удалить.
З.Ы. Не ставится АВР Студио 4.19, значит снесите свою винду 10 и поставьте винду 8... Вот и все решение проблемы.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн дек 21, 2015 13:28:05
Shark-vc
СКАЗОЧНИК писал(а):Shark-vc писал(а):курсовая из-за него идет под каток :с
А вот это вы зря сказали... Теперь точно никто не поможет. По крайней мере бесплатно. и в этой теме, которая про ассемблер, а не про дисплеи. И так уже срачу развели.
простите за оффтоп. Можно его удалить.
З.Ы. Не ставится АВР Студио 4.19, значит снесите свою винду 10 и поставьте винду 8... Вот и все решение проблемы.
ну значит это не форум, а цирк еврейский,зачем он нужен если тут все ради денег тогда сидят?)
И раз уж такая пьянка, то мне уже помогли ребята с киберфорума)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт дек 25, 2015 09:53:53
Vaha
Здравствуйте.
Имеется "asm" программа, писанная на "AVRStudio" под Atmega8 для просмотра знакогенератора ЛСД экранчиков на основе HD44780 микроконтроллеров. Программа состоит из основной "LSD_4pin_m8.asm" и 4-х ("m8def.inc" - не считаю - это как само сабой... ) includ-ных файлов: "m8_ini_st.asm", "ini_LCD_4pin.asm", "zad.asm", "hex2ascii.asm" .
LSD_4pin_m8.asm:
Спойлер
Код: Выделить всё
.include "m8_ini_st.asm" ;ATmega8 + стек
;используемые переменные
.def dat_LCD = r17
.def temp = r16
;------------------------------------------------------
.cseg ;данная директива означает, что дальше идет код программы
rcall ini_lcd ; Инициализация портов и ЛСД., и п/п записи команд и кода в ЛСД по 4-и шинам
; используемые порты D (D4...D7) и B (B0, B1)
; данные загружаем в "dat_LCD" он же - R17 и идем на ... "zap_dan" (rcall zap_dan)
; команды загружаем в "dat_LCD" он же - R17 и идем на "zap_com" (rcall zap_com)
;========== программа =========
; программа просмотра символов ЛСД
; от 0 до 255 - просматриваем знакогенератор ЛСД
m1: ldi r24,0x00
mov r0,r24 ; R0 - счетчик и hex код для преобразования
m2: ldi dat_lcd,0x83; устанавливаем курсор в 6-ю позицию
rcall zap_com ;
rcall pr_hex ; преобразование hex в ASCII
mov dat_lcd,pr_dat_h; выводим старшее значение hex кода
rcall zap_dan
mov dat_lcd,pr_dat_l; выводим младшее значение hex кода
rcall zap_dan
ldi dat_lcd,0x3d ; знак "="
rcall zap_dan
ldi dat_lcd,0x3e ; знак ">"
rcall zap_dan
mov dat_lcd,r0 ; сам hex код на выход
rcall zap_dan
ldi temp,255 ; задержка между выводим символов
rcall zad_b_
rcall zad_b_
rcall zad_b_
rcall zad_b_
inc r0 ; следующий знак
mov r24,r0
brne m2 ; тут можно поставить и "rjmp m2", ну чтобы флаги зря не проподали...
rjmp m1
.include "ini_LCD_4pin.asm"
.include "zad.asm"
.include "hex2ascii.asm"
m8_ini_st.asm:
Спойлер
Код: Выделить всё
.nolist ;данная директива отключает генерацию кода в листинг,
; т.е. далее в файле *.lss не будет фиксироваться
;ассемблерный код
.include "m8def.inc" ;подключение стандартного заголовочного файла для ATmega8
.list ;данная директива включает генерацию кода в листинг, т.е.
;далее в файле *.lss будет фиксироваться ассемблерный код
;УСТАНОВКА СТЕКА
ldi R16,low(RAMEND) ;скопируем в R16 младщий байт из константы RAMEND,
;которая определена в m8def.inc и хранит размер SRAM
out SPL,R16 ;скопируем значение из R16 в SPL
ldi R16,high(RAMEND) ;скопируем в R16 старший байт из константы RAMEND,
;которая определена в m8def.inc
out SPH,R16 ;скопируем значение из R17 в SPH
ini_LCD_4pin.asm:
Спойлер
Код: Выделить всё
; Инициализация портов и ЛСД., и п/п записи команд и кода в ЛСД по 4-и шинам
; используемые порты D (D4...D7) и B (B0, B1)
;
;+++++++++ описалово ++++++++
;
; инициализация портов для ЛСД и самого ЛСД - точка входа: "ini_lcd"
;
; данные загружаем в "dat_LCD" он же - R17 и идем на ... "zap_dan" (rcall zap_dan)
; команды загружаем в "dat_LCD" он же - R17 и идем на "zap_com" (rcall zap_com)
;
;++++++++++++++++++++++++++++++
;-----------------------------------------------------
; обознач. на схеме выводы на mega8, на ЛСД
.set RS = 0 ;В0(14) <=> RS(4),
.set E = 1 ;B1(15) <=> E(6)
.set D4 = 4 ;D4(6) <=> D4(11)
.set D5 = 5 ;D5(11) <=> D5(12)
.set D6 = 6 ;D6(12) <=> D6(13)
.set D7 = 7 ;D7(13) <=> D7(14)
;.equ portB,1 = pinE
;.equ portB,0 = pinRS
;------------------------------------------------------------
;используемые регистры
.def dat_LCD = r17
.def temp = r16
ini_lcd:
; используемые порты D и B
; --- настройка портов
ldi temp,0xff
out ddrD,temp ; порт D на Выход
out ddrB,temp ; порт B на Выход
ldi temp,0x00
out portD,temp ; обнуляем порт D
out portB,temp ; обнуляем порт B
; --- инициализация ЛСД 4 шин
ldi temp,255 ; в данном случае - максимальная задержка
rcall zad_b_
rcall zad_b_ ;задержка после подачи питания
ldi dat_LCD,0x20 ; включить 4-и шинный обмен 1 строка (0x28 - 2 строки)
cbi portB,RS ; LCD - прием команд
rcall save1 ; запись
ldi dat_LCD,0x28 ; включить 4-и шинный обмен 2 строка (0x20 - 1 строки)
rcall zap_com
rcall zad_m
ldi dat_LCD,0x01 ; очистка памяти, курсор с лева
rcall zap_com
ldi temp,0xff ; большая задержка
rcall zad_b_
ldi dat_LCD,0x0e ; вид курсора
rcall zap_com
ldi dat_LCD,0x06 ; авто-сдвиг в право
rcall zap_com
ret
;----- запись команд в ЛСД -----8
zap_com:
cbi portB,RS ; LCD - прием команд
rjmp save
;----- запись данных в ЛСД -----
zap_dan:
sbi portB,RS ; LCD - прием данных
; -- процесс записи -----------
save:
push dat_LCD ; подготовка старшего полубайта (команды или данных):
andi dat_LCD,0xf0 ; очищаем младший полубайт
rcall save1 ; запись старшего полубайта (команды или данных)
pop dat_lcd
swap dat_LCD ; подготовка младшего полубайта (команды или данных)
andi dat_LCD,0xf0 ; очищаем младший полубайт
; запись младшего полубайта (команды или данных)
save1:
sbi portB,E ; подготовка строба
rcall zad15
out portD,dat_LCD ; вывод полубайта (команды или данных) на шины
rcall zad15
cbi portB,E ; строб записи полубайта (команды или данных)
rcall zad15
ret
hex2ascii.asm:
Спойлер
Код: Выделить всё
;Преобразование hex кода в код для вывода на печать.
;
; П/П преобразования использует R24, R25
;
;(((((((((((((: ОПИСАЛОВО :))))))))))))))))
; - 1 -------
; Вход: для преобразования байта, оный заносим в r24 (pr_dat_l)
; точка входа "pr_hex"
;
; Выход: "pr_dat_h" = r25 - старший символ от входного (r24 (pr_dat_l)),
; pr_dat_l = r24 - младший символ
;
; - 2 ------
; Вход: для преобразования полубайта, оный заносим в r24 (pr_dat_l) младшие разряды (4-0)
; точка входа "pr_polu_bait"
;
; Выход: "pr_dat_l" = r24
;
;(((((((((((((((((((((((()))))))))))))))))))))))
;===============
;используемые переменные
.def pr_dat_h = r25
.def pr_dat_l = r24
pr_hex:
mov pr_dat_h,pr_dat_l ; запоминаем младший полубайт
swap pr_dat_l ; подготавливаем старший полубайт
rcall pr_polu_bait ; идем преабразовывать
push pr_dat_l ; запоминаем результат старшого полубайта
mov pr_dat_l,pr_dat_h ; младший полубайт на обработку
pop pr_dat_h ; старший результат в "pr_dat_h" R25
rcall pr_polu_bait
ret
pr_polu_bait:
andi pr_dat_l,0x0f ; очищаем старший полубайт
cpi pr_dat_l,0xa ; узнаем это цифра или буква (R24-9)
brcc bukvi ; флаг переноса очищен => R24>9 т.е буквы A,B,C,D,E,F
ori pr_dat_l,0x30 ; если цифра - добавляем в старший полубайт 30h чтоб
ret ;получить код ascii... код готов
bukvi: subi pr_dat_l,0x9 ; если буква - корректируем...
ori pr_dat_l,0x40 ; добавляем 40h. код готов.
ret
zad.asm:
Спойлер
Код: Выделить всё
;---- задержка -----
;
;--------- описалово ---------------
;
; используемые регистры R14,R15,R16
; R16 - он же "temp" - для загрузки констант, которые определяются самим писуном,
; в зависимости от частоты камняи и т.д...
; R14, R15 - счетные регистры - соответственно для малой и большой задержок
;
; ВХОДЫ - zad_m; zad_b - соответственно для малой и большой задержок - с
; записанными константами
; zad_m_; zad_b_ - соответственно для малой и большой задержок с привнесенной
; константой в R16 - он же "temp"
; ВЫХОД - зря потраченное время :)
;-------------------------------------------------------------
;.org pp_zad
.def temp = r16
; ---- малая задержка ---
zad_m: ldi temp,255
zad_m_: mov r14,temp
l_zad_m: dec r14 ;R14-1
brne l_zad_m ;переход если R14 <> 0
ret
zad15: ldi temp,15
rjmp zad_m_
; ----множитель малой задержки ---
zad_b: ldi temp,123
l_zad_b: rcall zad_m
dec r15
brne l_zad_b
RET
zad_b_: mov r15,temp
l_zad_b1: rcall zad_m_
dec r15
brne l_zad_b1
RET
И тут у меня два вопроса:
1) Эти includ-ы, где вставил, там и начинается соответствующий код - это как-бы логично, понятно.
Вопрос: - существует ли возможность includ-ы описывать, вставлять в верху файла, а их реальное размещение происходило по метке. Например: в файле "hex2ascii.asm" вставить строчку ".org pp_hex2ascii", а гдето в теле программы в нужном месте поставить метку "pp_hex2ascii:" - типа, чтоб сюда влился код из файла "hex2ascii.asm"?
2) В файле "ini_LCD_4pin.asm" адресу "portB,0", что в данном случае, соответствует выводу "RS" на ЛСД, хотел директивой ".equ" присвоить имя "pinRS" - ".equ portB,0 = pinRS" но AVRStudio выдает ошибку. Хотя в файле "m8def.inc" такое "безобразие" сплошь и рядом творится. Пробовал строчку (.equ portB,0 = pinRS) в этот файл добавить - тоже ругается. Чего посоветуете?
Спасибо.
Проект к AVRStudio:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт дек 25, 2015 17:36:25
COKPOWEHEU
Препроцессор AVR-ассемблера довольно ущербный, так что сомневаюсь.
1. Не слышал про такое. Как и про необходимость такого. Что-то мешает подключить внешние файлы после области векторов прерываний?
2. В файле m8def.inc такого нет. Вроде, ассемблер не позволяет присвоить одному макросу два значения. С этим даже в Си не так просто.
Впрочем, можете воспользоваться препроцессором из Си, там вполне можно объявить макросы как #define LCD_RS D,5, а потом другими макросами разворачивать это в DDRD, PORTD, PIND, 5 и операции с ними.
Еще одна возможность, в которой я еще более неуверен - использовать GNU-ассемблер, хотя синтаксис там сильно отличается.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт дек 25, 2015 20:54:13
Vaha
1)Это как бы и не совсем внешний файлы, так сказать, куски кода, которые по отдельности легче отлаживать. Место где они будут описываться в "Main" файле тоже, как бы особого значения не имеет. Их описание в начале файла придавало-бы тексту читабельности, на мой взгляд.
Вставить их после области векторов прерываний и перепрыгнуть "rjmp" - вопросов нет., это если куски кода имеют вид законченных подпрограмм. Возьмем, например, подпрограмму задержки, и уберем последний "ret" (возврат из подпрограммы) - и у нас получится функционально законченный кусок кода, который можно вставлять в нужные ( и не очень

) места. Описать его в начале (либо в другом месте), а вливаться ему в программу по указанной метке. (Но это уже, наверное, из области макросов в коих я пока вообще никак.)
2)Опять эти макросы... в файле "m8def.inc" меня "вдохновили" многочисленные строки:
; ***** BOOTLOADER DECLARATIONS ******************************************
.equ NRWW_START_ADDR = 0xc00
......
.equ SMALLBOOTSTART = FIRSTBOOTSTART
.equ LARGEBOOTSTART = FOURTHBOOTSTART
мне и подумалось, что если им можно, то почему мне нельзя?, ан-нельзя, видать умом пока еще не вышел

А так хотелось - указал в начале (либо в другом месте) программы, что нулевой пин порта "B" - это здесь и далее по тексту обозначается как "pinRS", - то при замене на любой другой вывод, надо только переназначить "pinRS" и не гонятся по всему тексту за "portB,0".
А на счет "GNU-ассемблер" - мне бы хотя бы с макросами разобраться... Может есть чего почитать про макросы, обязательно с примерами, и поближе к AVR-кам?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт дек 25, 2015 21:31:04
COKPOWEHEU
Так там тоже самое примитивное - "переменная"="значение". Это вы хотите, чтобы "переменная"="4 значения", обычный avr-ассемблерный препроцессор так не умеет.
Можете попробовать gcc-подобные макросы, сработает или нет.
Код: Выделить всё
#define TEST B
#define _PORT(x) PORT##x
#define PORT(x) _PORT(x)
sbi PORT(TEST),0
Если сработает - ваша задача выполнима без лишнего геморроя.