Помогите подключить кнопку

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пн авг 31, 2015 09:14:42

Сообщение ~=ieroglif=~ »

Попробую объяснить. Первый вариант самый простой - опрос по прерыванию таймера. То есть, например, 10 раз в секунду возникает прерывание.


Я благодарен за помощь,но я так и не понял как можно сделать опрос :cry:
Ученье свет,а неученье - тьма... чуть свет и на работу ...
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Открываете даташит или Евстифеева и читаете как вызывать прерывания с нужной частотой. В обработчике пишете проверку кнопки. Самое простое по вашему же образцу.

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

volatile char sw=0;
ISR(TIMER0_OVF_vect){
  if( PINB & (1<<3) )sw++;
}
Реклама
CB1
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт янв 01, 2015 13:44:12

Сообщение CB1 »

Переделал немного проект ~=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 КБ) 115 скачиваний
Все гениальное - просто
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Можно, конечно, и без прерываний, я даже написал как - конечный автомат в помощь. А ваш код принципиально ничем не лучше кода ~=ieroglif=~. Ну добавили защиту от дребезга, но все равно чтобы переключить режим надо дождаться окончания анимации. А прерывания учить не рано, это одна из самых базовых вещей контроллера.
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пн авг 31, 2015 09:14:42

Сообщение ~=ieroglif=~ »

На конец таки я это сделал. поборол всё же анимацию во время переключения,вот только не пойму как он входит в обработчик прерываний,точнее когда ?Ведь в 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;
}


Ученье свет,а неученье - тьма... чуть свет и на работу ...
Реклама
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

~=ieroglif=~ писал(а):вот только не пойму как он входит в обработчик прерываний,точнее когда ?Ведь в main нет "ссылки" или "перехода" на обработчик
Так прерывания для того и нужны чтобы жить собственной жизнью. Когда происходит нужное событие выполнение основной программы прекращается и вызывается обработчик прерывания, основная программа даже не узнает об этом если вы туда не передадите инфу каким то образом. В этом вся прелесть, как угодно развлекайтесь в основном цикле - динамической индикацией, рисованием картинок на граф дисплее или еще чем долгим, но если нажалась кнопка - управление получит обработчик прям вот сразу.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Реклама
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пн авг 31, 2015 09:14:42

Сообщение ~=ieroglif=~ »

[/quote]
. В этом вся прелесть, как угодно развлекайтесь в основном цикле - динамической индикацией, рисованием картинок на граф дисплее или еще чем долгим, но если нажалась кнопка - управление получит обработчик прям вот сразу.[/quote]
То есть в main не должна находится какая то "ссылка" на обработчик. нигде о нём не слова,а он работает. Так что ли ?
Ученье свет,а неученье - тьма... чуть свет и на работу ...
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Вам нужно почитать, что такое прерывание. Обращаю внимание, что оно относится не к программированию, а к архитектуре МК. Конечно ее надо знать и понимать для успешного программирования.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пн авг 31, 2015 09:14:42

Сообщение ~=ieroglif=~ »

Z_h_e писал(а):Вам нужно почитать, что такое прерывание.
Посоветуйте пожалуйста литературу.
Ученье свет,а неученье - тьма... чуть свет и на работу ...
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

Так ведь уже советовали :)) http://kazus.ru/nuke/users_files/19082009/8967238.pdf
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пн авг 31, 2015 09:14:42

Сообщение ~=ieroglif=~ »

Morroc писал(а):Так ведь уже советовали :))
Спасибо за помощь
Ученье свет,а неученье - тьма... чуть свет и на работу ...
Ответить

Вернуться в «AVR»