Приветствую всех, господа!) Я смотрю в последнее время в этой части форума активность не бьет рекорды)), может быть мы это поправим, а заодно поможем мне советом)?
Господа прошу вас помочь в таком плане. Думаю, многим это будет также интересно. Дело в том, что многие из нас при более или менее сносном знании основ языка программирования на первых же порах сталкиваются с проблемой такого понятия как алгоритм... Знать, как работают операторы ветвления и циклов, дело одно, совершенно другое - это понять, как с помощью ограниченного количества команд воплотить все не дюжие амбиции начинающего “емббедера”... Теперь непосредственно задача: С помощью языка C (для мк AVR) реализовать программу опрашивающую некоторое количество кнопок и в зависимости от них соответствующе действовать. Программа разделена на несколько функций-подпрограмм (например: АЦП и его вывод на ЖКИ, измерение температуры и вывод ее на тот же ЖКИ) выполнение между которыми переключается последовательным нажатием одной из кнопок (MODE). Начавшись однажды, выбранная функция должна работать незавершаясь до следующего нажатия MODE. Что бы не загромождать пост лишним кодом, приведу только каркас одной из программ (компилятор CodeVision AVR 1.25.5):
Код:
#define BUTTON_PLUS PINx.x
#define BUTTON_MINUS PINx.x
#define BUTTON_MODE PINx.x
char mode = 1;
interrupt [TIM0_OVF] void timer0_ovf_isr(void) //Переполнение по timer_0 (3906Khz)
{
if(!BUTTON_MODE) //Если нажата клавиша MODE
{
mode ^= 1; //При каждом нажатии клавиши, менять режим
}
if(mode == 0)
{
func_x();
}
else
{
func_y();
}
}
void func_x(void)
{
#asm("cli") //прерывания: выкл.
while(BUTTON_MODE) //Делать пока не нажата клавиша смены режима
{
..... //Тело func_x
}
#asm("sei") //прерывания: вкл.
}
void func_y(void)
{
#asm("cli") //прерывания: выкл.
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