Воскресенье, 28.04.2024, 23:36
| RSS
[SEARCH_TITLE]
[SEARCH_FORM]
Важно!!!
Для успешного просмотра
сайта воспользуйтесь
браузером Mozilla Firefox



Мини-Профиль
Гость


Группа:
Гости
Время:23:36

Гость, мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизуйтесь!

Категории раздела
О программаторах [4]
Не много о том как и с помощью чего программировать.
Программирование в BascomAVR [6]
Учимся благодаря статьям писать программы. Язык Basic
Программирование в CV AVR? [4]
Учимся благодаря статьям писать программы. Язык Си

Поиск

Наш опрос
Как вы нашли наш сайт?
Всего ответов: 405

Друзья сайта
roboforum
  • robozone
  • Железный феликс
  • robo.com.ua
  • imobot
  • ASARobotics
  • Grover
  • Электроника
  • Your Device
  • Программирование BASCOM
  • Basic для PIC мк
  • Электроника для всех
  • RassionRobots
  • Newrobots-world

  • Статистика

    Каталог-Молдова - Ranker, Statistics
    RoboRing.Ru
    << | list | ? | >>
    Rambler's Top100
    Рейтинг@Mail.ru
    Рейтинг робо-сайтов


    Помоги сайту
    ЯндексЯндекс. ДеньгиХочу такую же кнопку


    Главная » Статьи » Программирование » Программирование в CV AVR?

    Подключение кнопки
    В данной статье описано подключение тактовой кнопки к микроконтроллеру семейства AVR. Приведены алгоритмы обработки событий кнопки и программного антидребезга. В качестве примера приведена программа управления светодиодом, написанная в CodeVisionAVR.

    Аппаратная реализация.

    Начнем с того, что кнопку нужно правильно подключить. По правилам построения цифровых устройств, схема подключения должна быть такой


    Но устройство AVR контроллеров позволяет упростить схему за счет внутренних ресурсов чипа. В качестве резистора R* можно задействовать встроенный резистор в МК. Правда, это надо будет программно прописать (не забудьте об этом!!!). В конечном варианте схема будет выглядеть вот так:

    В схеме так же присутствует кварцевый резонатор с согласующими конденсаторами. Начальный Reset МК так же осуществляется за счет внутренней цепи сброса МК.

    Для примера нам потребуется светодиод, подключеный через токоограничивающий резистор 220-330 Ом.

    Как видно из схемы, при нажатии кнопки на выходе будет присутствовать низкий логический уровень. А ток через светодиод будет проходить при подаче на выход МК высокого уровня.

    Программная реализация.

    Простейший случай.

    Для того чтобы контроллер мог отслеживать состояние кнопки, он должен в цикле проверять состояние входа. Пусть на линии порта, содержащей кнопку, установлен высокий логический уровень (5В). Тогда при нажатии кнопки (соединении линии порта с землей) линия будет иметь низкий уровень. Это изменение и будет отслеживать наша программа.
    Рассмотрим пример, в котором при каждом нажатии на кнопку, светодиод будет менять свое состояние. Для этого организуем цикл.

    Алгоритм получился примерно вот такой:

    Пояснение: в бесконечном цикле микроконтроллер проверяет состояние своего входа, и в случае обнаружения на нем низкого уровня (замыкание вывода на землю) производит нужные операции.

    Дребезг контактов.

    Но на практике не все получается так вот красиво и гладко. Все дело в том, что практически не бывает идеальных кнопок. То есть, когда вы нажимаете на кнопку, контакты не сразу занимают нужное положение, перед этим они начинают колебаться, приводя к неоднократному срабатыванию кнопки – это явление называется дребезг контактов. На рисунке показан график того, что примерно происходит на входе контроллера при нажатии кнопки.

    Для человека такое время колебания незначительно – мы его даже не заметим. Другое дело, микроконтроллер: предположим, проверка кнопки осуществляется в цикле, а контроллер работает на частоте 8 МГц, в таком случае, проверка кнопки будет осуществляться несколько тысяч, если не десятков тысяч раз в секунду. Может получиться так, (а скорее всего так и получится) что за то время, пока происходит дребезг, программа еще раз проверит кнопку – в таком случае предсказать результат сложно (раз на раз не приходится)

    Программный антидребезг

    Решить эту проблему можно несколькими путями. В данной статье рассмотрим программный способ. Он заключается в том, что при первом срабатывании кнопки будет вызвана задержка, которой нужно перекрыть время дребезга. После этой задержки будет вновь проверено состояние кнопки. И если там будет ожидаемое значение (например, нажата) то программа выполнит действие по нажатию кнопки.
    Алгоритм антидребезга при этом будет выглядеть так:


    Важно помнить, что при отпускании кнопки дребезг так же будет происходить!


    Ожидание отпускания кнопки.

    Предположим, вы нажали кнопку и держите. Программа проверит ее в первый раз – сделает все так, как надо. Обработает антидребезг, выполнит все что нужно. А потом при последующей проверке снова обнаружит, что кнопка нажата – непорядок. Надо сделать так, чтобы программа дождалась отпускания кнопки. Для этого после выполнения нужных от нажатия кнопки действий запускаем цикл, выйти из которого можно будет только при отпущенной кнопке. (Это лишь один из вариантов. он далеко не самый производительный, зато наиболее простой для начинающих) Получается, что пока вы держите кнопку программа не проверяет ее состояние заново. После выхода из этого цикла надо прописать антидребезг (аналогичным образом).
    Алгоритм приобретет такой вид:

    В плане теории, в общем-то все) Поздравляю, если вы дочитали до этого места!

    Пример применения всего вышеописанного.

    Как и было заявлено в начале статьи, рассмотрим программу управления светодиодом.
    Схема приведена выше.
    Алгоритм работы программы следующий:

    Реализация данного алгоритма зависит от того, на каком языке вы пишите, и как вы это делаете. В качестве примера привожу реализацию в компиляторе CodeVision AVR

    Code

    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.04.0a Evaluation
    Automatic Program Generator
    © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com

    Project : Test
    Version : 1.0.0.0.1
    Date : 20.09.2009
    Author : DeepBlack
    Company :  
    Comments:  
    for robotsspace.ucoz.ru

    Chip type : ATmega8
    Program type : Application
    AVR Core Clock frequency: 16,000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    *****************************************************/

    #include <mega8.h>
    #include <delay.h>

    // Declare your global variables here
    bit flag = 0;

    void set(){ // функция смены значения на выходе
    flag = !flag;
    PORTD.4 = flag;
    }
    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In  
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=P State0=T  
    PORTB=0x02;
    DDRB=0x00;

    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In  
    // State6=T State5=T State4=T State3=T State2=P State1=T State0=T  
    PORTC=0x04;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In  
    // State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T  
    PORTD=0x00;
    DDRD=0x10;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    TCCR0=0x00;
    TCNT0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;
       
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    while (1)
      {  
      if (PINC.2==0) { // ждем нажатия
      delay_ms(50); // антидребезг
      if (PINC.2==0) set(); // если все норм, переключаем  
      else continue;
      }
      else continue;
       
      while(PINC.2==0) {}; // ждем отпускания кнопки
      delay_ms(50); // антидребезг  
      };
    }
       

    В начале в генераторе кода надо сконфигурировать линии портов. На скриншоте указано, что на линию входа необходимо подключить внутренний нагрузочный резистор (поставить Р вместо Т). Об этом резисторе написано выше. Там, где говорилось о вариантах подключения кнопки к контроллеру.

    //_________________________________Удачи!

    Источник: http://по материалам книги А.В. Белова "Создаем устройства на микроконтроллерах"

    Категория: Программирование в CV AVR? | Добавил: DeepBlack (20.09.2009)
    Просмотров: 24549 | Теги: CodeVision AVR, mega8, антидребезг, дребезг контактов, AVR, Кнопка | Рейтинг: 4.8/10 |
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]