"CeleronTimer" C library
Библиотека "Программных Таймеров" (реализация синхронных и асинхронных задержек в прошивке микроконтроллера).
Особенности: Кроссплатформенность. Микроконтроллеры любой разрядности. Удобное и функциональное API. Нетребовательная к ресурсам МК.
Дискретность отсчёта = 1мс. Достаточна для реализации пользовательского интерфейса (и прикладной логики) в устройствах на микроконтроллере.
- 0
- 25 октября 2016, 05:35
- Celeron
- github.com/Celeron/gcc-celeron...
- Оставить комментарий
"CeleronKeyInputLib" C library
General C library (crossplatform) for "Buttons" and "Encoders" input processing in microcontrollers.
Библиотека процедур для интеллектуальной обработки ВВОДА в МК (событий от Кнопок и Энкодеров).
Особенности: Кроссплатформенность. Адаптивность к любому железу. Универсальное API. Событийная модель кода обслуживающего интерфейс.
- -3
- 12 сентября 2016, 01:57
- Celeron
- github.com/Celeron/gcc-celeron...
- Оставить комментарий
Графический интерфейс генератора. Часть 2
Тот, кто внимательно смотрел видео из первой части, должен был обратить внимание на сильное мерцание при нажатии на кнопки или поворот энкодера. А еще я сознательно не показал работу цифровой клавиатуры, т.к. были определенные проблемы. После проведения серьезной оптимизации работа интерфейса теперь выглядит так:
Читать дальше
Читать дальше
Графический интерфейс генератора. Часть 1
Где-то в середине лета я начал реализовывать давно витавшую в моей голове идею о функциональном генераторе. На форуме уже есть отдельная тема про него. Пройдена куча граблей, но тем не менее, сделано достаточно много как по железу, так и по софту.
В двух статьях я подробно опишу свою реализацию графического интерфейса генератора. Первая часть охватит опрос элементов управления, формирование команд для сигнальной платы и верхний уровень интерфейса, вторая — нижний уровень интерфейса, т.к. это самая сложная часть.
Читать дальше
В двух статьях я подробно опишу свою реализацию графического интерфейса генератора. Первая часть охватит опрос элементов управления, формирование команд для сигнальной платы и верхний уровень интерфейса, вторая — нижний уровень интерфейса, т.к. это самая сложная часть.
Читать дальше
Кольцевой буфер
Пусть здесь полежит, а то вдруг с моим репозиторием что случится… А тут, глядишь, кому и сгодится.
Код для обслуживания кольцевых буферов, маленький и шустрый.
Собственно так: в секции данных надо поместить массивчик, где будет храниться сам буфер, произвольного размера, до 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
Генератор на perl конечного автомата на C.
Идея написать статью возникла, когда наткнулся на easyelectronics.ru/avr-uchebnyj-kurs-konechnyj-avtomat.html
В данной статье рассматривается принцип работы сгенерированного кода, сам генератор написан на perl и в нём особо интересного ничего нет, берите, пользуйтесь, модифицируйте под свои нужды :)
По сути, предыстория написания программы-генератора: некоторое время назад я делал несколько мелких программ для нового проекта, все они различались реакциями на события. День тупого полумеханического труда по написанию почти одного и того же и к вечеру у меня сдали нервы. Попробовал поискать какой-нибудь готовый генератор кода для конечного автомата (КА) или хотя бы таблиц из некого формализованного описания, ведь по виду кажется просто — есть граф, генерируй-нехочу. Главными критериями были простота и чтоб в результате был код на чистом C, без всякиих плюсплюсов — мне же для микроконтроллера! Но тут меня ждал облом. Либо не просто, либо не C, либо вообще монструозно. В общем, ничего подходящего, не нашёл. К обеду следующего дня у меня был простенький наколенный генератор на perl, как в мультике — лучше день потерять зато потом за пять минут долететь :). Потом уже, когда его стали использовать коллеги, дописал некоторые вещи по их замечаниям. В конце концов получилось нечто, что уже не раз пригождалось узкому кругу людей, и что я и хочу представить на суд общественности, может кому-то ещё поможет.
Практически каждый программист микроконтроллеров (да, впрочем, и не только), делая свой проект, сталкивается с необходимостью обработки событий, изменяющих состояние программы/устройства. Обычно для этого используется тот или иной вариант реализации КА. При этом бывает так, что пишет человек КА, только об этом не знает :)
Читать дальше
В данной статье рассматривается принцип работы сгенерированного кода, сам генератор написан на perl и в нём особо интересного ничего нет, берите, пользуйтесь, модифицируйте под свои нужды :)
По сути, предыстория написания программы-генератора: некоторое время назад я делал несколько мелких программ для нового проекта, все они различались реакциями на события. День тупого полумеханического труда по написанию почти одного и того же и к вечеру у меня сдали нервы. Попробовал поискать какой-нибудь готовый генератор кода для конечного автомата (КА) или хотя бы таблиц из некого формализованного описания, ведь по виду кажется просто — есть граф, генерируй-нехочу. Главными критериями были простота и чтоб в результате был код на чистом C, без всякиих плюсплюсов — мне же для микроконтроллера! Но тут меня ждал облом. Либо не просто, либо не C, либо вообще монструозно. В общем, ничего подходящего, не нашёл. К обеду следующего дня у меня был простенький наколенный генератор на perl, как в мультике — лучше день потерять зато потом за пять минут долететь :). Потом уже, когда его стали использовать коллеги, дописал некоторые вещи по их замечаниям. В конце концов получилось нечто, что уже не раз пригождалось узкому кругу людей, и что я и хочу представить на суд общественности, может кому-то ещё поможет.
Практически каждый программист микроконтроллеров (да, впрочем, и не только), делая свой проект, сталкивается с необходимостью обработки событий, изменяющих состояние программы/устройства. Обычно для этого используется тот или иной вариант реализации КА. При этом бывает так, что пишет человек КА, только об этом не знает :)
Читать дальше
Даллас. Быстрое преобразование температуры.

Картинка для привлечения внимания, есличто.
А что касается темы — пришла мысль, и её требуется записать, что я сейчас и делаю.
Итак, есть термометр ds18b20, и я как-то уже рассказывал, как брать с него температуру, и показывать на экране. Делалось это умножением на 625 с последующим делением на сто, преобразованием в BCD, и выводом, вставляя запятую перед второй справа цифрой.
Читать дальше
AVRASM: Библиотека процедур для интеллектуальной обработки ВВОДА в МК: событий от Кнопок и Энкодеров (часть 2: порядок внедрения и использования)
Большинству микроконтроллерных устройств требуется поддерживать интерфейс с пользователем-человеком: для вывода используются светодиоды или дисплеи, а для ввода — обычно, традиционные Кнопки и Энкодеры.
Данная реализация «Библиотеки процедур для интеллектуальной обработки ВВОДА» написана на языке ассемблера, для компилятора AVRASM. Соответственно, она предназначена для разработки программных прошивок (firmware) на языке ассемблер, для микроконтроллеров Atmel AVR (8-bit).
Читать дальше
Данная реализация «Библиотеки процедур для интеллектуальной обработки ВВОДА» написана на языке ассемблера, для компилятора AVRASM. Соответственно, она предназначена для разработки программных прошивок (firmware) на языке ассемблер, для микроконтроллеров Atmel AVR (8-bit).
Читать дальше
- 0
- 12 декабря 2013, 03:14
- Celeron
- Оставить комментарий
Обработчик матричной клавиатуры
Здравствуйте. У меня давно валяется без дела матричная клавиатура 4*4. Несколько дней назад я озадачился созданием запасного устройства ввода для девайса, которое могло бы частично заменить основной интерфейс, например с компьютером. Кроме того, либа для клавиатуры в хозяйстве не помешает, решил написать сам — в порядке самообразования. Идея в целом удалась, получился довольно портабельный обработчик, тестировал с платой Arduino Nano v3, работает в железе.
Читать дальше
Читать дальше
AVRASM: Библиотека процедур для интеллектуальной обработки ВВОДА в МК: событий от Кнопок и Энкодеров (часть 1: авторская методика и реализация)
Микроконтроллерное устройство может работать исключительно в автономном режиме: получать сигналы с датчиков, и выдавать управляющие импульсы, иногда оно ещё взаимодействует с ЭВМ или другими микроконтроллерами… Но большинству микроконтроллерных устройств требуется поддерживать интерфейс с пользователем-человеком: для вывода используются светодиоды или дисплеи, а для ввода — традиционные Кнопки и Энкодеры, редко используются и другие экзотические устройства ввода…
В данной работе будут рассматриваться только традиционные инструменты ввода: «цифровые Кнопки / Клавиатуры» и «инкрементальные Энкодеры», поскольку именно они используются почти всегда.
Содержание:
Читать дальше
В данной работе будут рассматриваться только традиционные инструменты ввода: «цифровые Кнопки / Клавиатуры» и «инкрементальные Энкодеры», поскольку именно они используются почти всегда.
Содержание:
- Назначение
- Особенности
- Код и Зависимости
- Как это работает?
- Порядок внедрения библиотеки
- Методика проектирования прикладного кода (обработчики событий)
Читать дальше
- 0
- 07 декабря 2013, 17:07
- Celeron
- Оставить комментарий