Урок 30
Подключаем дисплей 16×2 к МК ATtiny2313
Сегодня мы попробовать воспользоваться более простым микроконтроллером ATtiny2313 и подключить к нему символьный дисплей LCD, содержащий две строки по 16 символов.
Дисплей мы будем подключать стандартным способом 4-битным способом.
Сначала начнём, конечно, с микроконтроллера, так как с дисплеем мы уже очень хорошо знакомы из предыдущих уроков.
Откроем даташит контроллера ATtiny2313 и посмотрим его распиновку
Мы видим, что данный контроллер существует в двух видах корпусов, но так как мне в руки он попал в корпусе DIP, то будем мы рассматривать именно эту версию корпуса, да и в принципе, они и не различаются особо, кроме чем по виду, так как количество ножек одинаково — по 20.
Так как ножек 20 по сравнению с 28 ножками контроллера ATMega8, к которым мы уже на протяжении всего времени занимаемся и ещё будем заниматься, то, соответственно, и возможностей также будет меньше.
В принципе, всё, что было у ATmega8, здесь есть, единственное то, что поменьше лапок портов. Но так как задача перед нами стоит попробовать соединить его по шине SPI с другим контроллеров, то нас это удручает не сильно.
Есть ещё некоторые отличия, но они незначительны и мы с ними познакомимся по мере необходимости.
Соберём вот такую вот схемку (нажмите на картинку для увеличения изображения)
Дисплей подключен к ножкам порта D. PD1 и PD2 — к управляющим входам, а остальные к ножкам модуля дисплея D4-D7.
Проект создадим с именем TINY2313_LCD, перенесём в него всё кроме главного модуля из проекта урока 12 по подключению дисплея к Atmega8.
Конечно, некоторые вещи надо будет переделать. Для этого нужно внимательно изучить, к какой ножке что подключено. Шина E дисплея подключена к PD2, а шина RS — к PD1, поэтому внесём изменения в файл lcd.h
#define e1 PORTD|=0b00000100 // установка линии E в 1
#define e0 PORTD&=0b11111011 // установка линии E в 0
#define rs1 PORTD|=0b00000010 // установка линии RS в 1 (данные)
#define rs0 PORTD&=0b11111101 // установка линии RS в 0 (команда)
Как мы видим из выделения жирным шрифтом, не такие уж и кардинальные изменения у нас произошли.
Теперь информационные входы. Здесь у нас используются ножки PD3-PD6, то есть на 1 пункт сдвинуты по сравнению с подключением к Atmega8, поэтому исправим ещё и кое что в файле lcd.c в функии sendhalfbyte
PORTD&=0b10000111; //стираем информацию на входах DB4-DB7, остальное не трогаем
Но это ещё не всё. Мы раньше передаваемые данные сдвигали на 4, а теперь нам в связи с вышеуказанными изменениями придётся их сдвигать только на 3. Поэтому в той же функции исправим ещё и самую первую строку
c<<=3;
Вот и все изменения. Согласитесь, не так уж они и велики! Это достигнуто тем, что мы всегда стараемся код писать универсальный и пользоваться именно макроподставновки. Если бы мы в своё время не потратили на это время, то нам пришлось бы исправлять код почти во всех функциях нашей библиотеки.
В главном модуле инициализацию порта D мы не трогаем, пусть весь встаёт в состояние выхода, как и в уроке 12.
Давайте попробуем собрать проект и посмотреть сначала результат в протеусе, так как для него я также сделал проект, который будет также находиться в приложенном архиве с проектом для Atmel Studio
У нас всё прекрасно работает! Вот как можно, оказывается быстро переделать проект для одного контроллера под другой.
Протеус — это очень хорошо, но на настоящие детальки посмотреть всегда приятнее. Схема вся была собрана на макетной плате, так как отладочной платы для данного контроллера я не делал и не собирал. Программатор мы подключим через стандартный разъём вот такой вот
Вот вся схема
Здесь всё стандартно. Подтягивающий резистор на RESET и т.д.
Теперь, прежде чем прошивать контроллер в avrdude, нам неоходимо выбрать контроллер и считать его флеш-память
Затем зайти во вкладки FUSES и установить правильно фьюзы. Так как у нас нет кварцевого резонатора, то мы устанавливаем фьюзы именно так
В видеоверсии урока также рассказано, где именно мы это всё берём в технической документации. Так что для кого это важно и кто собирается работать дальше именно с таким МК, то пожалуйста смотрите видеоурок, прикрепленный в самом низу страницы.
Теперь, установив всё именно так, нажимаем кнопку «Программирование» и прошиваем фьюзы.
Затем возвращаемся на первую вкладку, выбираем проект и прошиваем его
Смотрим результат нашей работы
Всё работает прекрасно!
Таким образом, не прилагая особых усилий. мы переработали проект, предназначенный для одного контроллера линейки AVR, в проект для совсем другого контроллера, подготовив данный контроллер к следующему занятию по подключению его к контроллеру ATmega8 по шине SPI.
Предыдущий урок Программирование МК AVR Следующий урок
Техническая документация:
Программатор и дисплей можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
«Мы раньше передаваемые данные сдвигали на 4, а теперь нам в связи с вышеуказанными изменениями придётся их сдвигать только на 3.»
Почему? «…мы сдвинем наш входной аргумент влево на 4 бита, так как работаем мы со старшими разрядами шины (4-7)». Мы же по прежнему работаем со старшими разрядами?
Если собирать согласно схеме, то ничего хорошего не получится, так как выводы порта D PD3-PD6 не по порядку подключены к портам D4-D7 дисплея. Вот в проекте протеуса схема собрана правильно.
Александр, мы сдвигаем влево на 3 бита потому что для даты используем выводы
PD3-PD6. На атмеге8 мы сдвигали на 4 бита и использовали выводы PD4-PD7.