|
Мгновенно реагировать на нажатие кнопки. Attiny 2313, прерывания |
|
|
|
Mar 8 2013, 20:12
|
Частый гость
 
Группа: Участник
Сообщений: 114
Регистрация: 3-10-09
Пользователь №: 52 731

|
Учусь программировать под Attiny 2313, написал такую программку: Если нажать на кнопку, то запускается цикл мигания 6 светодиодов, если в конце мигания шестого светодиода нажать кнопку, то мигание выключится. Вот код для gcc: Код unsigned char LIGHT = 0; while (1) { // Если свет не горит и нажата кнопку if (LIGHT == 0 && bit_is_clear(PIND,0)) { // Включить свет while (LIGHT == 0) { PORTB = 0b11111110; _delay_ms(200); PORTB = 0b11111101; _delay_ms(200); PORTB = 0b11111011; _delay_ms(200); PORTB = 0b11110111; _delay_ms(200); PORTB = 0b11101111; _delay_ms(200); PORTB = 0b11011111; _delay_ms(200); // Если нажата кнопка, то выключаем свет if (bit_is_clear(PIND,0)) { PORTB = 0b11111111; _delay_ms(200); LIGHT = 1; } } } // Если свет выключен и нажата кнопка, то включаем свет if (LIGHT == 1 && bit_is_clear(PIND,0)) { LIGHT = 0; } } Работает как я и планировал, но есть одна недоработка. Как сделать так, чтобы нажав на кнопку в ЛЮБОЙ момент времени светодиоды остановились мигать (а не только в конце цикла мигания)? подскажите куда копать? если есть простой пример на Си буду рад его изучить.
Сообщение отредактировал aivs - Mar 8 2013, 20:14
|
|
|
|
|
 |
Ответов
|
Mar 16 2013, 10:43
|
Частый гость
 
Группа: Участник
Сообщений: 114
Регистрация: 3-10-09
Пользователь №: 52 731

|
Вопрос про прерывания. Решил для отслеживания нажатия кнопки использовать прерывание по таймеру, соответственно переопределил вектора прерываний:
;--------- Переопределение векторов прерываний start rjmp init ; 0x0000 Переход на начало программы reti ; 0x0001 Внешнее прерывание 0. reti - завершение подпрограммы обработки прерывания reti ; 0x0002 Внешнее прерывание 1 reti ; 0x0003 Таймер/счетчик 1, захват rjmp prtim1 ; 0x0004 Таймер/счетчик 1, совпадение канал А reti ; 0x0005 Таймер/счетчик 1, прерывание по переполнению reti ; 0x0006 Таймер/счетчик 0, прерывание по переполнению reti ; 0x0007 Прерывание UART прием завершение reti ; 0x0008 Прерывание UART регистр данных пуст reti ; 0x0009 Прерывание UART передача завершена reti ; 0x0010 Прерывание по компаратору reti ; 0x0011 Прерывание по изменению на любом контакте reti ; 0x0012 Таймер/счетчик 1, совпадение канал B reti ; 0x0013 Таймер/счетчик 0, совпадение канал B reti ; 0x0014 Таймер/счетчик 0, совпадение канал А reti ; 0x0015 USI готовность к старту reti ; 0x0016 USI переполнение reti ; 0x0017 EEPROM готовность reti ; 0x0018 Переполнение охранного таймера
Вектор прерывания по совпадению таймера 1 ведёт на подпрограмму prtim1. Два вопроса: 1) У меня в программе используется только прерывания по таймеру, значит по адресу 0x0004 должна быть инструкция перехода на подпрограмму обработки прерывания, если я вообще не опишу таблицу векторов прерываний, то при сработке прерывания выполнится инструкция по адресу 0x0004? 2) Как еще описывают таблицу векторов прерываний, без использования reti? Я так понимаю до адреса вызова "rjmp prtim1" обязательно должны быть какие нибудь nop ?
Сообщение отредактировал aivs - Mar 16 2013, 10:43
|
|
|
|
Сообщений в этой теме
aivs Мгновенно реагировать на нажатие кнопки. Attiny 2313 Mar 8 2013, 20:12 mempfis_ Цитата(aivs @ Mar 8 2013, 23:12) Как сдел... Mar 8 2013, 20:27 kovigor Цитата(aivs @ Mar 8 2013, 23:12) Как сдел... Mar 9 2013, 04:24 mempfis_ Цитата(kovigor @ Mar 9 2013, 07:24) По-на... Mar 9 2013, 08:19 sigmaN Могу предложить рабочий кусок кода с простеньким п... Mar 9 2013, 11:13 aivs Выкладывайте, изучу, спасибо за помощь Mar 9 2013, 17:19 ARV примитивные решения. надо многозадачную ОС для реш... Mar 9 2013, 17:44 kovigor Цитата(ARV @ Mar 9 2013, 20:44) примитивн... Mar 9 2013, 18:04 ILYAUL Цитата(ARV @ Mar 9 2013, 21:44) примитивн... Mar 9 2013, 22:37 sigmaN Цитатаримитивные решения. надо многозадачную ОС дл... Mar 9 2013, 18:01 sigmaN Вообще нет, надо отечественный четырехядерник ста... Mar 9 2013, 22:56 toweroff Цитата(sigmaN @ Mar 10 2013, 02:56) Вообщ... Mar 10 2013, 06:33  kolobok0 Цитата(toweroff @ Mar 10 2013, 10:33) ...... Mar 11 2013, 10:37 PheeL Цитата(sigmaN @ Mar 10 2013, 02:56) Вообщ... Mar 11 2013, 13:43 sigmaN Ну это само собой! RT патч только не забыть)))... Mar 11 2013, 18:47 Herz Цитата(sigmaN @ Mar 11 2013, 20:47) P.S. ... Mar 11 2013, 19:50 aivs Решил пока освоить прерывания INT0 и INT1 для реше... Mar 13 2013, 12:19 kovigor Цитата(aivs @ Mar 13 2013, 15:19) Что не ... Mar 13 2013, 14:14 aivs Разобрался с fuse битами
По умолчанию настройка fu... Mar 13 2013, 15:18 alexeyv 1) Да. Некоторые функции, в том числе и _delay_ms ... Mar 14 2013, 02:26 ILYAUL ((SYSCLK/(2*USARTSPEED))-1)= ( (F_CPU+((__pr)*8L))... Mar 14 2013, 06:57 ARV вообще говоря, есть в комплекте WinAVR готовый хид... Mar 14 2013, 08:51 ILYAUL А на хер он сдался , если так проще ) Mar 14 2013, 09:18 ARV Цитата(ILYAUL @ Mar 14 2013, 13:18) А на ... Mar 14 2013, 17:38 alexeyv Цитатавообще говоря, есть в комплекте WinAVR готов... Mar 14 2013, 10:00 ILYAUL Цитата...чтобы думать о важном, а не второстепенны... Mar 14 2013, 18:54 Xenia Цитата(aivs @ Mar 16 2013, 14:43) Два воп... Mar 16 2013, 18:01 ILYAUL ЦитатаХотя именно поэтому в программировании на ас... Mar 16 2013, 18:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|