Страница 1 из 2
ПрЕрывания в WinAVR...
Добавлено: Чт авг 09, 2007 23:11:42
Krik99
Дарова!!!
Я недавно начял изучать Си для микроконтроллёры AVR и остановился на прирываниях. Для того чтобы научиться работать с прирываниями на контроллёре Atmega 8 я хочу написать простую программу с использованием прирываний.
Я хочу написать программу которая мигала б раз в минуту светодиодом и при нажатие на кнопку чтобы загорался второй светодиод но при этом чтобы первый светодиод не прикращал мигать. И по отпусканию кнопки второй светодиод гас а первый всёравно мигал раз в минуту. Желательно чтобы программа была написана под WinAVR.
За ранние благодарен!!!
Добавлено: Пт авг 10, 2007 00:10:17
Serega
А кто-нибудь понял, что аффтар хотел сказать своим оптимистичным постом?

В чем собсна вопрос, любезнейший? Вам программу написать, или вы просто хотели похвастаться своими планами?

Добавлено: Пт авг 10, 2007 08:34:39
KT315B
Короче, похоже, что аффтар хочет мигать одним светодиодом по таймеру, а другим - по внешнему прерыванию... Хоть я и не телепат, конечно =)
Добавлено: Пт авг 10, 2007 08:47:04
Mr.Moss
Наверное автор хочет чтоб здесь оценили верность хода мыслей, и если неверны, поправили.
Добавлено: Пт авг 10, 2007 08:51:52
Negor
А мне кажется что аффтару просто нужжно оформление прерываний показать

Добавлено: Пт авг 10, 2007 09:00:13
KT315B
Дык в чем тогда проблема? Добро пожаловать в Обучалку:
http://www.radiokot.ru/start/mcu_fpga/avr/10/
Re: Прирывания в WinAVR...
Добавлено: Пт авг 10, 2007 09:38:02
tych
Krik99 писал(а):Я недавно начял изучать Си для микроконтроллёры AVR и остановился на прирываниях.
Для того чтобы научиться работать с прирываниями на контроллёре Atmega 8 я хочу написать простую программу с использованием прирываний.
Я сделал програмку управл. кнопками и показывающую взаимодействие прерываний в AVR - см стр. 3 под кнопкой "www".
А первые шаги с WinAVR и Astudio на странице 4 подробнейше и с картинками - советую почитать и проделать.
Добавлено: Пт авг 10, 2007 10:31:16
Krik99
кароче мне надо чтобы две операции выполнялись одновременно. Ну типа мигание светодиодом и проверка нажатия кнопки и если кнопка нажата то второй светоиод должен загорется. И можно приделать ещё один третий светодиод который будет загоратся раз в две минуты.
Добавлено: Пт авг 10, 2007 10:53:15
Mr.Moss
Все просто.
Включаеш таймер, включаеш прерывание компаратора этого таймера,
по этому прерыванию будет светится первый светодиод (не забудь про задержку), задаеш с какой частотой будет срабатывать прерывание, в основном цикле опрашивай кнопку от которой будет светится второй светодиод, и все.
С третим светодиодом анологично что и с первым.
Добавлено: Пт авг 10, 2007 10:59:03
Krik99
Mr.Moss это я так и думал.
Но немоглибы хоть както программу набросать на Си просто на примере легче изучать. Заранние благодарен!

Добавлено: Пт авг 10, 2007 11:45:34
Томатный
что-то типа такого
Добавлено: Пт авг 10, 2007 13:33:32
Krik99
Да спасибо чтото типа этого. Получается что выполняется две операции одновременно. Биг сенкс!!!

Добавлено: Пт авг 10, 2007 14:19:35
Krik99
Да ещёё можно попросить написать программу герлянд ну например три эфекта и кнопка которой эти эфекты переключать. За ранние благодарен!!!
Добавлено: Пт авг 10, 2007 15:18:52
Serega
Хм... Программы пишут програмеры, за бабки. А мы тут только советуем и помогаем

Добавлено: Пт авг 10, 2007 15:38:10
Negor
Хм... Программы пишут програмеры, за бабки. А мы тут только советуем и помогаем
Кстати да! Но если хош - давай ты будеш писать, а мы - подсказывать - ну типа что не так, как лудше... а так как ты хочеш

Добавлено: Пт авг 10, 2007 17:37:34
Krik99
Ок! Сегодне набросая программу а вы мне поможете. Ок?!

Да и чем лутче делать паузы между веключением и выключением одного канала герлянд, ну типа зажог первый канал через 1 сек. потушил первый канал и зажог второй канал тоже через 1сек.??? Как зажигать и тушить светодиоды я знаю но не знаю как лутче написать паузу между ними.
Добавлено: Пт авг 10, 2007 19:15:13
Serega
Паузу - на таймерах, есесно.
Делаем прерывание на событие таймера (overflow или compare). По событию переключаемся
Добавлено: Пт авг 10, 2007 21:40:49
Krik99
Можно поподробние про паузу.
Вот тут я напсал кусок программы в которой хранятся эфекты в ней только осталось поставить паузы вместо ????? скоро добавлю до этой проги выбор эфектов кнопкой.
Вот код:
Код: Выделить всё
switch (prog)
{
case 0: //Эфект бегущий огонь.
PORTB=0xEF; //Зажигаем первый канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xFF; //Тушим первый канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xDF; //Зажигаем второй канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xFF; //Тушим второй канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xDF; //Зажигаем третий канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xFF; //Тушим третий канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0x7F; //Зажигаем четвёртый канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xFF; //Тушим четвёртый канал герлянд.
break;
case 1: //Эфект мирцания.
PORTB=0xAF; //Зажигаем второй и четвёртый канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xFF; //Тушим второй и четвёртый канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0x5F; //Зажигаем первый и третий канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xFF; //Тушим второй и четвёртый канал герлянд.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0x0F; //Зажигаем все каналы герлянды.
???? //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xFF; //Тушим все каналы герлянды.
???? //Тут пишем ПАУЗУ в 1 сек.
break;
}
Добавлено: Пт авг 10, 2007 23:03:22
Negor
Ну во первых: есть функции задержки. Если под КодВижн, то подключаеш соотв. библиотеку:
И так и пишеш
Задержка на 30 миллисекунд
задержка на 30 наносекунд.
Да, многие скажут "Это не профессионально!"...
Не знаю... мне, как чайнику, в первой своей программе(которая ксати как раз переключала 8 светодиодов по программе) было очень весело и с delay. Т.е. для твоего кода, который ты привёл - это самое оно!
Если же использовать прерывания, то надо программу делать не так. Я бы организовал двумерный массив. Строки - эффекты. допустим в одном эффекте 8 состояний портов. И эффектов 5. Значит массив у нас 5 строк по 8 столбцов. Координаты массива - глобальные переменные. В процедуре обработки прерывания выводим элемент массива в порт
и в конце обработчика увеличиваем
i чтобы при новом прерывании в порт выводился след. элемент эффекта.
Ну а в самой программе переключаем сам эффект изменением
j...
Примерно так

[/b]
Добавлено: Сб авг 11, 2007 00:24:27
tych
Negor писал(а):
задержка на 30 наносекунд.
Да, многие скажут "Это не профессионально!"...
и не верно !