Чесности ради замечу, что на эту книгу есть ссылка в "курсе", она выложена в архиве вместе с FAQ по курсу. Так что господину АВР большое человеческое спасибо
steel_monkey писал(а):качайте книжку "Pardue J.C programming for microcontrollers.2005" со страницы http://ihtik.lib.ru/dreamhost_electrote ... v2007.html (799 в списке), распечатывайте и читайте. Книга на английском, но написана очень толково, структурировано, с примерами.
Я давно уже (18 янв 2007) сделал топик об этой книге и указал где скачать У НАС В БИБЛИОТЕКЕ форума. viewtopic.php?f=19&t=2031
Приветствую всех, господа!) Я смотрю в последнее время в этой части форума активность не бьет рекорды)), может быть мы это поправим, а заодно поможем мне советом)?
Господа прошу вас помочь в таком плане. Думаю, многим это будет также интересно. Дело в том, что многие из нас при более или менее сносном знании основ языка программирования на первых же порах сталкиваются с проблемой такого понятия как алгоритм... Знать, как работают операторы ветвления и циклов, дело одно, совершенно другое - это понять, как с помощью ограниченного количества команд воплотить все не дюжие амбиции начинающего “емббедера”... Теперь непосредственно задача: С помощью языка C (для мк AVR) реализовать программу опрашивающую некоторое количество кнопок и в зависимости от них соответствующе действовать. Программа разделена на несколько функций-подпрограмм (например: АЦП и его вывод на ЖКИ, измерение температуры и вывод ее на тот же ЖКИ) выполнение между которыми переключается последовательным нажатием одной из кнопок (MODE). Начавшись однажды, выбранная функция должна работать незавершаясь до следующего нажатия MODE. Что бы не загромождать пост лишним кодом, приведу только каркас одной из программ (компилятор CodeVision AVR 1.25.5):
while(BUTTON_MODE) //Делать пока не нажата клавиша смены режима { ..... //Тело func_y }
#asm("sei") //прерывания: вкл. }
Пример я это привел из-за сомнения в его оптимальности... У меня есть определенные сомнения насчет момента нажатия клавиши MODE – получится, что при нажатии функция должна закончить свое выполнение и в тот же момент перейти в тело функции timer0_ovf_isr, насколько оптимален такой подход? Может у кого-то есть свои идеи, которыми он может поделиться? Второй момент который меня подтолкнул на написание этого поста – тот факт что приведенный выше пример являет собой наверное самый простой метод в работе с клавишами и их опросом. Но существуют ведь и различные вариации на эту тему, в одном из случаев у меня возник вот такой момент: Имеется абсолютно такого же принципа программка, что и приведенная выше, за исключением работы одной из функций – в ней происходит управление работой ШИ-регулятора МК (реализуется попросту простейший “реобас”) и функция должна соответственным образом уметь изменять величину заполнения (не знаю насколько справедлив такой термин, но в известном всем курсе avr123.nm.ru это называется “величина ШИМ”) в зависимости от состояния присутствующих на внешних входах МК, кнопок “ПЛЮС” и “МИНУС”, то есть по сути цель функции инкрементировать \ декрементировать регистр OCR1xx. Так вот если применить выше представленный пример то работать это конечно же не будет – пока не нажата клавиша смены режима, ни на какие действия в отношении других кнопок, программа реагировать не будет... Естественно возникает желание сделать логическое “И” между клавишей MODE и двумя оставшимися... К сожалению все усугубляется отсутствием работающего девайса, на котором можно провести эксперименты и отладку, мною используется все известный симулятор ISIS из пакета Proteus (7.1 SP2) в котором подобная затея успехом не венчалась, имеются проблемы. Не вдаваясь в их суть, хочу опять таки спросить, если у кого-то свои идеи по этому поводу? (Я имею виду реализацию таких функций). Неужели придется вешать кнопку MODE на внешнее прерывание? Тем, кто хотел бы мне помочь прилагаю ссылку на архив с проектом (схема в ISIS, проект в CVAVR) где собственно у меня и возникают сомнения насчет оптимальности используемого алгоритма (отмечаю сразу в ISIS все работает, причем “на глаз” даже вполне нормально, просто хочется узнать мнение по поводу рациональности того “бардака” что пришлось организовать...) http://cp.people.overclockers.ru/cgi-bin/dl.pl?id=26068&filename=Device_X.rar
Я бы советовал быть в обработчике прерывания как можно меньше времени.
1) Опрашивать кнопки из таймера - это как то не очень... 2) ...лучше уж аппаратные прерывания на них повесить. 3) Что-б не занимать прерывния долго, по его приходу взводите переменую "флаг", а потом в основном цикле обрабатываете и сбрасываете флаг.
Добрый день. Столкнулся с проблемой. разабатываю блок питания на МК atmega8. Не могу реализовать режим стабилизации по току. Пробовал вот так ток скачет даже на стабильной нагрузке +-200мА да еще и скорость реакции медленная
//Режим стабилизации по току /* if (Vdec>ZNACH_STAB) { //если измеренное больше установленного if (OCR2!=0) { //ограничение по границам байта
delay_ms(10); OCR2--; };}; //уменьшить значение ШИМ
if (Vdec<ZNACH_STAB) { //если измеренное меньше установленног if (OCR2!=255) { //ограничение по границам байта delay_ms(10); OCR2++;}; }; //увеличить значение ШИМ
Пробовал увеличить разрядность для более тонкой настройки, ток скачет вообще в пределах 1А
Ну а вприведенном мною коде можно ли как-нибудь добиться стабильности? Или только использование ПИД? Я просто никогда не сталкивался с ПИД регулированием. И не очень понимаю как его программно реализовать
посмотрите appnote AVR221 там и реализация алгоритма на Си (и несложно переписать в класс С++) под IAR но легко переписывается под другие компиляторы, почти все стандартный си.