Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

seglogoВ продолжение урока, рассмотрим динамическую индикацию. Если вы внимательно изучили статическую индикацию, то знаете, что сегментный индикатор это набор светодиодов. Для того, чтобы подключить индикатор, нужно 7 ножек микроконтроллера. Но, вдруг нам понадобилось использовать несколько индикаторов, например 2, 3, 4…

Тогда нам понадобится уже 14, 21, 28 ножек, а ножек итак мало… Тут нам на помощь приходит динамическая индикация. Основная задача динамической индикации — снизить количество используемых ножек микроконтроллера. Обратите внимание на схеме задействовано 9, а не 14 ножек. Ножки управления все подключены параллельно.
sch2

В общем смысле работает данная конструкция следующим образом: вначале выводится конфигурация первого числа на общую шину и включаем PB1. Первый индикатор загорается, с нужным числом. Затем его гасим, выводим конфигурацию второго числа на шину данных, зажигаем второй индикатор, выключаем.

Более детально. В первый момент времени все выключено PORTB=0x00; PORTD=0xFF; так как схема с общим «+», анодом. Далее на PORTD посылается конфигурация первого числа, например «0». Из статической индикации мы помним:

case 0:
{
  PORTD=0xC0; 
  break;
}

Но обратите внимание, «+» подключен к PORTB.1, т.е. чтобы зажечь сегмент нужно включить ножку PORTB.1=1; 

Во второй момент времени, снова все выключаем, посылаем конфигурацию второго числа и включаем, на этот раз, второй индикатор. Далее повторяем.

При высоких частотах, человеческий глаз не способен разглядеть эти переключения, и кажется что индикатор горит постоянно. Рекомендуется не использовать частоты кратные 50Гц. В своем тестовом проекте я использовал 120Гц. Таймер настроен на частоту 1МГц. Код обрабатывается в прерывании таймера1. Прерывание вызывается 240 раз в секунду, потому что индикаторов два, поэтому 1000 000/240=4166 или 0x1046 пихаем в регистр сравнения. Протеус подружить с динамическим индикатором не удалось, зато на железе заработало сразу.

Обратите внимание!!! При подсоединении индикатора, на каждый сегмент рекомендуется вешать токоограничивающий резистор, а не один общий. Также, рекомендую включать общий провод индикатора через транзистор, иначе можно спалить ножку.

Для схемы с общим анодом

sch4

Для схемы с общим катодом

sch3

В качестве тестовой прошивки использовал таймер из предыдущего проекта.

Видео работы прошивки

140 комментариев: Урок 6.2 Динамическая индикация в AVR микроконтроллерах

  • сделайте разрешение датчика меньше

  • Не помогло 🙁

  • К тому же еще обнаружил, что протеус выдает тоже самое, сделал вывод, что что-то с кодом, но не пойму где ошибка ..

  • проблема в том, что прерывание останавливает измерения датчика.

  • А как можно реализовать, чтобы этого не происходило ?

  • Может измерять как-то в прерывании ?

  • В CVAVR есть такая бяка. Когда работает библа датчика, то она запрещает прерывания на период отцифровки температуры. Я смотрел в недрах ее функций и нашел там паузу в 750 мс. Отсюда возникают мерцания при динамической индикации. А вот если приходят кривые параметры, то скорее всего это железо. Либо не правильно собрана схема, либо повесили датчик на ногу с кокой-то периферией. Внимательно осмотрите схему. А и вот еще. Данная шина очень требовательна к временным задержкам. Проверьте правильность выбора частоты тактования с реальными значениями. Есть подозрения что собака порыта именно тут.

  • Алексей, большое спасибо за ответ !
    В общем удалил все ненужное, добавил задержку в цикле на 500 ms, при этом данные исправно отображаются, нашел косяк — нужно при некоторой температуре выставлять на ножке лог 1 ( подключено реле ). Так вот при добавлении проверки сразу возникает «мерцание». Не пойму… 😥

    temper = ds18b20_temperature(0);

    n1 = (temper%100)%10;
    n2 = (temper%100)/10;
    n3 = temper/100;
    delay_ms(500);

    if (temper >= (float)final){PORTD.7 = 0;}
    else if (temper <= ((float)final)-dT){PORTD.7 = 1;}

  • Скорее всего приведение к float влияет, попробуйте убрать и посмотреть на результат

  • А зачем вообще в float приводить? Функция температуру возвращает в int. Ее нужно делить на 10.

  • Без перевода тоже также никаких изменений

  • тогда смотрите что у вас там по схеме на PD7, проблема очевидно в железе

  • Всем огромнейшее спасибо ! Проблема оказалась на порту, впаял светодиод вместо ключа работает как часики 🙂 буду мудрить дальше )

  • ULN2003 в помощь. 😛

  • Здравствуйте. А как выводить точку???

  • хоть отдельной ногой, хоть динамически

  • а подробней можно? пример какой-то

  • так что на счет примера? как организовать вывод точки на порту PORTD.7?

  • не понимаю вашей проблемы, точка тот же светодиод, PORTD.7=1, вам такой нужен пример? или в чем вопрос?

  • куда нужно вставить эту конфигурацию правильно, что-бы точка загоралась на определенном разряде?

  • не ленимся читаем самый первый урок

  • Прошу автора простить за глупые вопросы.
    К какой ножке порта подключать какие ножки индикатора.
    Они подписаны как ABCDEFG/
    Пожалуйста, выручайте

  • посмотрите урок 6.1 там разжевано

  • доброго времени суток. простите за наглость, но можно ли узнать у вас весь код программы(CV AVR). я так понял, это все написано для ATmega8?

  • и как будет выглядеть схема и код для индикатора 7SEG-BCD?

  • Гуглите доки на свой индикатор. Там есть таблицы истинности

  • Уважаемый Админ, вопрос по динамической индикации, можно ли как то использовать всего одну ножку для управления двух разрядов? То есть подключаю например к ножке логику {НЕ} и индикатор подключаю через ключ на ножку, затем ключ второго разряда через логику и соответственно при 1 гаситься один разряд, второй зажигается, и наоборот при 0. Программно это можно как то реализовать, и если можно, то как? Индикатор 2×15 просто.

  • можно если ток не превысит допустимый, в вашем случае лучше взять сдвиговый регистр

  • Уважаемый Админ, вопрос по динамической индикации, как обычно реализуются различные эффекты при показаниях (сдвиг значений и замена другими, или эффект механического счетчика (цифра как бы постепенно заменяется на другую))? Было бы замечательно если бы тоже был бы выложен небольшой урок по этому вопросу.

  • Уважаемый Админ! Растолкуйте, пожалуйста, как вывести матрицу
    char matrix[16][8]={
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},

    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    };
    на порты ATMega32a (планирую использовать порты А и В для строк и D для столбцов). Хочу сделать тетрис на светодиодах, но в интернете есть проекты только на PIC-контроллерах. На AVR есть только видео, а код никто не выкладывает! И объяснений никаких… Вообще, объясните, КАК можно выводить информацию на светодиодные матрицы! Думаю, что я не один такой…

  • собственно в статье объяснен принцип, можете использовать его. каждая строка включается своей ножкой порта, через транзистор. состояние строки выводится портом. 1 в 1 как в статье.

  • Подскажите как управлять сегментами, если на одна порте кроме их висят еще устройства. Т.е необходимо изменять только те биты которые управляют сегментами остальные не трогать. PORTX.X=0 и т.д такой вариант не особо т.к сегментов 4.

  • Поставьте сдвиговый регистр

  • Уважаемый админ, моё почтение и благодарность за очень хорошое дело популяризации программирования микроконтроллера. За помощь которую оказываете начинающим. Всех благ и удачи! Пользуясь случаем, хотел поинтересоваться: сам начинаю изучать контроллеры пока серии Tiny, но пишу исключительно на ассемблере. Насколько правильно писать исключительно на ассемблере, код гораздо компактнее получается и каким объёмом программы стоит ограничиться, чтобы отладка не превратилась в «сворачивание мозгов «, да и есть ли такие ограничения при хорошей структуре написания?

  • Георгий, мое мнение пишите на асме, когда надо будет перейти на Си вы поймете без чужих советов.

  • каким образом можна вывести результат на сегменты с АЦП

  • На жк всё понятно.Тут та же формула.

  • у меня такой вопрос с введением числа меньше 1 float .Нужно вводить библиотеку #include ?

  • float включается в свойствах проекта, дополнительных инклюдов не нужно

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика