Шаг 1. Мигающий светодиодик

Приступим-с, товарищи!
Итак, для написания первой программки и последующего её практического лицезрения и прыганья до потолка потребуется:

  1. программа microC PRO for AVR.
  2. программатор (например, Prottoss AVR 910) и соответствующие ему драйвера
  3. контактная макетная плата с набором перемычек
  4. резистор
  5. светодиод
  6. микросхема ATtiny2313
  7. источник питания – достаточно взять зарядник для телефона, откусить кусачками конец провода с разъёмом, зачистить провода и присоединить +5 В (красненький) к соответствующему красному клеммнику (обмотать и закрутить), а «землю» (черненький) – к черному

С вещественными потребностями разобрались, можно начинать!
Для начала определимся с постановкой задачи: нам необходимо, чтобы светодиод мигал. Коротко, лаконично и имеет много вариантов решений, начиная от простого "включил источник питания - выключил - включил" даже без использования микроконтроллеров до каких-нибудь безумных мега-программ (до этого, не беспокойтесь, мы обязательно дойдём).

Сперва нужно объяснить микроконтроллеру, что у нас на выходе (то есть, на что мы будем влиять) будет светодиод.
В ATtiny2313 есть 18 программируемых выводов входа-выхода – на что они будут работать, задаём сами.
Порт – это несколько ножек микросхемки, объединённых, как правило, в один байт. Если провести аналогию, то наш «порт» - это как бы большая пристань, а наши ножки-выводы - отдельные причалики. Так, у нашей микросхемки есть порт A с 3 выводами, порт B с 8 выводами и порт D – с 7.
Вот конкретное расположение их на нашей ATtiny:

Расположение портов на ATtiny2313
Рис. 1. Порты ATtiny 2313

У каждого порта есть несколько программно задаваемых характеристик: так, DDRx определяет, на вход или на выход мы ставим наш порт (1 - выход, 0 - вход); через PINx можно узнать текущее состояние, а через PORTx - его задать (где x, соответственно, - название порта).
Например, если задать DDRB = 0b11111111 (это двоичное представление) - так, самая правая единичка отвечает за порт B.0, следующая = за B.1 и так далее - то порт B весь будет задан на выход.
Получается, что если DDRB = 0b0001000, то порт B.3 был бы настроен на выход, а все остальные - на вход.
С этим разобрались, едем дальше.
Текущие значения портов PORTx, как это работает и с чем его едят: если у нас значение порта равно "1", то ножка подтягивается к питанию, если "0" - то ножка подтягивается «земля». У нас светодиод будет подключен одним концом к ножке микросхемы, а другим - к питанию, тогда когда на ножке установлен "0", светодиод будет гореть, когда "1" - будет погашен.

Посмотрим, что нужно сделать в программе:

  1. Объявить, что вывод, к которому подключен светодиод, будет на выход.
  2. Изменить состояние вывода - то есть, состояние «горит-не горит» светодиода - на обратное.
  3. Сделать задержку, чтобы мы могли увидеть, что наш светодиод мигает

Теперь кратко о реализации нашего плана. Для начала, поговорим о битовых операциях:

  • побитовое ОТРИЦАНИЕ: каждый бит исходного числа становится обратным. Так, НЕ 10110 = 01001
  • побитовое И: сравнивается каждая пара битов; если хотя бы один из них равен 0, то результирующий бит тоже будет равен 0. Например, 10110 И 00101 = 00100
  • побитовое ИЛИ: опять же, сравнивается каждая пара битов; если хотя бы один из них равен 1, то результат – 1: 10110 ИЛИ 00101 = 10111
  • побитовое исключающее ИЛИ: если в соответствующей паре биты равны, то в результате – 0. Здесь 10110 ИСКЛ. ИЛИ 00101 = 10011
  • операции сдвига: значения битов как бы смещаются влево или вправо на указанное число, при этом «пустые» места зануляются. Так, 10110 << 2 = 11000;10110 >> 2 = 00101

Маленькая табличка "Как какие побитовые операции обозначаются на Си и на Паскале":

Операция Пример на Си Пример на Паскале
отрицание ~10110 not 10110
и 01 & 11 01 and 11
или 01 | 11 01 or 11
исключающее
или
01 ˆ 11 01 xor 1
сдвиги 1 << 4
1001 >> 2
1 shl 4
1001 shr 2

Будем считать, что светодиод будет подключен к порту B, а конкретно к ножке, например, B.5.

Тогда получаем следующую программку на С:

//Мигание светодиодиком на выводе В.5
void main()
{
   DDRB = 0b00100000;  //вывод B.5 на выход, весь остальной порт B - на вход
   PORTB = 0b00100000;  //по умолчанию все выключено
   while(1)
   {
      PORTB.B5 = ~PORTB.B5;   //переключаем состояние светодиода на обратное
      Delay_ms(100); //делаем задержку на 100 миллисекунд
   }
}

А вот на Pascal-е:

{ Мигание светодиодиком на выводе В.5 }
program First;
begin
   DDRB := %00100000; //задаем порт B на вывод
   PORTB := %00100000;//по умолчанию все выключено
   while(1) do
   begin
      PORTB.B5 := not PORTB.B5; //переключаем состояние светодиода на обратное
      Delay_ms(100); //делаем задержечку
   end;
end.

Как мы видим, программы обращаются к конкретному выводу порта - PORTB.B5. При это в "нормальных&qout; Си и Паскале обращения к битам нет - но раз уж у нас среда MikroE, будем пользоваться всеми её ништяками и печеньками. Заметим ещё, что обращение к конкретным битам возможно только для выводов и переменных размером один байт - впрочем, наиболее часто работа с конкретными битами нужна для изменения портов ввода-вывода.

С программной частью разобрались!
Вот наша программка уже в виде .hex - готова для прошивки.
Приступаем к самому интересному - разбираемся с программатором:

  1. Устанавливаем для начала вот этот драйвер для переходников USB-COM (обычно нужен для подключения связующих компьютер и микросхему устройств)
  2. Теперь подключаем наш программатор, компьютер обнаруживает новое устройство и просит драйвера. Ну, мы их, конечно, ему предоставим. В архиве есть три варианта: для Windows 2000 (о да!) и Windows XP с использованием системного драйвера usbser.sys, для 32-битных XP,Vista и 7 и для аналогичных 64-битных. Скажу сразу, что лично у меня дрова с использованием штатного файла как-то… не пошли)
  3. Ну и наконец, ура! – можно уже открывать программку AvrOspII. Подробное описание этой программы представлено здесь.

Итак,вставляем нашу микросхемку в программатор (там должно быть подписано, где, что и куда. А ещё на программаторе в "кроватке", куда вставляется микросхема, должна быть маленькая выемка - такая же, как и у микросхемы, если смотреть ножками вниз - эти выемки должны совпадать; иначе, исходя из моего опыта, начинает реально пахнуть палёным). Теперь с помощью программы записываем наш шедевр. Во вкладке Program определяем наше устройство. Затем проверяем, правильно ли прописаны фьюзы:вкладка Fuse bites, настраиваем следующим образом:

Конфигурация фьюзов
Рис. 2. Конфигурация фьюзов.

О фьюзах: fuse bits - область в микроконтроллере, которая отвечает за начальную конфигурацию. Тут мы задаем, с каким задающим генератором микроконтроллеру работать (внешним или внутренним), делить ли частоту генератора на коэффициент или не нужно, использовать ножку сброса как сброс или как дополнительный вывод ввода-вывода, определяем количество памяти для загрузчика и другие страшные вещи, до которых мы потом дойдем. У каждого контроллера свой набор фьюзов.
Кстати, если Вас нет таблички сверху, то можно установить программу AVR Studio 4, всё появится автоматически. Но версии поновее, к сожалению, уже не поддерживают AvrOspII(((
Но вообще мы нашли те файлики студии, с которыми играла AvrOsp, и пересадили их ей в папочку. Теперь она самостоятельна ˆˆ
Так, вернёмся от теории к практике: во вкладке Program устанавливаем галочку «erase» - очистить перед записью - и, наконец, во флеш-память записываем нашу программу (Brouse -> открываем папку с нашей программой и выбираем hex). Нажимаем Program, ждём надписи equal - готово!

Осталось только собрать схему:

Принципиальная схема
Рис. 3. Принципиальная схема

Подключаем микросхему: в 20 вывод (VCC) подключаем ток, а 10 - GND - заземляем. Ну вот, она в сети!
Дальше понятно - цепь должна быть замкнута, светодиод должен быть соединён с микроконтроллером через один из портов B (по схеме - в B.5, 17 по счёту вывод), ну и резистор к светодиоду - чтобы не перегорел (светодиодики потребляют очень мало и могут пропускать через себя слишком большой ток)
Ежели вы никогда не работали с макетной платой, то краткая информация: посередине платы есть контакты питания (два отдельных столбика), по которым мы, собственно, и пускаем ток. Есть также несколько «столбиков» контактов слева и справа от контактов питания – на них мы и делаем все, что душа пожелает. Контакты соединены по строчкам в каждом столбике (обычно по пять).
Получаем что-то типа такого:


Результат

Итак, подключаем всё по схеме, включаем в сеть и медитируем)))

Автор - Moriam
Обсудить на форуме