Микроменю на ассемблере PIC12/16 на основе индексов
Хочу поделится своим никому не нужным творением — микроменю на ассемблере PIC12/16.
При создании этого микроменю преследовалось 2 цели:
1. Спортивный интерес — вместить «полноценное» меню + работу с знаковым дисплеем и крестовиной кнопок в 1 кБ (1К слов, если быть точнее), именно столько в PIC16F84, который и был использован.
2. Сделать меню достаточно гибким в настройке, чтобы иметь возможность применять его в простеньких проектах, без необходимости влезать в его дебри, и понимать, как оно написано.
Читать дальше
При создании этого микроменю преследовалось 2 цели:
1. Спортивный интерес — вместить «полноценное» меню + работу с знаковым дисплеем и крестовиной кнопок в 1 кБ (1К слов, если быть точнее), именно столько в PIC16F84, который и был использован.
2. Сделать меню достаточно гибким в настройке, чтобы иметь возможность применять его в простеньких проектах, без необходимости влезать в его дебри, и понимать, как оно написано.
Читать дальше
- 0
- 15 декабря 2018, 13:56
- Gnusmas
- Оставить комментарий
- 1
Повторяем Китай (своя прошивка для релейного модуля STC15F104W + ESP8266)
Купил себе на поигратся релейный модулек на базе STC15F104W и ESP8266. Вот такой www.banggood.com/ESP8266-5V-WiFi-Relay-Module-Internet-Of-Things-Smart-Home-Phone-APP-Remote-Control-Switch-p-1126605.html? (это не реклама, я вообще его у себя в городе брал, а не в Китае)
Читать дальше
Читать дальше
Простой программный таймер для конечных автоматов на ассемблере MCS-51 и PIC12/16
Доброго времени суток. Навеяно статьей easyelectronics.ru/prostoj-programmnyj-tajmer-dlya-konechnyx-avtomatov.html, и особенно, прекрасной статьей we.easyelectronics.ru/AVR/taymery-i-zaderzhki-sbornik-receptov.html
Читать дальше
Читать дальше
Машина времени для крошек.
При программировании микроконтроллеров часто требуется отслеживать временные промежутки. Даже банальное «помигать светодиодом» требует учета времени погашенного состояния и времени светимости.
В Си есть функция delay_ms(X), которая выполняет пустой цикл X ms, то есть по сути вешает проц на X*fcpu/1000 тактов, так как ничего иного в это время он делать не может.
Многие прогеры, намучившись с этой функцией (или ей подобными), переходят на использование прерываний и аппаратных таймеров, но тут другая засада — их всегда мало.
Каждый выкручивается как может, например навешивает на один таймер несколько функций, использует биты счетчика как флаги, впрягает в нарты сторожевую собаку… вариаций много, но всегда новый проект означает новые выеживания, поиски решения в ограниченном пространстве.
Пройдя все эти стадии, я наконец-то дорос до понимания, что «что-то тут не так». Нарисовалась необходимость диспетчеризации задач по таймеру.
Прочитав AVR. Учебный Курс. Архитектура Программ Часть 2 в очередной раз убедился, что изобрел велосипед… ну и пусть, это просто еще один вариант решения.
Читать дальше
В Си есть функция delay_ms(X), которая выполняет пустой цикл X ms, то есть по сути вешает проц на X*fcpu/1000 тактов, так как ничего иного в это время он делать не может.
Многие прогеры, намучившись с этой функцией (или ей подобными), переходят на использование прерываний и аппаратных таймеров, но тут другая засада — их всегда мало.
Каждый выкручивается как может, например навешивает на один таймер несколько функций, использует биты счетчика как флаги, впрягает в нарты сторожевую собаку… вариаций много, но всегда новый проект означает новые выеживания, поиски решения в ограниченном пространстве.
Пройдя все эти стадии, я наконец-то дорос до понимания, что «что-то тут не так». Нарисовалась необходимость диспетчеризации задач по таймеру.
Прочитав AVR. Учебный Курс. Архитектура Программ Часть 2 в очередной раз убедился, что изобрел велосипед… ну и пусть, это просто еще один вариант решения.
Читать дальше
Скриптовый отладчик в KEIL. Ассемблер А51, задание тестовых значений переменных при отладке програмы.
Что такое скриптовый отладчик в KEIL? Это командный интерпретатор доступный только в режиме отладки. Его использование возможно из специальной отладочной консоли. В качестве командного языка используется подмножество языка С с некоторыми ограничениями:
Хотя данная статья написана применительно к ассемблеру А51 архитектуры MCS-51, данные приемы универсальны, и могут быть применены и к языку С, и к архитектуре ARM с минимальными переделками или без них.
Читать дальше
- прописные и строчные символы не различаются;
- существуют ограничения по работе с указателями и адресной арифметикой;
- не может использоваться для вызова процедур и функций отлаживаемой программы;
- не поддерживает определение структур;
Хотя данная статья написана применительно к ассемблеру А51 архитектуры MCS-51, данные приемы универсальны, и могут быть применены и к языку С, и к архитектуре ARM с минимальными переделками или без них.
Читать дальше
TIS-100
Уникальная Игра TIS-100 от американского разработчика Закари Барта.
Вы получаете в наследство компьютер который не успел собрать ваш дядюшка Ричи, но чтобы запустить его нужно написать диагностические тесты на несколько специфичном ассемблере.

Читать дальше
Кольцевой буфер
Пусть здесь полежит, а то вдруг с моим репозиторием что случится… А тут, глядишь, кому и сгодится.
Код для обслуживания кольцевых буферов, маленький и шустрый.
Собственно так: в секции данных надо поместить массивчик, где будет храниться сам буфер, произвольного размера, до 255 байт. Глубина буфера задаётся константой RBSIZE, и массив получается на три байта больше размером. В первом байте лежит глубина заполнения, то есть сколько данных сейчас в буфере. При укладке байта — увеличивается, при выгрузке — уменьшается; если ноль — буфер пуст. Второй и третий байты — служебные, указатели загрузки и выгрузки. Для инита буфера надо эти три байта обнулить.
А дальше всё стандартно — процедурой PutToBuf укладываем в буфер содержимое r16, процедурой GetFromBuf — достаём. Если буфер переполнен — очередной байт туда не ляжет, если пуст — содержимое r16 не изменится.
Портит xl,xh,r17, загрузка/выгрузка занимает по 29 тактов. Локальных меток не имеет, так что можно легко тиражировать в любом количестве экземпляров внутри программы.
Код для обслуживания кольцевых буферов, маленький и шустрый.
Собственно так: в секции данных надо поместить массивчик, где будет храниться сам буфер, произвольного размера, до 255 байт. Глубина буфера задаётся константой RBSIZE, и массив получается на три байта больше размером. В первом байте лежит глубина заполнения, то есть сколько данных сейчас в буфере. При укладке байта — увеличивается, при выгрузке — уменьшается; если ноль — буфер пуст. Второй и третий байты — служебные, указатели загрузки и выгрузки. Для инита буфера надо эти три байта обнулить.
А дальше всё стандартно — процедурой PutToBuf укладываем в буфер содержимое r16, процедурой GetFromBuf — достаём. Если буфер переполнен — очередной байт туда не ляжет, если пуст — содержимое r16 не изменится.
Портит xl,xh,r17, загрузка/выгрузка занимает по 29 тактов. Локальных меток не имеет, так что можно легко тиражировать в любом количестве экземпляров внутри программы.
; В секции данных:
;.equ RBSIZE=11
; ringbuf: .byte RBSIZE+3
; Конструкция кольцевого буфера:
;+0 - глубина заполнения
;+1 - указатель укладки
;+2 - указатель выгрузки
;+3... - данные
; Использованные регистры: xh,xl,r16,r17
; укладка в буфер. 29 тактов
PutToBuf: ldi xh,high(ringbuf+3) ;загрузка базы буфера
ldi xl,low (ringbuf+3)
lds r17,ringbuf+0 ;load rbdept
cpi r17,RBSIZE ; проверка на переполнение
brcc pc+16
inc r17
sts ringbuf+0,r17 ;store rbdept
lds r17,ringbuf+1 ;load rbputptr
add xl,r17 ; складываем указатель с базой
brcc pc+2
inc xh
st x,r16 ; помещаем байт в буфер
inc r17 ; приращение указателя укладки
cpi r17,RBSIZE ; закольцовка, если достигнута граница
brcs PC+2
clr r17
sts ringbuf+1,r17 ;store rbputptr
ret
; выгрузка из буфера. 29 тактов
GetFromBuf: ldi xh,high(ringbuf+3)
ldi xl,low (ringbuf+3)
lds r17,ringbuf+0 ;load rbdept
tst r17 ; проверка наличия данных
breq pc+16
dec r17
sts ringbuf+0,r17 ;store rbdept
lds r17,ringbuf+2 ;rbgetptr
add xl,r17
brcc pc+2
inc xh
inc r17
cpi r17,RBSIZE
brcs PC+2
clr r17
sts ringbuf+2,r17 ;rbgetptr
ld r16,x
ret
Configuration Wizard в KEIL. Ассемблер А51, подбор битовых масок для вывода на семисегментный индикатор
Что такое Configuration Wizard (мастер конфигураций) в KEIL? Это псевдокод написанный в комментариях и оформленный спецтегами. При наличии такого кода в проекте появляется дополнительная вкладка «Configuration Wizard».
На странице помощи по Configuration Wizard упор сделан на С программировании. Но мастер конфигураций легко встраивается и в чисто ассемблерные проекты. При этом следует придерживаться ассемблерной орфографии. Ниже приведен пример подобного мастера.
Читать дальше
На странице помощи по Configuration Wizard упор сделан на С программировании. Но мастер конфигураций легко встраивается и в чисто ассемблерные проекты. При этом следует придерживаться ассемблерной орфографии. Ниже приведен пример подобного мастера.
Читать дальше
Dowlib update
DOWLIB обновлён.
Bugfix: устранено бесконечное ожидание в Ex_DowRst при коротком замыкании шины. Теперь возвращает CY (нет отклика устройства на сброс)
Bugfix: вызов Ex_DowSkipRom ошибочно возвращал CY. поправлено.
Новая версия в аттаче.
Bugfix: устранено бесконечное ожидание в Ex_DowRst при коротком замыкании шины. Теперь возвращает CY (нет отклика устройства на сброс)
Bugfix: вызов Ex_DowSkipRom ошибочно возвращал CY. поправлено.
Новая версия в аттаче.
Даллас. Быстрое преобразование температуры.

Картинка для привлечения внимания, есличто.
А что касается темы — пришла мысль, и её требуется записать, что я сейчас и делаю.
Итак, есть термометр ds18b20, и я как-то уже рассказывал, как брать с него температуру, и показывать на экране. Делалось это умножением на 625 с последующим делением на сто, преобразованием в BCD, и выводом, вставляя запятую перед второй справа цифрой.
Читать дальше