Как написать прерывание цикла кнопкой? (CVAVR; C++; ATmega;)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
riddickos
Родился
Сообщения: 17
Зарегистрирован: Ср фев 29, 2012 12:43:35

Как написать прерывание цикла кнопкой? (CVAVR; C++; ATmega;)

Сообщение riddickos »

PORTD=0xFF;
DDRD=0x00;
PORTC=0x00;
DDRC=0xFF;
PORTE=0x00;
DDRE=0xFF;

while (1)
{
if (!PIND.0)
{c++; delay_ms(50);
if (c==3) {c=0;}
};

switch (c)
{
case 1:
break;

case 2:
{
PORTE=0b00000001; PORTC=0b10000000; delay_ms(1000);
PORTE=0b00000010; PORTC=0b01000000; delay_ms(1000);
PORTE=0b00000100; PORTC=0b00100000; delay_ms(1000);
PORTE=0b00001000; PORTC=0b00010000; delay_ms(1000);
PORTE=0b00010000; PORTC=0b00001000; delay_ms(1000);
PORTE=0b00100000; PORTC=0b00000100; delay_ms(1000);
PORTE=0b01000000; PORTC=0b00000010; delay_ms(1000);
PORTE=0b10000000; PORTC=0b00000001; delay_ms(1000);
PORTE=0;PORTC=0;
delay_ms(1000);
break;
}
};
};
Красным выделен текст, который необходимо прервать другой кнопкой...
Из-за того что в этом коде есть прерывание, то необходимо держать кнопку чтоб она сработала по окончании этих действий, помогите пожалуйста.
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение Мастер Ломастер »

подход неверный, соответственно, и реализация затруднена. сделайте изменение состояния порта по прерываниям 1 раз в секунду, а вот кнопку непрерывно опрашивайте в основном цикле, разрешая или запрещая изменение порта. будет в 100 раз проще.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение pyzhman »

Дело в том, что функция delay библиотечная, и запросто вы в нее не влезете, чтобы выйти из нее. Лучший вариант предложен выше - по прерыванию.
Docendo discimus
riddickos
Родился
Сообщения: 17
Зарегистрирован: Ср фев 29, 2012 12:43:35

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение riddickos »

Ок, спасибо намек понял, но вот тогда как каждый цикл увеличивать разряд?
ну к примеру:
0001
0010
0100
1000
Пока у меня в уме это функция... В который будет изменяться разряд...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение Flasher »

заведи еще одну переменную-флаг, и в основном цикле отрабатывай ее, каждый раз увеличивая ее
Реклама
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение IfoR »

Что-то типа такого?

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

...

PORTE = (PORTE) ? (PORTE << 1) : (1);  
PORTC = (PORTC) ? (PORTC << 1) : (1<<7);  

... 
Этот код будет повторять поведение, что описано в первом посте в case 2.

А если надо прокручивать единицу без состояния, в котором в портах записываются 0, тогда можно так:

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

...

PORTE <<=1; if (!PORTE) PORTE = 1; 
PORTC >>=1; if (!PORTC) PORTC = 1<<7; 

...
 
или для разнообразия:

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

...

(PORTE <<= 1) ? 0 : (PORTE = 1);  
(PORTC >>= 1) ? 0 : (PORTC = 1<<7);  

...
  
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Реклама
riddickos
Родился
Сообщения: 17
Зарегистрирован: Ср фев 29, 2012 12:43:35

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение riddickos »

Придумал следующее, пока работает ):
int razrR(int i)
{int j;
switch (i){
case 1: j=1; break;
case 2: j=2; break;
case 3: j=4; break;
case 4: j=8; break;
case 6: j=16; break;
case 7: j=32; break;
case 8: j=64; break;
case 9: j=128; break;}
return j;};
int razrL(int i)
{int j;
switch (i){
case 1: j=128; break;
case 2: j=64; break;
case 3: j=32; break;
case 4: j=16; break;
case 6: j=8; break;
case 7: j=4; break;
case 8: j=2; break;
case 9: j=1; break;}
return j;};

case 2:
{for (k=0; k<=9; k++)
{PORTE=razrL(k-1); PORTC=razrR(k); delay_ms(1000);
if (!PIND.0) break;
}
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение mazda »

define myWait (for (i=0;i++;i<1000) if PINC==1 then {k=1;break;} if k==1 then goto exit;)

PORTA=10;
myWait;
PortB=2;
myWait;

exit:

конец

синтаксис не точный но логика думаю ясна, хотя способов много
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
riddickos
Родился
Сообщения: 17
Зарегистрирован: Ср фев 29, 2012 12:43:35

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение riddickos »

Еще когда я учился в институте, преподы всегда говорили что использование GoTo это значит создание заведомо плохого алгоритма...
Вот у меня с тех пор и осталось правило без GoTo...
Но за идею все-равно спасибо...
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение mazda »

не совершай больших ошибок, Goto совершенно нормальная команда, а преподы и нетакое тебе посоветуют,
они редко выходят за пределы "стандартной программы"
GOTO плохой инструмент в руках не внимательного, как практикующий программист советую использовать где нужно
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
riddickos
Родился
Сообщения: 17
Зарегистрирован: Ср фев 29, 2012 12:43:35

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение riddickos »

А еще могу рассказать что этот проект посвящаеться созданию контролируемых светодиодных ресничек на авто )))
Еще будет подсветка днища с RGB диодами, Где буду еще и яркость регулировать под управлением ШИМ.
Сейчас пока будет только базовый проект, касающийся оптики, потом перейду к днищу... Бамперам... Еще в дальнейшем будут установлены RGB диоды на крепления супортов и также контролируемы... В общем делаю уникальную подсветку.
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение mazda »

ещё в догонку, почти никто при обучении не пытаеться рассматривать сразу различные варианты решений, делать тесты скорости и искать алгоритмы за пределами учебных ваириантов,
где то даже видел расказ о том как объектно ориентрованное программирование улучшает код мк, хотя на самом деле код просто становиться меньше в текстовом редакторе а на деле добавляеться куча циклов, лишних обращений к памяти и тд(если кто вообще в хекс смотрит)

также свитч - долгая хрень, если потом сделаешь большую программу в мк то и места и тактов тебе станет не хватать
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение mazda »

почему не сразу с шим?
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
riddickos
Родился
Сообщения: 17
Зарегистрирован: Ср фев 29, 2012 12:43:35

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение riddickos »

Ну пока хочу попробовать, что из этого получиться, я только спаял схему на Atmega 128L (ее бесплатно на предприятии прихватил =)) Единственное, подцепил все диоды на ножки МК сразу, так как не имею транзюков... Есть разве что вот такие микросхемы: IN74HC574A Даташит во вложении, но не могу заставить светиться диоды через него, Схему добавил во влежение тоже
Вложения
LED connection scheme 001.jpg
(160.77 КБ) 580 скачиваний
IN74HC574A.pdf
(111.29 КБ) 443 скачивания
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение mazda »

ну если на ОЕ ты подал ноль, на CLK ноль, поставил порты и мигнул 1 на CLK, то должно было заработать

----------------
Клок вешаешь на порт, ОЕ на порт и програмируй как строкой выше
Последний раз редактировалось mazda Вс мар 04, 2012 01:00:11, всего редактировалось 1 раз.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
riddickos
Родился
Сообщения: 17
Зарегистрирован: Ср фев 29, 2012 12:43:35

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение riddickos »

Может кто знает, что не так я сделал, в подключении
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение mazda »

так ведь написал
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
riddickos
Родился
Сообщения: 17
Зарегистрирован: Ср фев 29, 2012 12:43:35

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение riddickos »

Так, так а зачем ноль на OE он вроде как не инвертный...
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение mazda »

в pdf на превой странице сказано что инвертный и табличка управления приведена
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
riddickos
Родился
Сообщения: 17
Зарегистрирован: Ср фев 29, 2012 12:43:35

Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme

Сообщение riddickos »

БЛИИИИИИН я в эту Function table вообще не глядел, посчитал что там сильно заумно написано и забил на нее )))) Оказываеться L это типо пониженый сигнал а H повышенный Low & High ))) Спасибо, что открыл глаза
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»