Показаны сообщения с ярлыком IAR_AVR. Показать все сообщения
Показаны сообщения с ярлыком IAR_AVR. Показать все сообщения

среда, 23 октября 2013 г.

Как писать передаточные функции на Си (Converting Transfer Functions to C Code)

http://www.slideshare.net/DelftOpenEr/ch1-9097263

EMBEDDED CONTROL

- if a feedback control function is to be implemented in software the transfer function can be converted to a C subroutine.
- the method shown here is crude - more mature methods use the z-transforms
- consider the implementation of the following control function as a subroutine.
Figure 8.35 Converting Transfer Functions to C Code
http://engineeronadisk.com/V2/book_modelling/engineeronadisk-76.html

суббота, 12 октября 2013 г.

AVR - как избавиться от чисел с плавающей точкой

Одно из сильных ограничений AVR (на платформе MCS51 это сказывается не так) - быстрый расход памяти при написании программ на Си.
Что поделаешь, за удобства Си и скорость RISC надо платить. Еще больший соблазн - использование для вычислений (например, при измерении напряжений с помощью ADC) чисел float(числа с плавающей запятой). Несмотря на то, что эти вычисления не точны, их слишком просто и удобно применять - можно делить и умножать, не задумываясь о переполнении, и легко представлять результаты вычисления в формате, понятном человеку.
Но плата за float слишком высока - линкер добавляет код библиотек математики, и память программ кончается очень быстро. Другое ограничение - вычисления с float выполняются слишком медленно (если конечно не используется аппаратный перемножитель типа [1]). Если нет возможности реализовать алгоритм программы с применением чисел float (из-за вышеуказанных ограничений по объему кода и скорости), одним из вариантов решения проблемы является переход на числа сфиксированной запятой. Их математические операции (вычитание, сложение, деление, умножение) ничем не отличаются от математических операций с простыми целыми числами, код получается компактный и быстрый.
Число с фиксированной запятой (обычно байт или слово из двух байт) состоит из целой части(находится в старших битах 8 или 16-разрядного числа) и дробной части (находится в младших битах). Пример числа с фиксированной запятой указан на рисунке, с разрядностью в 8 бит (1 байт).


воскресенье, 9 июня 2013 г.

Читаемый код. Программирование

http://habrahabr.ru/post/150868/

Во-первых, человек всегда проговаривает внутри себя любой читаемый текст. Именно поэтому очень важно писать такой текст, который можно произнести, последовательный и связный. Текст, который может задействовать один из самых эффективных механизмов мозга: речь. Если текст нельзя пропустить через этот парсер, мозг будет задействовать дополнительные, недостаточно эффективные ресурсы. Отсюда быстрая усталость и головная боль при длительной работе со страшным кодом. Теперь ты понял, да? :)

Во-вторых, мозг по-разному осмысливает стратегические (“что делать?”) и тактические (“как делать?”) задачи. Когда ты пишешь метод isLocatable(), ты сфокусирован лишь на одной маленькой и четкой задаче: как определить, может ли девайс быть обнаружен или нет. Это — тактическое мышление, предельно внимательное к деталям и весьма техничное. А вот когда ты пишешь “главный” метод locateDevice(), ты не думаешь над мелкими вопросами; ты создаешь, собственно, прикладную логику приложения. Это — стратегическое мышление, оно творческое и мыслит абстракциями.

В-третьих, мозг человека, как и CPU, не может одновременно думать о разных вещах и вынужден между ними переключаться. В отличие от процессора, твой мозг переключает контексты очень медленно — около 1/3 секунды*. Более того, переключение контекста затратно, а потому дискомфортно. Ты этого не осознаешь и не ощущаешь, но подсознательно ты будешь его избегать. Вот почему тебя дико бесит, когда тебе задают левый вопрос в то время, как ты глубоко погружен в код. Вот почему успешными менеджерами становятся люди, которых не напрягает постоянно отвечать по телефону на совершенно разные вопросы.

*300ms — средняя скорость переключения контекста мышления по разным оценкам и исследованиям.

суббота, 16 февраля 2013 г.

Одна кнопка.

http://we.easyelectronics.ru/HomeTech/odnokomponentnaya-payalnaya-maska-s-uf-otverzhdeniem.html
Иногда приходится делать очень маленькое устройство, например, велокомпьютер. Или конструктив не позволяет разместить много кнопок. В общем есть у нас одна кнопка на ввод и ничего более.

Спартанские условия, но и тут можно развернуть мощный функционал, многоуровневые меню и прочие прелести жизни. сейчас я покажу одну из реализаций такого управления.

Итак, что у умеет наша кнопка?

  • Ее можно нажимать кратко
  • Можно жать длинно
  • Можно делать разные комбинации нажатий
  • Ее можно отпускать в нужный момент


Не густо, но вполне ничего. Для одной кнопки то. Главный затык при написании этого не просрать массу системных ресурсов (время процессора, таймеры и тыды) на обработку этой несчастной кнопки. Ведь нам придется отслеживать факт нажатия, факт отжатия, время нажатия, число нажатий с разным временем. Я видел такие адовые реализации этого интерфейса, что просто диву давался как можно нагородить столько тупняков и тормозов в этой одной сосне, да еще потратить все таймеры :)

Так что ТЗ выставим следующее:

  • Никаких аппаратных таймеров, кроме таймера диспетчера.
  • Никаких временных задержек, только вызов себя же по таймеру.
  • Никаких ожиданий нажатия-отжатия в цикле. Зашли, проверили — отдали управление.
  • Введем временной интервал mode_time, в течении которого будем отслеживать комбинацию нажатий. Скажем 2с
  • На выходе будем иметь число коротких и длинных нажатий за данный интервал

Алгоритм
Сделаем все на конечном автомате. У него будут три состояния:

  • Up — кнопка не нажата
  • Dn — кнопка нажата
  • Al — кнопка отпущена после длительного нажатия

А также будет одна служебная процедура, которая спустя mode_time (2c) после первого экшна с кнопкой сгребет все результаты и что-нибудь с ними сделает. Что — это уже не важно. От программы зависит.
И вся эта дребедень будет крутиться в цикле, вызывая сама себя через диспетчер (или каким еще образом) раз в 20мс.
 


Up
Входим.
Смотрим не нажата ли кнопка? Если нет — выходим. Если нажата, то переводим автомат в положение Dn
Проверяем первый ли раз за интервал мы тут? Если первый, то поставим нашу служебную процедуру на отложенный запуск (через 2с), взведем флаг, что процесс пошел.
Выходим.

Dn
Входим.
Еще нажата? Если нет, значит кнопка уже отпущена, скидываемся в состояние в Up и засчитываем одно короткое нажатие, увеличивая счетчик коротких нажатий cnt_s. Если еще нажата, то щелкаем счетчиком времени замера длительности нажатия Timе. Замер длительности у нас идет в итерациях автомата. Одна итерация 20мс. В лимит длинного нажатия я заложил 20 итераций, что дает около 400мс. Все что больше 0.4с считаем длинным нажатием. Как натикает больше 20 итераций, то засчитываем одно длинное нажатие и перекидываем автомат в состояние Al. Выходим.

Al
Входим.
Еще не отпустили? Если нет, то выходим. Если кнопка отпущена, то перебрасываемся в Up, скинув переменную Time.
 


За время mode_time, за те две секунды, сколько успеем натыкать — все наше. Запустится процедура анализа собранных данных и разгребет натыканное. Там уже все просто. Банальным case’ом делаем нужный нам экшн. Я вот, например, флажки выставляю которые перехватывает другая задача. Главное не блокировать эту задачу ничем тяжелым, чтобы не прозевать следующую комбинацию.

Код



Код написан так, что на AVR там завязана буквально пара строчек. По крайней мере в коде обработчика нажатий кнопки. Все привязки на железо идут в хидере, да и их там всего ничего:

1
2
3
4
5
6
7
8
9
10
11
#include <avrlibtypes.h>
#include <avrlibdefs.h>
 
#define Open (BTN_PIN & 1<<BTN)
#define Close (!Open)
 
extern void bt_scan(void);
void bt_ok(void);
 
extern u08 bt1,bt2,bt3,bt4,bt5,bt_l,bt_l2,bt_al;
extern u16 bt_mode_time;

Так что портировать это на другую архитектуру дело смены двух строчек. Ну и, возможно, вам потребуется изменить механизм автозапуска и запуска функции обработчика. Если вы будете использовать какой то свой диспетчер, ОС или еще какую систему организации прошивки. Но это две строчки в коде поправить.

Все описанное в статье мясо лежит в двух файлах button.c и button.h

Видео работы


Дребезг
Боротся с дребезгом тут уже не обязательно. Т.к. частота сканирования небольшая, так что даже голимая и наглухо окисленная кнопка модели ТМ2 не давала дребезга — он кончался раньше, чем наступал следующий скан. А вот что тут можно докурить, так это защиту от ложных сработок в результате наводок. Ведь стоит помехе продавить линию в момент считывания и засчитается сработка однократного нажатия. Это можно избежать сделав проверочные состояния автомата. Скажем добавив в Up счетчик итераций, чтобы в течении, скажем, двух-трех итераций подтвердить, что кнопка таки нажата и только тогда переходить в Dn.

Варианты
Правда в своем проекте я несколько изменил обработку. Т.к. мне не нужны были множественные длинные нажатия, то я сделал выставление флага «Длинное нажатие» сразу же в обработчике AL и, заодно, убрал подсчет числа длинных нажатий. Что позволило повысить отзывчивость работы интерфейса прибора, где длительным нажатием осуществлялся вход в пункт меню, а комбинаций с двумя длинными нажатиями не использовались вообще.

Ну и, разумеется, этот же конечный автомат можно поставить на разбор чего угодно. Например на отслеживание какого-либо другого флажка, от матричной клавиатуры или какого сигнального устройства.

пятница, 28 декабря 2012 г.

CODE Samples for IAR AVR

Atmega iar sample appnote filetype:pdf

http://www.ecse.rpi.edu/courses/CStudio/Silabs/Appnotes/ Code examples

http://netstorage.iar.com/SuppDB/Public/SUPPORT/000367/AVR_GettingStarted.pdf

http://netstorage.iar.com/SuppDB/Public/SUPPORT/000413/Avr-007.pdf



http://www.atmel.com/Images/doc8267.pdf Powerdown IAR
http://www.atmel.com/Images/doc1483.pdf
http://www.atmel.com/Images/doc8267.pdf
http://www.ee.oulu.fi/research/tklab/courses/521423S/2005/pdf/uavr.pdf
http://www.pumpkininc.com/content/doc/appnote/an-29.pdf
http://www.iar.com/Global/Resources/Developers_Toolbox/C_Cplusplus_Programming/Beyond%20volatile.pdf
http://www.ee.oulu.fi/research/tklab/courses/521423S/2005/pdf/aavr.pdf
http://www.state-machine.com/avr/QDK_AVR-IAR.pdf

http://www.ecse.rpi.edu/courses/CStudio/Silabs/Appnotes/

среда, 26 декабря 2012 г.

AVR (Code samples)

Очень много кода на pudn.com как работать с еепром:
http://read.pudn.com/downloads92/ebook/353805/IAR/eeprom.c__.htm

http://en.pudn.com/downloads50/sourcecode/embed/detail172365_en.html

искать через гугл или внутренний поиск по ключевым словам.

видимо там какая-то бонусная система наподобие едаборды (помимо независимого существования платных VIP-аккаунтов) - но разобраться с ней пока не удалось
5 закачал - 200 скачал. Если кто-то Ваш файл скачал, то Вам добавляется +1 на скачку.
Цитата
зарегистрироваться-зарегистрировался, но файлы загрузить на их сервер не удалось ((

Загрузка в верхнем меню здесь: 上载源码
Вводится имя:您的大名
Почтовый адрес совпадающий с регистрацией! :您的EMail
Ну естественно сам файл:文件
Выбрать категорию:
+ 源码 исходники
+ 电子书籍 книги
+ 文章/文档 статьи
Дальше там вариант "прочее" и описание "прочего", но думаю Вам не грозит этим воспользоваться smile.gif
Дальше понятнее smile.gif - выбор среды программирования.
Дополнительное описание: 详细功能
Разрешить или нет скачивать загруженный документ на халяву: 其他人不需帐号就可自由下载此源码
И последняя кнопка 上载 upload начинающаяся с очень простого иероглифа Shаng, как и ШанХай - "входить", "на/над", "верх" и более замысловатого Zǎi "нести"

P.S.
Я сам не пользуюсь - просто посмотрел....