Я благодарен за помощь,но я так и не понял как можно сделать опрос
Помогите подключить кнопку
-
~=ieroglif=~
- Первый раз сказал Мяу!
- Сообщения: 32
- Зарегистрирован: Пн авг 31, 2015 09:14:42
Re: Помогите подключить кнопку
Попробую объяснить. Первый вариант самый простой - опрос по прерыванию таймера. То есть, например, 10 раз в секунду возникает прерывание.
Я благодарен за помощь,но я так и не понял как можно сделать опрос
Я благодарен за помощь,но я так и не понял как можно сделать опрос
Ученье свет,а неученье - тьма... чуть свет и на работу ...
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Помогите подключить кнопку
Открываете даташит или Евстифеева и читаете как вызывать прерывания с нужной частотой. В обработчике пишете проверку кнопки. Самое простое по вашему же образцу.
Код: Выделить всё
volatile char sw=0;
ISR(TIMER0_OVF_vect){
if( PINB & (1<<3) )sw++;
}Re: Помогите подключить кнопку
Переделал немного проект ~=ieroglif=~(думаю что упрости). Прерывания конечно вещь сильная - в более сложных проектах без них никуда, но в данном проекте мне кажется что можно обойтись и без них, да и ~=ieroglif=~ еще рановато говорить про прерывания.
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000
int main(void)
{
int sw=0;
int array[4]={0b00000001,0b00000100,0b00010000,0b01000000}; // мигание 1,3,5,7 светодиодами
int yarra[4]={0b01000000,0b00010000,0b00000100,0b00000001}; // мигание 7,5,3,1 светодиодами
DDRD &= ~(1<<PD3);
DDRA = 0b11111111;
PORTA = 0b00000000;
while(1)
{
if (PIND & (1 << PIND3))
{
_delay_ms(50);
while(PIND & (1 << PIND3));
sw++;
}
switch (sw)
{
case 0:
PORTA = 0b01010101;
break;
case 1:
for (int i = 0; i < 4; i++)
{
PORTA=array[i];
_delay_ms(250);
};
break;
case 2:
for (int i = 0; i < 4; i++)
{
PORTA=yarra[i];
_delay_ms(250);
};
break;
case 3:
PORTA = 0b00010100;
break;
case 4:
PORTA = 0b01000001;
break;
case 5:
PORTA = 0b00010001;
break;
case 6:
PORTA = 0b01010000;
break;
case 7:
PORTA = 0b00000101;
sw=0;
break;
}
}
}- Вложения
-
- На форум.rar
- (31.52 КБ) 114 скачиваний
Все гениальное - просто
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Помогите подключить кнопку
Можно, конечно, и без прерываний, я даже написал как - конечный автомат в помощь. А ваш код принципиально ничем не лучше кода ~=ieroglif=~. Ну добавили защиту от дребезга, но все равно чтобы переключить режим надо дождаться окончания анимации. А прерывания учить не рано, это одна из самых базовых вещей контроллера.
-
~=ieroglif=~
- Первый раз сказал Мяу!
- Сообщения: 32
- Зарегистрирован: Пн авг 31, 2015 09:14:42
Re: Помогите подключить кнопку
На конец таки я это сделал. поборол всё же анимацию во время переключения,вот только не пойму как он входит в обработчик прерываний,точнее когда ?Ведь в main нет "ссылки" или "перехода" на обработчик.
Код: Выделить всё
*
* AVRGCC2.c
*
* Created: 26.07.2016 23:40:50
* Author: ieroglif
*/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> // БИБЛИОТЕКА ПРЕРЫВАНИЙ
void programs();
void DDR_ALL_PORT();
int sw=0;
int array[4]={0b00000001,0b00000100,0b00010000,0b01000000}; // мигание 1,3,5,7 светодиодами
int yarra[4]={0b01000000,0b00010000,0b00000100,0b00000001}; // мигание 7,5,3,1 светодиодами
ISR (TIMER0_OVF_vect) //прерывание по переполнению
{
TCCR0 = (0 << WGM01) | (0 << WGM00); // ОСТАНОВКА ТАЙМЕРА
TCNT0 = 110; // НАЧАЛЬНЫЙ СЧЁТ ТАЙМЕРА
TIFR = (1 << TOV0); // УСТАНОВКА ПЕРЕПОЛНЕНИЯ СЧЁТНОГО РЕГИСТРА
TIMSK = (1 << TOIE0); // РАЗРЕШЕНИЕ НА ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ
TCCR0 = (1 << CS02) | (0 << CS01) | (1 << CS00); // УСТАНОВКА ПРЕДДЕЛИТЕЛЯ
if (PIND & (1 << PIND3))
{
sw++;
}
}
int main(void)
{
DDR_ALL_PORT();
TCCR0 = 0;
TCCR0 = (0 << WGM01) | (0 << WGM00); // ОСТАНОВКА ТАЙМЕРА
TCNT0 = 110; // НАЧАЛЬНЫЙ СЧЁТ ТАЙМЕРА
TIFR = (1 << TOV0); // УСТАНОВКА ПЕРЕПОЛНЕНИЯ СЧЁТНОГО РЕГИСТРА
TIMSK = (1 << TOIE0); // РАЗРЕШЕНИЕ НА ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ
TCCR0 = (1 << CS02) | (0 << CS01) | (1 << CS00); // УСТАНОВКА ПРЕДДЕЛИТЕЛЯ
sei();
while(1)
{
programs();
}
}
void programs()
{
switch (sw)
{
case 1:
for (int i = 0; i < 4; i++)
{
PORTA=array[i]; // можно также использовать побитовый сдвиг. PORTA = 0b00000000 << i;
_delay_ms(250);
};break;
case 2:
for (int i = 0; i < 4; i++)
{
PORTA=yarra[i];
_delay_ms(250);
};break;
case 3:
PORTA = 0b00000101;
_delay_ms(250);
PORTA = 0b01010000;
_delay_ms(250);break;
case 4:
PORTA = 0b01000001;
_delay_ms(250);break;
case 5:
PORTA = 0b00000101;
_delay_ms(250);break;
case 6:
PORTA = 0b01010000;
_delay_ms(250);break;
case 7:
PORTA = 0b01010101;
_delay_ms(250);break;
default:sw=0;break;
}
}
void DDR_ALL_PORT()
{
DDRA = 0b01010101;
DDRB = 0b00000000;
DDRC = 0b00000000;
DDRD = 0b00000000;
PORTA = 0b01010101;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
}
Ученье свет,а неученье - тьма... чуть свет и на работу ...
Re: Помогите подключить кнопку
~=ieroglif=~ писал(а):вот только не пойму как он входит в обработчик прерываний,точнее когда ?Ведь в main нет "ссылки" или "перехода" на обработчик
Так прерывания для того и нужны чтобы жить собственной жизнью. Когда происходит нужное событие выполнение основной программы прекращается и вызывается обработчик прерывания, основная программа даже не узнает об этом если вы туда не передадите инфу каким то образом. В этом вся прелесть, как угодно развлекайтесь в основном цикле - динамической индикацией, рисованием картинок на граф дисплее или еще чем долгим, но если нажалась кнопка - управление получит обработчик прям вот сразу.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
-
~=ieroglif=~
- Первый раз сказал Мяу!
- Сообщения: 32
- Зарегистрирован: Пн авг 31, 2015 09:14:42
Re: Помогите подключить кнопку
[/quote]
. В этом вся прелесть, как угодно развлекайтесь в основном цикле - динамической индикацией, рисованием картинок на граф дисплее или еще чем долгим, но если нажалась кнопка - управление получит обработчик прям вот сразу.[/quote]
То есть в main не должна находится какая то "ссылка" на обработчик. нигде о нём не слова,а он работает. Так что ли ?
. В этом вся прелесть, как угодно развлекайтесь в основном цикле - динамической индикацией, рисованием картинок на граф дисплее или еще чем долгим, но если нажалась кнопка - управление получит обработчик прям вот сразу.[/quote]
То есть в main не должна находится какая то "ссылка" на обработчик. нигде о нём не слова,а он работает. Так что ли ?
Ученье свет,а неученье - тьма... чуть свет и на работу ...
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Помогите подключить кнопку
Вам нужно почитать, что такое прерывание. Обращаю внимание, что оно относится не к программированию, а к архитектуре МК. Конечно ее надо знать и понимать для успешного программирования.
-
~=ieroglif=~
- Первый раз сказал Мяу!
- Сообщения: 32
- Зарегистрирован: Пн авг 31, 2015 09:14:42
Re: Помогите подключить кнопку
Z_h_e писал(а):Вам нужно почитать, что такое прерывание.
Посоветуйте пожалуйста литературу.
Ученье свет,а неученье - тьма... чуть свет и на работу ...
Re: Помогите подключить кнопку
Так ведь уже советовали
http://kazus.ru/nuke/users_files/19082009/8967238.pdf
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
-
~=ieroglif=~
- Первый раз сказал Мяу!
- Сообщения: 32
- Зарегистрирован: Пн авг 31, 2015 09:14:42
Re: Помогите подключить кнопку
Morroc писал(а):Так ведь уже советовали![]()
Спасибо за помощь
Ученье свет,а неученье - тьма... чуть свет и на работу ...
