Как написать прерывание цикла кнопкой? (CVAVR; C++; ATmega;)
Как написать прерывание цикла кнопкой? (CVAVR; C++; ATmega;)
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;}
};
};
Красным выделен текст, который необходимо прервать другой кнопкой...
Из-за того что в этом коде есть прерывание, то необходимо держать кнопку чтоб она сработала по окончании этих действий, помогите пожалуйста.
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
Дело в том, что функция delay библиотечная, и запросто вы в нее не влезете, чтобы выйти из нее. Лучший вариант предложен выше - по прерыванию.
Docendo discimus
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
Ок, спасибо намек понял, но вот тогда как каждый цикл увеличивать разряд?
ну к примеру:
0001
0010
0100
1000
Пока у меня в уме это функция... В который будет изменяться разряд...
ну к примеру:
0001
0010
0100
1000
Пока у меня в уме это функция... В который будет изменяться разряд...
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
заведи еще одну переменную-флаг, и в основном цикле отрабатывай ее, каждый раз увеличивая ее
- Реклама
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
Что-то типа такого?
Этот код будет повторять поведение, что описано в первом посте в case 2.
А если надо прокручивать единицу без состояния, в котором в портах записываются 0, тогда можно так:
или для разнообразия:
Код: Выделить всё
...
PORTE = (PORTE) ? (PORTE << 1) : (1);
PORTC = (PORTC) ? (PORTC << 1) : (1<<7);
... А если надо прокручивать единицу без состояния, в котором в портах записываются 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);
...
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
Придумал следующее, пока работает ):
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;
}
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;
}
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
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:
конец
синтаксис не точный но логика думаю ясна, хотя способов много
PORTA=10;
myWait;
PortB=2;
myWait;
exit:
конец
синтаксис не точный но логика думаю ясна, хотя способов много
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
Еще когда я учился в институте, преподы всегда говорили что использование GoTo это значит создание заведомо плохого алгоритма...
Вот у меня с тех пор и осталось правило без GoTo...
Но за идею все-равно спасибо...
Вот у меня с тех пор и осталось правило без GoTo...
Но за идею все-равно спасибо...
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
не совершай больших ошибок, Goto совершенно нормальная команда, а преподы и нетакое тебе посоветуют,
они редко выходят за пределы "стандартной программы"
GOTO плохой инструмент в руках не внимательного, как практикующий программист советую использовать где нужно
они редко выходят за пределы "стандартной программы"
GOTO плохой инструмент в руках не внимательного, как практикующий программист советую использовать где нужно
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
А еще могу рассказать что этот проект посвящаеться созданию контролируемых светодиодных ресничек на авто )))
Еще будет подсветка днища с RGB диодами, Где буду еще и яркость регулировать под управлением ШИМ.
Сейчас пока будет только базовый проект, касающийся оптики, потом перейду к днищу... Бамперам... Еще в дальнейшем будут установлены RGB диоды на крепления супортов и также контролируемы... В общем делаю уникальную подсветку.
Еще будет подсветка днища с RGB диодами, Где буду еще и яркость регулировать под управлением ШИМ.
Сейчас пока будет только базовый проект, касающийся оптики, потом перейду к днищу... Бамперам... Еще в дальнейшем будут установлены RGB диоды на крепления супортов и также контролируемы... В общем делаю уникальную подсветку.
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
ещё в догонку, почти никто при обучении не пытаеться рассматривать сразу различные варианты решений, делать тесты скорости и искать алгоритмы за пределами учебных ваириантов,
где то даже видел расказ о том как объектно ориентрованное программирование улучшает код мк, хотя на самом деле код просто становиться меньше в текстовом редакторе а на деле добавляеться куча циклов, лишних обращений к памяти и тд(если кто вообще в хекс смотрит)
также свитч - долгая хрень, если потом сделаешь большую программу в мк то и места и тактов тебе станет не хватать
где то даже видел расказ о том как объектно ориентрованное программирование улучшает код мк, хотя на самом деле код просто становиться меньше в текстовом редакторе а на деле добавляеться куча циклов, лишних обращений к памяти и тд(если кто вообще в хекс смотрит)
также свитч - долгая хрень, если потом сделаешь большую программу в мк то и места и тактов тебе станет не хватать
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
почему не сразу с шим?
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
Ну пока хочу попробовать, что из этого получиться, я только спаял схему на Atmega 128L (ее бесплатно на предприятии прихватил =)) Единственное, подцепил все диоды на ножки МК сразу, так как не имею транзюков... Есть разве что вот такие микросхемы: IN74HC574A Даташит во вложении, но не могу заставить светиться диоды через него, Схему добавил во влежение тоже
- Вложения
-
- LED connection scheme 001.jpg
- (160.77 КБ) 580 скачиваний
-
- IN74HC574A.pdf
- (111.29 КБ) 443 скачивания
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
ну если на ОЕ ты подал ноль, на CLK ноль, поставил порты и мигнул 1 на CLK, то должно было заработать
----------------
Клок вешаешь на порт, ОЕ на порт и програмируй как строкой выше
----------------
Клок вешаешь на порт, ОЕ на порт и програмируй как строкой выше
Последний раз редактировалось mazda Вс мар 04, 2012 01:00:11, всего редактировалось 1 раз.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
Может кто знает, что не так я сделал, в подключении
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
так ведь написал
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
Так, так а зачем ноль на OE он вроде как не инвертный...
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
в pdf на превой странице сказано что инвертный и табличка управления приведена
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Re: Как написать прерывание цикла кнопкой? (CVAVR; C++; ATme
БЛИИИИИИН я в эту Function table вообще не глядел, посчитал что там сильно заумно написано и забил на нее )))) Оказываеться L это типо пониженый сигнал а H повышенный Low & High ))) Спасибо, что открыл глаза



