WBR, Michael.
Цель расчетов - понимание, а не числа (с) Хемминг.
Да, ЭЛТ с киловольтными напряжениями управляемая древним МС с прошивкой на ассемблере это жёстко.
Совсем вы себя не бережете. Реализуете проект, а дальше что? Понимаете что дальше "повышать градус" будет некуда?
WBR, Michael.
Цель расчетов - понимание, а не числа (с) Хемминг.
Чё там на логику смотреть, если это ассемблер А09?! Открываем хелп на него и читаем по каждой строке, что она означает. Систему команд держим тут же, под боком. Конкретно в строчке "cmp #ScrTabL" значение ScrTabL равно 62. Естественно, оно байтовое, то есть 8-разрядное беззнаковое.
Всего доброго.
Евгений.
По подробнее-бы - есть описание его мнемоники (если я правильно выразился) в общем вспомогательных операторов ?
Вопрос номер 2 - как правильно на AVRASM (из состава AVRStudio) корректно реализовать выборку данных (байтовых) из таблицы в памяти программ ?
---------- Сообщение добавлено 08:00 ---------- Предыдущее сообщение было 07:58 ----------
Ну так проект, видимо, лохматых годов. Там и ЦАП древний (еле нашел и не дёшево совсем)
35 лет назад как раз имело смысл делать векторный дисплей на осциллографической ЭЛТ и хорошо оптимизированном коде. Причина - энергопотребление. Машинка на 80C85 или 80C51 вместе с экономичной ЭЛТ и X-Y усилителями с умеренной полосой порядка 500 кГц, укладывались в полтора-два ватта. Никаким другим способом портативный прибор с автономным питанием и дисплеем тогда сделать было нельзя.
Да, генератор векторов у меня выдавал под 140 тысяч точек в секунду, дуг - около 100. Растр 256 на 256.
При этом библиотека операций и функций с плавающей запятой по скорости на 8085 конкурировала с ЕС-1020
Отечественные ЭЛТ не экономичны по накалу, та-же 13ЛО16А потребляет на 1 подогреватель 5 Вт (10Вт для 2х лучей)
ВВ преобразователи тоже не верх КПД. Учтите что для одного луча нагрузка на канал -1700В - 1мА для 2х лучей - 2 мА
Усилители отклонения обычно работают в режиме А при токе выходного каскада 20-30 мА
А делается исключительно для саморазвития.
Вопрос - как правильно на AVRASM (из состава AVRStudio) корректно реализовать выборку данных (байтовых) из таблицы в памяти программ ?
11ЛО9И, 6.3В 90 мА накал, плюс игра режимами, учитывая, что луч ползет относительно медленно и большой ток луча не нужен. Хорошая чувствительность по отклонению позволила иметь небольшое напряжение питания усилителей отклонения, они к тому же достаточно узкополосные были, ток меньше миллиампера на транзистор.
Понятно, что будь тогда годные ЖК экраны, в такой возне не было бы никакого смысла.
Последний раз редактировалось sia_2; 31.01.2023 в 13:37.
Я про сегодня говорю, 35 лет назад на асме писать было нормально.
Тут генератор векторов и дуг реализован аппаратно и аналогово. У него уже нет явного растра.
Оно же в аппнотах было и в 100500 курсов любителей для любителей. Настолько лень искать самостоятельно?
http://www.ntlib.chat.ru/avr/instr/lpm.htm
WBR, Michael.
Цель расчетов - понимание, а не числа (с) Хемминг.
Передаю подробнее, по буквам: О, т, к, р, ы, в, а, е, м, , х, е, л, п, , н, а, , н, е, г, о, , и, , ч, и, т, а, е, м, , п, о, , к, а, ж, д, о, й, , с, т, р, о, к, е, ,, , ч, т, о, , о, н, а, , о, з, н, а, ч, а, е, т, .
Правильно и корректно - это со знанием дела, в частности и языков тоже. Но в первую очередь всё-таки дело. Надо понимать, как все эти таблицы размещаются и как они могут размещаться в памяти программ. Например, я это у себя делал так:Вопрос номер 2 - как правильно на AVRASM (из состава AVRStudio) корректно реализовать выборку данных (байтовых) из таблицы в памяти программ ?
in r30, ADCL ; это, к примеру, чтение из АЦП,
in r31, ADCH ; но здесь могло быть что угодно, заполняющее R30 и R31.
; а за ним идут две команды табличного преобразования результата:
adiw r30, tabl*2
lpm XYZ_, Z
Но я понимаю, чтО делаю, поэтому могу обойтись таким коротким кодом, всего из двух команд. А в других случаях такое не прокатит. И когда я говорил фразу "со знанием дела, в частности и языков тоже", то я имел ввиду не столько языки программирования (они как раз второстепенны), но язык и стиль мышления того человека, чью разработку вы повторяете и/или модернизируете, а также язык и стиль мышления процессора. Я, например, не пользуюсь AVRStudio и не знаю AVRASM. Это не мешает мне писать на нём (фрагмент кода выше как раз компилировался в avrasm2), поскольку у меня были проекты и на 68хх, и на avr. Правда, они не пересекались, то есть перегонять проект из одной платформы в другую мне пока в голову не приходило (каждый проц хорош на своём месте!), но языки этих процессоров я ещё худо-бедно помню.
А языки программирования второстепенны потому, что если у человека есть способность к освоению языков вообще (не важно, каких!), то и очередной язык программирования он освоит прямо по ходу дела.
Всего доброго.
Евгений.
Таки где его взять-то, хелп этот ?
tabl - как я понимаю ссылка на начало таблицы, то есть метка, а что значит *2 (вроде как это и еть умножить на 2 - но зачем ?)
Если я просто делаю так :
LDI R30, Low(tabl)
LDI R31, High(tabl)
То в регистровой паре корректный с точки зрения встроенного симулятора адрес памяти и действительно указывает на начало программы, но когда я выполняю LPM Rх, Z , но в Rx - фигня непонятно откуда считанная ?
К сожалению чего нет, того нет, есть толика упорства и желание понять и разобраться.
Когда-то в прошлой жизни писал для К580ВМ80 - даже работало. Для AVR писал тоже пару раз простенькие программы. Регулятор мощности использующий алгоритм им. тов. Брезенхэма - на рассыпухе такое не сделаешь - работал даже, но к конечному применению не подошел, пришлось переделать на обычный СИФУ. (ATTINY15) Это было давно. Вот тепереча вспоминаю.
---------- Сообщение добавлено 15:35 ---------- Предыдущее сообщение было 15:32 ----------
Зато понятно, как оно работает.
Система векторная, но задаются центры дуг в матрице 256х256. На самом деле я сначала хотел сделать с аппаратным знакогенератором. Но как-то сложно выходило.
Еще вопрос - как на AVR остановить выполнение программы до генерации любого прерывания и продолжить после возврата из подпрограммы отработчика.
Там же, где и форум Вегалаб: в интернете. Тем более, что он там валяется не только с хелпом, но даже с исходниками на Си. На Гитхабе, кстати, он тоже есть.
Затем, что память команд 16-разрядная, и счётчик команд адресует каждое слово, а все остальные способы адресации - 8-разрядные, то есть байтовые.tabl - как я понимаю ссылка на начало таблицы, то есть метка, а что значит *2 (вроде как это и еть умножить на 2 - но зачем ?)
Когда в Z (а хоть бы и в Х или У, ибо на LPM свет клином не сошёлся) надо положить ноль, то его на что ни умножай, он так нолём и останется. Это ещё и Митрофанушка пару веков назад знал, до разработки Паскалем первой паровой вычислительной машины:Если я просто делаю так :
LDI R30, Low(tabl)
LDI R31, High(tabl)
То в регистровой паре корректный с точки зрения встроенного симулятора адрес памяти и действительно указывает на начало программы,
Код:Митрофан (вычисляя, шепчет): Единожды три – три. Единожды ноль – ноль. Единожды ноль – ноль. (с)Д.И.Фонвизин, "Недоросль".Чегой-то непонятно откуда? Очень даже понятно: из таблицы, которая находится вдвое ближе, чем требуется. Надо указывать Low(tabl*2) и High(tabl*2), чтобы адресовать байтовую таблицу в словной памяти.но когда я выполняю LPM Rх, Z , но в Rx - фигня непонятно откуда считанная ?
Всего доброго.
Евгений.
А можно ссылочку, что-то у меня не сыскалось.
Логично, но почему тогда получающийся в регистровой паре адрес не соответствует адресу в просмотре памяти при симуляции ?
Попробовал - действительно корректно стал извлекать, но теперь непонятно с какого адреса идет чтение.
Только R30 и R31 можно использовать для адресации LPM , по крайней мере в ATMega32
Спасибо. Разобрался, но не до конца - как узнавать какую ячейка именно из памяти сейчас читать будет в симуляторе ? Потому как те адреса что получаются указывают теперь неверно (по симулятору).
Еще вопрос - как проще всего установить и сбросить бит в байте хранящемся в ячейке память ОЗУ. А то команды SBI/CBI работают только на регистры ввода/вывода
На входе имеем считанную в регистр ячейку (0-255) и номер бита. (0-7) ? У М68 есть такие команды BCLR/BSET а у AVR нету.
http://ww1.microchip.com/downloads/e...set-manual.pdf
есть такая инструкция sleep
---------- Сообщение добавлено 16:55 ---------- Предыдущее сообщение было 16:53 ----------
Вся суть секты свидетелей ассемблера
К нормальным программерам не относится.
WBR, Michael.
Цель расчетов - понимание, а не числа (с) Хемминг.
Полезный документ.
Еще вопрос - надо как-то контролировать что в байте установлено в "1" более 1 бита. То есть если на байт установлен в 1 любой бит - это одно, если установлено более одного бита или не установленно ни одного - это другое.
Защита от одновременного нажатия 2х кнопок.
Что-то не придумывается простых решений.
У вас там раньше (где-то на предыдущей странице) и ссылка на проект не открылась. Поэтому я и не даю конкретных ссылок, что у кого-то открывается, у кого-то не открывается. А я сейчас и вовсе сижу на вокзале в ожидании поезда, и искать что-то на экране телефона весьма сложно.
Потому что симуляция кривая.Логично, но почему тогда получающийся в регистровой паре адрес не соответствует адресу в просмотре памяти при симуляции ?
Со словного, разумеется.Попробовал - действительно корректно стал извлекать, но теперь непонятно с какого адреса идет чтение.
На LPM свет клином не сошёлся. LDD прекрасно извлекает из памяти по адресу X и Y, а не только Z. На времени выполнения программы это никак не сказывается.Только R30 и R31 можно использовать для адресации LPM , по крайней мере в ATMega32
Вот дался вам этот симулятор... Такие вещи вполне делаются голыми руками, когда понимаешь, чтО делаешь.Разобрался, но не до конца - как узнавать какую ячейка именно из памяти сейчас читать будет в симуляторе ? Потому как те адреса что получаются указывают теперь неверно (по симулятору).
Я уже говорил, что каждый проц хорош на своём месте. Не надо втупую передирать ассемблерный код с одной платформы на другую. Надо понять смысл вычислений и логической обработки. Втупую это будет логическая обработка байтов, но в AVR она работает только с регистрами. С памятью никак...Еще вопрос - как проще всего установить и сбросить бит в байте хранящемся в ячейке память ОЗУ. А то команды SBI/CBI работают только на регистры ввода/вывода
Учите языки! И в первую очередь русский. В России без него никуда. А когда научитесь говорить по-русски, тогда и до ассемблеров доберёмся! На каком входе-то??? Что, в вашей жизни всего один вход? Вот в моей их столько, что если я скажу "на входе", то никто не поймёт, о каком входе я говорю. Опять же, где имеем номер бита? Учите русский язык...На входе имеем считанную в регистр ячейку (0-255) и номер бита. (0-7) ?
Всего доброго.
Евгений.
Если будете со стационарного компа - то по возможности посмотрите. Или если там текстовый файл хелпа или стандартный виндовый - может сможете скинуть на Е-Mail (укажу в личке при согласии).
Вроди Atmel - контора серьёзная - не ожидал такого западла от них.
Уже разобрался - меня смутило кривое отображение адресного пространства программ в симуляторе AvrStudio.
А как разбираться-то по другому. Я-ж только учусь.
Совсем в тупую передрать не получается - это понятно - понятно, что например невозможность работы с памятью напрямую приводит к необходимости предварительно прочитать из неё в регистр, а потом записать - 3 команды против одной. Но у меня де факто тактовая в 2 раза больше, а тактов на команду меньше, так что производительности должно хватить. а так размер кода примерно х3 становится.
Всю жизнь учу - но до чего доучился.
Ну так может вместо оскорблений покините эту тему - если сказать нечего - то лучше помолчать.
Социальные закладки