Подписаться на получение новых статей на почту:

Шаг №33. Программа для кнопок на АЦП AVR на примере часов

Всем привет. В прошлой статье мы с Вами рассмотрели общие настройки АЦП, применение АЦП для распознавания нажатой кнопки и схему подключения. В этой статье дополним программу из статьи №30, а именно внесем корректировку минут и часов с помощью кнопок, применив АЦП, и протестируем в симуляторе и в железе.

Начнем с инициализации АЦП, а именно подготовки модуля к работе. В прошлый раз мы рассмотрели все настроечные биты, поэтому сегодня их «разжевывать» не будем.

Ниже код настройки блока управления и состояния, а также настройка мультиплексора (рассмотрены в прошлой статье).

ADCSRA = (1<<ADEN)|(1<<ADSC)|(0<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);

ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);

Всего лишь две строки настройки и наш модуль готов к работе. На рисунке ниже подключение кнопок с часами в протеусе.

Подключение кнопок к АЦП на AVR

Как видите порт С у нас обслуживает и часы и кнопки. Красным обведены наши кнопки. Не забывайте про вывод AVcc, без него не будет работать. Делитель напряжения, уровни напряжения и соответствующие значения АЦП мы описали и рассмотрели в прошлый раз. Верхняя кнопка увеличивает минуты, нижняя – часы. Теперь перейдем к программной реализации. Как Вы увидите она несложная, и начинается с настройки модуля двумя строками, которые мы написали выше.

Включение преобразования у нас происходит в ручную, разрядом 1<<ADSC (регистра ADCSR). Я его сразу установил в 1 (выше).

Обработку кнопок я произвожу в прерывании по завершению преобразования АЦП. Где считываю содержимое АЦП, далее сравниваю значение с ожидаемым, под конкретную кнопку, произвожу анти дребезг, приравниваю переменные к 1, которые далее в программе будут отвечать за увеличение минут или часов. Кнопки и антидребезг болле детально рассмотрены в статье №12 (Подключаем кнопки к AVR.)

ISR (SIG_ADC )
{
      data = ADCH; //Считываем содержимое  АЦП
      if (data > 200)
      {
            _delay_ms (100); //Задержка для исключения дребезга кнопки.
            if (data > 200)
            i_m=1;
      }
      if ((data > 70)&&(data < 150))
     {
            _delay_ms (100);
            if ((data > 90)&&(data < 128))
                  i_h=1;
      }
      ADCSRA |= (1<<ADSC) ;
}

Ниже цикл, в котором выводим время и относительно переменных   i_m и i_h производим коррекцию данного времени.

while (1)
{
      min=read_DS1307 (0×01); /*читаем минуты*/
      _delay_ms (100);
       h=read_DS1307 (0×02); /*читаем часы*/
       if (i_h==1)      /*коррекция часов*/
       {
             h++;
             if (h >= 24)
                    h=0;
            _delay_ms (100);
            write_DS1307 (0×02,h);
            _delay_ms (100);
            i_h=0;
        }
        if (i_m==1)      /*коррекция минут*/
        {
            min++;
            if (min >= 60)
            min=0; 
            write_DS1307 (0×01,min);
            i_m=0;
        }
        _delay_ms (100);
        i=h+(min*0.01);
        Display (i);
    };

Данный код нормально отработал и в симуляторе и в железе. Полный код выложен ниже. На рисунке ниже делитель напряжения в железе. Для тех кто следит за развитием проекта, необходимо сказать что по началу кнопки были подключены к разным выводам порта статья №17 (Контроллер сбора данных на AVR. Создаем плату.).Поэтому пришлось немного «покромсать». Красным обведен наш делитель (100К-ый сверху платы), зеленным места обрыва дорожек ну и желтым наши две кнопки.

делитель напряжения для кнопок на AVR

Ниже исходник подключения кнопок к АЦП для коррекции времени

Корректируем время с помощью кнопок на АЦП ( Скачали: 200 чел. ) 

В принципе все. Проект рабочий и в железе и в протеусе. В следующей статье опишем вторую часть протокола TWI. Для случаев когда на линии два и более ведущих. Т.к. в нашем устройстве два микроконтроллера, которые будут общаться друг с другом по данному протоколу. Немного напомню, первую часть интерфейса TWI мы рассмотрели в статье №28. На этом и остановимся. Всем пока.

Просмотрено 4903 раз.

Я на Google+

Шаг №33. Программа для кнопок на АЦП AVR на примере часов: Один комментарий

  1. Спасибо. Хорошо описано. Интересно увидеть пример двух ведущих по TWI/

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting