Страница 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
А мне кажется что аффтару просто нужжно оформление прерываний показать :roll:

Добавлено: Пт авг 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
Хм... Программы пишут програмеры, за бабки. А мы тут только советуем и помогаем
Кстати да! Но если хош - давай ты будеш писать, а мы - подсказывать - ну типа что не так, как лудше... а так как ты хочеш :roll:

Добавлено: Пт авг 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
Ну во первых: есть функции задержки. Если под КодВижн, то подключаеш соотв. библиотеку:

Код: Выделить всё

#include <delay>
И так и пишеш

Код: Выделить всё

delay_ms(30);
Задержка на 30 миллисекунд

Код: Выделить всё

delay_us(30);
задержка на 30 наносекунд.
Да, многие скажут "Это не профессионально!"...
Не знаю... мне, как чайнику, в первой своей программе(которая ксати как раз переключала 8 светодиодов по программе) было очень весело и с delay. Т.е. для твоего кода, который ты привёл - это самое оно! :)))
Если же использовать прерывания, то надо программу делать не так. Я бы организовал двумерный массив. Строки - эффекты. допустим в одном эффекте 8 состояний портов. И эффектов 5. Значит массив у нас 5 строк по 8 столбцов. Координаты массива - глобальные переменные. В процедуре обработки прерывания выводим элемент массива в порт

Код: Выделить всё

PORTB=effect[i][j];
и в конце обработчика увеличиваем i чтобы при новом прерывании в порт выводился след. элемент эффекта.
Ну а в самой программе переключаем сам эффект изменением j...
Примерно так :roll: [/b]

Добавлено: Сб авг 11, 2007 00:24:27
tych
Negor писал(а):

Код: Выделить всё

delay_us(30);
задержка на 30 наносекунд.

Да, многие скажут "Это не профессионально!"...
и не верно !