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

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

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

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

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


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

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

Сообщение COKPOWEHEU »

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

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

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

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

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

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

Сообщение COKPOWEHEU »

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

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

Сообщение ~=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;
}


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

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

Сообщение Morroc »

~=ieroglif=~ писал(а):вот только не пойму как он входит в обработчик прерываний,точнее когда ?Ведь в main нет "ссылки" или "перехода" на обработчик

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

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

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

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

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

Сообщение Z_h_e »

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

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

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

Z_h_e писал(а):Вам нужно почитать, что такое прерывание.

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

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

Сообщение Morroc »

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

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

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

Morroc писал(а):Так ведь уже советовали :))

Спасибо за помощь
Ученье свет,а неученье - тьма... чуть свет и на работу ...
Ответить

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