1 Краткий Курс - Самоучитель AVR , ATmega и ATtiny для ...

65
1 Краткий Курс - Самоучитель AVR , ATmega и ATtiny для начинающих с нуля ! Предлагаю вам учиться на моѐм примере. Добрый день, уважаемые! На сайте, по просьбам трудящихся появился ФОРУМ! Буду признателен если вы сможете помочь развить его оставив свои пожелания, отзывы или линки на ресурсы . (Ну и задавая вопросы конечно же ;) Спасибо огромное! Буду признателен за посещение спонсоров проекта. ХОЧЕШЬ РАЗМЕСТИТЬ ТУТ СВОЮ РЕКЛАМУ ИЛИ ЛИНК? Предлагаю меняться линками или баннерами. Пиши на info sobaka 123avr.com Самодельная сигнализация на микроконтроллере - sevradio.ru Курс подробно рассказывает как сделать самые первые шаги, с чего начать не вообще, а конкретно - ШАГ за ШАГОМ ... - Как сделать нужное вам электронное устройство, печатную плату - Как написать первую, простейшую программу для МК - Как запустить эту программу в программе-симуляторе МК и увидеть как она работает не покупая МК и радиодеталей, а значит без риска спалить что-то или испортить порт вашего ПК ! - Как загрузить программу в реальный МК - Как отладить реальное устройство - т.е. найти причины не правильной работы и добиться его функционирования в соответствии с поставленной задачей. Цель курса - помочь вам быстро начать использовать микроконтроллеры семейства AVR с абсолютного нуля знаний о микропроцессорах и о программировании вообще. В курсе даны кратко ключевые моменты устройства МК и показано как МК взаимодействует с окружающими его в электронном устройстве компонентами и с другими устройствами, например с ПК. Для использования микроконтроллеров, в том числе и МК AVR, вам не нужно досконально знать электронику и языки программирования. Курс поможет вам научится искать и творчески использовать информацию в объеме необходимом для реализации конкретного проекта, устройства . Содержание. стр. 0 Заглавная страница курса - 123avr.COM ( то что вы сейчас читаете) - втупление и первые эксперементы стр. 1. Ключевая страница курса - ИЗУЧИТЕ ЕЁ ! она ГЛАВНАЯ в курсе ! стр. 2. Что такое МК и AVR в частности. Как работает МК. стр. 3. Возможности МК. Что и как подключать к МК. Регистры и программа. Прерывания в AVR. стр. 4. Компиляторы и Симуляторы для МК AVR. стр. 5. Си для МК - очень малая часть языка достаточна для работы с МК. стр. 6. Задачи-упражнения по курсу - это практические занятия по работе с МК и необходимые теоретические сведения и комментарии. Макетные платы, изготовление плат, пайка. стр. 7. Как и чем прошить (прожечь, загрузить) программу в МК AVR, ATmega. Как сделать программатор 5-проводков или сложнее. стр. 8. Дополнительные, полезные материалы стр. 9. О великолепных МК серии PIC12, PIC16, PIC18 от компании MicroChip Курс имеет простую навигацию, плюс в конце каждой страницы есть линки на следующую и предыдущую страницы. Я очень советую вам читать курс последовательно, так как изложен материал. Поверьте, это важно и правильно ! Шаг 1. Скачайте всего две программы - компилятор CodeVisionAVR (2 Мб всего) Бесплатный DEMO до 2 кб кода, а полный CVAVR ниже на сером фоне. - симулятор AVR и электроники VMLAB (4,2 Мб FREE) Установите эти программы. Теперь у вас есть качественное и удобное программное обеспечение для ПОЛНОГО цикла разработки устройств на МК (микроконтроллерах) AVR. От интерактивного помошника для создания начального кода, скелета программы - инструмент бесценен для начинающего, до написания и отладки полной программы с постоянным контролем еѐ работы на всех этапах ее создания на компьютерной модели нужного вам микроконтроллера AVR совместно с популярными электронными компонентами подключенными к нему виртуально. CodeVisionAVR - имеет встроенный программатор для загрузки готовой программы в реальный микроконтроллер. Даже DEMO версия позволят прошивать прошивки любого размера!

Transcript of 1 Краткий Курс - Самоучитель AVR , ATmega и ATtiny для ...

1

Краткий Курс - Самоучитель AVR , ATmega и ATtiny для начинающих с нуля !

Предлагаю вам учиться на моѐм примере.

Добрый день, уважаемые! На сайте, по просьбам трудящихся появился ФОРУМ!

Буду признателен если вы сможете помочь развить его оставив свои пожелания, отзывы или линки на ресурсы. (Ну и задавая вопросы конечно же ;) Спасибо огромное! Буду признателен за посещение

спонсоров проекта.

ХОЧЕШЬ РАЗМЕСТИТЬ ТУТ СВОЮ РЕКЛАМУ ИЛИ ЛИНК? Предлагаю меняться линками или баннерами.

Пиши на info sobaka 123avr.com

Самодельная сигнализация на микроконтроллере - sevradio.ru

Курс подробно рассказывает как сделать самые первые шаги, с чего начать не вообще, а конкретно

- ШАГ за ШАГОМ ... - Как сделать нужное вам электронное устройство, печатную плату - Как написать первую, простейшую программу для МК - Как запустить эту программу в программе-симуляторе МК и увидеть как она работает не покупая МК и

радиодеталей, а значит без риска спалить что-то или испортить порт вашего ПК ! - Как загрузить программу в реальный МК - Как отладить реальное устройство - т.е. найти причины не правильной работы и добиться его

функционирования в соответствии с поставленной задачей. Цель курса - помочь вам быстро начать использовать микроконтроллеры семейства AVR с

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

микроконтроллеров, в том числе и МК AVR, вам не нужно досконально знать электронику и языки программирования. Курс поможет вам научится искать и творчески использовать информацию в объеме

необходимом для реализации конкретного проекта, устройства .

Содержание. стр. 0 Заглавная страница курса - 123avr.COM ( то что вы сейчас читаете) - втупление и первые

эксперементы стр. 1. Ключевая страница курса - ИЗУЧИТЕ ЕЁ ! она ГЛАВНАЯ в курсе ! стр. 2. Что такое МК и AVR в частности. Как работает МК. стр. 3. Возможности МК. Что и как подключать к МК. Регистры и программа. Прерывания в AVR. стр. 4. Компиляторы и Симуляторы для МК AVR. стр. 5. Си для МК - очень малая часть языка достаточна для работы с МК. стр. 6. Задачи-упражнения по курсу - это практические занятия по работе с МК и необходимые

теоретические сведения и комментарии. Макетные платы, изготовление плат, пайка. стр. 7. Как и чем прошить (прожечь, загрузить) программу в МК AVR, ATmega. Как сделать программатор

5-проводков или сложнее. стр. 8. Дополнительные, полезные материалы стр. 9. О великолепных МК серии PIC12, PIC16, PIC18 от компании MicroChip

Курс имеет простую навигацию, плюс в конце каждой страницы есть линки на следующую и предыдущую

страницы. Я очень советую вам читать курс последовательно, так как изложен материал. Поверьте, это

важно и правильно ! Шаг 1. Скачайте всего две программы - компилятор CodeVisionAVR (2 Мб всего) Бесплатный DEMO до 2 кб кода, а полный CVAVR ниже на

сером фоне. - симулятор AVR и электроники VMLAB (4,2 Мб FREE)

Установите эти программы. Теперь у вас есть качественное и удобное программное обеспечение для ПОЛНОГО цикла разработки устройств

на МК (микроконтроллерах) AVR. От интерактивного помошника для создания начального кода, скелета программы - инструмент бесценен для начинающего, до написания и отладки полной программы с постоянным

контролем еѐ работы на всех этапах ее создания на компьютерной модели нужного вам микроконтроллера AVR совместно с

популярными электронными компонентами подключенными к нему виртуально. CodeVisionAVR - имеет встроенный программатор для загрузки готовой программы в реальный микроконтроллер. Даже DEMO версия

позволят прошивать прошивки любого размера!

2

Вам не нужно будет тратить деньги и время на поиски и покупку радио деталей и

микроконтроллеров пока вы не убедитесь в работоспособности устройства которое вы

делаете ! Вы не сожжете по неопытности что либо. Не попадете в спешке, в азарте отладки устройства под высокое напряжение.

Шаг 2. Попробуйте - всѐ ОЧЕНЬ просто ! Лучше один раз увидеть чем сто раз услышать. 1. Загрузите файлы к задаче упражнению 8 (это всего 14 Кб) в созданную папку - c:\VMLAB\z8

и распакуйте файлы архива в эту же папку. 2. Запустите VMLAB и через меню Project -> open project откройте проект c:\vmlab\z8\vmlab.prj 3. Сверните мешающее окно vmlab.prj и подправьте "мышкой" остальные окна чтобы получить такую

картинку : click - полная картинка экрана

Вы видите

- 8 светодиодов, - 3 переменных резистора,

- клавиатуру на 16 кнопок которые можно использовать и раздельно,

- виртуальный ЗАПОМИНАЮЩИЙ осциллограф

- виртуальный терминал с записью данных - просмотр портов МК

3

- слежение за содержанием переменных

- отладка по коду программы на Си - диаграмма PD1 - передача по USART

Весь богатейший набор компонентов VMLAB будет рассмотрен позже и конечно описан в его HELP. 4. Теперь в меню "Project" кликните "Re-build all" - проект нужно перекомпилировать при открытии и

внесении каких либо изменений. В окне "Messages" появится сообщение "Success! All ready to run". Это значит

ошибок нет и все готово к моделированию микроконтроллера ATmega16. Вверху загорелся зеленым светом светофор.

Можно запускать симуляцию ...

Если появилось сообщение об ошибке и светофор не загорелся - вы допустили ошибку на каком то

этапе. Проделайте Шаг 2 сначала и более внимательно.

Все МК AVR перечислены в таблице в самом низу этой страницы, и на сайте производителя конечно. Шаг 3. Симуляция - моделирование работы МК.

1. Нажмите мышкой светофор - это аналогично включению устройства, подаче питания на МК - программа зашитая в него начинает выполняться... И тут же остановка! Дело в том что VMLAB контролирует правильность работы МК и содержимое программы.

Если ему что-то не нравится то симуляция прерывается и в окне Messages появляется сообщений о причине. Подробнее это будет обсуждаться позже, а пока ... 2. Нажмите светофор еще пару или столько раз сколько потребуется до начала непрерывной симуляции. Понаблюдайте внимательно что происходит на экране. В окне SCOPE (это виртуальный осциллограф) вы видите как меняются напряжения на ножках МК указанных в

файле проекта - vmlab.prj Верхняя осциллограмма - это сигнал на ножке TXD (PD1) по которой МК передает данные на COM порт ПК - что передает МК мы видим в виртуальном терминале TTY в панели Control Panel Там выводится значение ШИМ (PWM) сигнала создаваемого на ножке PD5 - а сам сигнал виден в окне SCOPE - посмотрите как он меняется в соответствии с сообщаемыми числовыми значениями... В файле проекта - vmlab.prj к ножке PD5 подключен простейший фильтр нижних частот (ФНЧ) из резистора и конденсатора - он преобразует ШИМ в постоянное напряжение которое можно увидеть в окне SCOPE сигнал

DAC (АЦП по-русски) 3. Остановите программу красной кнопкой STOP. В окне Messages появится сообщение о том что программа остановлена пользователем - User break 4. Разверните окно Code - в нем отображается исходный код программы которая "прошита" в МК и выполняется при симуляции. Вы увидите что некоторые строки программы подсвечиваются желтым цветом - длина подсветки

пропорциональна времени которое программа тратит на выполнение этой строки. 5. Найдите строку в программе: pwm_val = ((1023 * (u32)pwm)/100);

Щелкните по квадратику с зеленой вставочкой перед этой строкой - он превратится в красный знак STOP вы

поставили "точку останова" (Break point) - теперь программа автоматически остановится перед выполнением

этой строки. 6. Сверните окно Code и нажмите светофор для продолжения симуляции.

Дождитесь остановки программы на этой строке (на этой точке останова) - при остановке строка программы подсветится голубым цветом. Посмотрите на панели внизу справа текущее "чистое" время (без учета остановок)

прошедшее с запуска программы - запомните. 7. Теперь продолжите симуляцию - надеюсь вы поняли как это сделать! (нажать зеленый светофор) Через

некоторое время программа опять остановится на этой строке но время уже будет другим. Вычтите из него время

4

прошлой остановки и вы получите время выполнения этого участка программы. О более точном измерении

интервалов времени я расскажу вам позже.

Информация об остановках программы отображается и в окне Messages.

Шаг 4. Как изменить программу ? Вам предстоит многократно менять создаваемые программы - в процессе отладки, пока они не

начнут работать так как вы хотите. 1. Запустите компилятор CodevisionAVR (CVAVR) и через меню File -> Open откройте файл проекта CVAVR - c:\vmlab\z8\cv.prj 2. Разверните окно с текстом программы. Вы видите что программа начинается с оформленного в виде комментария краткого описания того что она делает и некоторых технических параметров. Программа написана

на языке Си - который является пожалуй самым популярным и удобным при программировании для МК.

Не пытайтесь сразу понять что написано в этой программе. Сейчас это вам не нужно ! Понимать

программы и уметь их создаватьвы будете после освоения всего курса. Пока просто внесем

изменение в программу и утвердим их перекомпиляцией.

3. Найдите в тексте программы в компиляторе CVAVR строки: putchar('P'); // вывод в USART символа P putchar('W');

putchar('M');

Давайте заменим выводимое этими строками слово PWM

на слово WOW (типа вау! получилось!) - вот так: putchar('W'); // вывод в USART символа W putchar('O');

putchar('W');

4. После внесения изменений в исходный текст программы ее нужно cкомпили-

ровать. Компилятор должен превратить вашу программу в файл "прошивку" .hex который можно прошить (загрузить) в реальный МК или использовать в симуляторах. 5. Для выполнения компиляции нажмите кнопку "Make the project"

После компиляции появится информационное окно в котором сообщается что наша программа содержит

целых 5 ошибок ! В чем же дело? Где найдены ошибки и каковы они написано красным цветом в левой части экрана в окне Navigator - навигации по проекту CVAVR

5

При наведении курсора можно увидеть описание ошибок.

6. Первая ошибка - "не могу открыть файл m8_128.h" Все ясно. Этот файл включен в исходный текст программы строкой: #include <m8_128.h> Этот файл я создал для возможности прямой вставки примеров на Си из даташита в текст программы в CVAVR. В инсталяции компилятора его нет. Но в тексте программы написано где можно взять этот файл - скачайте

m8_128.h

Скачав, поместите его в папку INC компилятора CVAVR. 7. Снова компилируем программу кнопкой "Make the project" - теперь получаем сообщение об отсутствии ошибок и о размере программы и о том сколько это %% от максимального размера программы для данного МК. Посмотрите внимательно - хотя ошибок нет - есть "вонинг" - это замечание от компилятора. Вонинги не критичны, но можно посмотреть в навигаторе о чем они.Закройте информационное окно кнопкой "ОК". Вы выполнили всего 4 несложных шажка, но уже знаете что

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

При этом видеть не только то что происходит на ножках МК но и то что происходит внутри МК !!! с помощью нижних частей меню View и Window симулятора VMLAB. Вы уже знаете как открыть проект в компиляторе, внести изменения, скомпилировать программу,

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

Шаг 5. Симуляция после правки

1. Разверните окно симулятора VMLAB - выскочит сообщение о том что файл с текстом симулируемой программы изменен. Мы же его меняли в компиляторе. Закройте его кликнув "ОК". 2. Сделайте "глубокий рестарт" симуляции кнопкой с круговой темно-синей стрелкой и перекомпилируйте весь проект как в Шаге 2 пункт 4 или нажав комбинацию: Shift+F9 Все готово к повторной симуляции. 3. Нажмите светофор 3 раза - начнется непрерывная симуляция и вы увидите результат правки программы в компиляторе CVAVR в окне виртуального терминала симулятора VMLAB - вот он:

6

Обратите внимание на то что симулятор показывает примерный расчетный ток потребления МК. Скорость

симуляции можно снизить регулятором Speed. А частоту кварца можно поменять кнопками Clock. Кроме того указаны текущие параметры настройки терминала которые можно изменить нажав кнопку "Set parameters". Кнопки "Clear" очищают окна. Вы можете набирать текст в окне TX и он будет передаваться в МК (см.

пример к симулятору C:\VMLAB\AVR_demo\UART.PRJ) а можно передать в МК текстовый файл кнопкой "TX File". Если отметить чек-бокс "RX to file" то данные поступившие от МК будут записываться в файл на ПК.

Найдите время и обязательно выполните остальные примеры симулятора VMLAB.Это позволит вам лучше понять его возможности. Дополнительные важные примеры в папке C:\VMLAB\tutorial.

Вот скриншот работы МК в VMLAB

Попробуйте поискать полезную инормацию в Гугле - ее там море ! Просто попробуйте ввести например

"ATmega datasheet на русском". Учитесь искать!

Вы уже запустили МК и увидели как он работает виртуально ! Вы видите что это просто, доступно, не дорого и безопасно ! Вы не покупали МК ATmega16 - у вас его нет ! Вы ни чего не паяли и не подключали ! Но вы увидели как работает МК и программы. Получили осциллограммы работающего устройства. Могли записать в файл то что передавал МК.

Программа примера была создана в отличном, и очень удобном для начинающих компиляторе CodeVisionAVR. Этот компилятор является достаточным инструментом для полного цикла разработки вплоть до прошивки МК (дополнительно потребуются лишь интерфейс для электрического соединения МК и ПК - если у

вас есть LPT то нужны всего 5 проводков - см. стр. 7) и отладки устройства. Демо версия имеет ограничение на максимальный размер кода программы в 2 Кб это довольно много для начинающего. Если вам этого мало вы

наверняка сможете найти полную версию программы CodeVisionAVR в Интернете.

Вступление закончено. Далее собственно ... Краткий курс AVR на примерах. Присылайте отзывы, пожелания замечания и дополнения !

7

- стр. 1 - КЛЮЧЕВАЯ СТРАНИЦА КУРСА

Прочитайте, сохраните и знайте ! - Как воспользоваться этим курсом ?

- Как распорядится его ресурсами правильно ? - Где и какую искать информацию ?

- Где найти схемы и программы

- Где купить МК и электронные компоненты ? - Как сделать электронное устройство ?

- Пример: Что можно взять полезного из АпНоута.

Наберитесь терпения и прочитайте весь курс (он укорочен и сжат насколько возможно) Читая первый раз, не расстраивайтесь что вам не все понятно - это нормально, однако в результате

чтения вы ознакомитесь с содержанием курса и будете знать о чем и где примерно в курсе идет речь и МК термины будут у вас "на слуху". Затем читайте краткий курс более внимательно и ОБЯЗАТЕЛЬНО ДЕЛАЙТЕ то что прошу вас делать в

курсе и в упражнениях-задачах курса. Упражнения - задачи курса - это практические примеры постановки задачи, создания алгоритма, написания программ для МК, симуляции и отладки устройства. Они содержат

необходимые теоретические материалы и архивы с полученными программами и результатами. Что делать если вы не сильны в Электронике? Если мало знаний по электронике, но есть желание что-то сделать - то главное у Вас уже есть! Человек умеющий

читать, может все ! Для вас Книги по электронике: Книги по программированию МК и ПК Книги по МК AVR ATmega ATtiny

Особенно рекомендую начинающим книги по основам электроники и схемотехники: Настольная книга электронщика: П.Хоровиц, У.Хилл. Искусство схемотехники - общепризнанная библия электронщика на РУССКОМ языке.

Уже 5-е издание - от теории полупроводников до типовых электронных схем с подробнейшим

описанием принципов их работы ! Аналоговая и цифровая электроника. аналогичная книга: У.Титце и К.Шенк "Полупроводниковая схемотехника".

По ходу работы ОБЯЗАТЕЛЬНО: записывайте возникающие вопросы, и лучше на бумагу - моторная память ! ищите в DataSheet (ДШ) регистры и устройства МК используемые и упомянутые в задаче, прочитайте о

них подробней. Уясните роль каждого бита и регистра. если вопросы остались перечитайте задачу снова, eсли вопросы не разрешены, ищите ответ: o 1) в help и документации компилятора, симулятора и других используемых программ! o 2) поиском Windows в папках и help компилятора и симулятора. Ищите ключевые слова содержащиеся в тексте файлов, а не в их названиях ! o 3) в моем AVRFAQ - это сборник ответов на часто задаваемые мне

по курсу вопросы и советы по применению МК от знающих людей. o 4) Если все же не найдете ответа - задавайте вопрос

в конференции Вам ответят правильно в течении дня Если вы правильно, на нормальном русском языке, продумайте и

сформулируете ваш вопрос и лучше напишите его в теме. Вам ПОКА не нужно покупать МК, радиодетали и паять что либо ! Вы сможете не имея МК проделать весь цикл разработки управляющей программы для него : - написать программу для МК в компиляторе и скомпилировать ее, - запустить и отладить ее на компьютерном симуляторе МК, - получить осциллограммы сигналов вашего устройства

работающего виртуально, на вашем ПК. - увидеть на мониторе ПК как в симуляторе VMLAB МК мигает светодиодами,

реагирует на нажатие кнопок, выводит информацию на LCD, измеряет напряжения, работает с логическими и аналоговыми элементами схемы, - посмотреть как МК ведет обмен по интерфейсам i2c TWI 1-wire rs-232 UART

TWI и записать его для последующего анализа. - увидеть как МК отрабатывает прерывания по событиям, засыпает для

снижения энергопотребления и просыпается. - "остановить" и "отмотать назад" время !

что просто не возможно в реальном МК. - симулировать ДВА МК ! одновременно в одной схеме. При этом во второй МК

вы можете поместить программу имитирующую работу какого то нужного вам компонента отсутствующего в симуляторе и даже в природе.

8

- обменятся информацией с симулируемым МК и результат обмена сохранить

в файл для последующего анализа. PTOTEUS - очень мощный, серьезней пакет не только симулирования чего душа пожелает (аналоговая, цифровая, микроконтроллеры, PLD) Hо и для проектирования электроники от идеи до файлов для изготовления

печатной платы ! Протеус является ещѐ и прекрасным интерактивным справочником по электронным

компонентам ! в PTOTEUS вы можете увидеть как МК работающий по вашей программе "общается" с электродвигателями, с шаговыми моторами, с серво, с картами памяти, с жестким диском, сможете даже

сыграть с МК в шахматы ! в симуляторе PTOTEUS вы можете симулировать в одной схеме работу нескольких разных МК одновременно ! причем это могут быть МК разных семейств - AVR, PIC, 8051, ARM7, Motorola

MC68HC11. Как сделать электронное устройство. Прежде чем "изобретать велосипед", т.е. делать свой вариант какого либо устройства ( и не только

электронного ! ) которое наверняка целиком или частично уже было сделано многими людьми и даже трудовыми коллективами - разумно поискать и посмотреть результат их труда и использовать его по

максимуму ! ОБЯЗАТЕЛЬНО ИЩИТЕ существующие аналоги того, что вы хотите сделать - по похожим названиям - по аналогичному назначению - по ключевым словам - по сходной тематике

Ищите источники схемотехнических, алгоритмических, программных аналогий. Анализ того что сделано другими

поможет

вам избежать многих досадных ошибок и тупиковых решений. Отправной точкой в поиске может быть сайт компании Телесистемы.

Эта компания производит множество устройств на МК - схемы этих устройств выложены на их сайте и доступны для скачивания. Там же есть очень полезный раздел: проекты на микроконтроллерах на русском языке -

это читатели сайта и самой "живой" русскоязычной МК конфы (доброжелательная атмосфера, быстрые

ответы даже на "дурацкие" вопросы ламеров, полезная информация - уже более 1300 страниц архива конференции!) публикуют свои разработки там схемы и даже прошивки к большинству из них. Скорее всего

вы найдете то что хотите сделать ! Либо почти "то" и вам останется лишь немного подправить схему или программу под свою задачу. Возможно вам будет проще найти и использовать подходящий электронный набор MasterKit или Velleman - очень большой перечень устройств - цена умеренная В любом случае там вы можете взять схему и

принцип работы устройства, а иногда и прошивку. Методика работы с МК Методика работы с МК - как и с ЛЮБЫМИ электронными компонентами, такова - Hаходите на сайте

производителя или на AllDataSheet или в google.com и скачивайте: - DataSheet - основной документ по компоненту - его паспорт (далее ДШ). обычно в формате .pdf - Errata - описание уже обнаруженных ошибок компонента - для МК AVR серии ATmaga ошибки МК

перечислены в конце ДШ. - Application Notes, Design Notes - примеры применения o АпНоуты (Application Notes, апликухи) - важнейшие после ДШ документы. В них обычно

публикуется схема, описание принципа работы и программа на Си или ассемблере если компонент программируемый. Обязательно скачайте AVR Application Notes

и .zip файлы с кодом программ к ним! Когда вам что-то не ясно просмотрите бегло их, наверняка наткнетесь на схему или код нужный вам как раз сейчас. Некоторые из AVR Application Notes

любезно переведены на русский язык и доступны благодаря проекту GAW.ru - Development Boards или Kits - платы для разработки - Reference Design - пример устройства на компоненте - White paper - поясняющая статья

Это примеры применения компонента в реальных электронных устройствах, советы и наставления ... Пример: Что можно взять полезного из АпНоута. Вот тут найдите ( пример применения = АпНоут = application note ) AVR492: "Brushless DC Motor control using

AT90PWM3" Скачайте документ doc7518.pdf и архив avr492.zip с кодом программ для МК.

BLDC motor - дословно переводится как Бес Щеточный Постоянного Тока мотор. По-русски

ВЕНТИЛЬНЫЙ электродвигатель. Однако питать его постоянным током нельзя - сгорит ! Его нужно питать 3х-фазным переменным напряжением с фазой зависящей от положения ротора ! Рассматриваемое устройство как раз преобразует постоянное напряжение в

3-х фазное переменное. Подробно и главное понятно про электропривод читайте на stepmotor.ru -

там же можно купить электро-мотор-редукторы и шаговые двигатели.

9

AN492 "Контроллер вентильного двигателя на МК AVR AT90PWM3" Повторяю! Некоторые АпНоуты по электроприводу с AVR440 по AVR495 любезно переведены на русский и доступны на великолепном сайте - GAW.ru Открываем документ - doc7518.pdf и видим : - Вначале прекрасную теорию управления трехфазным бесщеточным электродвигателем, обратная связь

осуществляется по сигналам 3-х датчиков холла. - Далее на стр. 6 начинается объяснение широко распространенного алгоритма автоматического

регулирования ПИД (англ. PID) FAQ PID и настройка ПИД регулятора - Очень интересная методически таблица 8 - использование выводов МК - советую вам делать такую

для своего устройства - удобно одним взглядом видеть что подключено к каждой ножке МК в вашем устройстве. - Далее фотография платы готового устройства - говорят лучше 1 раз увидеть чем 100 раз услышать - это

действительно так. На плате устройства можно увидеть - как правильно располагать электронные компоненты,

- какие они бывают,

- как выглядят, - как правильно конструировать плату.

- Далее идут листы с частями схемы устройства - схемы сложных устройств иногда удобней разбить на функциональные блоки и рисовать на отдельных листах : Посмотрите схемы и попробуйте найти компоненты на плате устройства, отследить печатные проводники на плате - в общем поработайте с информацией себе на благо! 1) Лист 2/4 схема POWER - стабилизатора питания МК - готовый вариант для вашего устройства ! ИСПОЛЬЗУЙТЕ ! Микросхема U6 стабилизатор питания MC78M05 (корпус Dpak ищи и смотри ДШ на MC78M05 - черный квадратный

прибор под алюминиевым бочонком) - дает стабилизированные 5 вольт для питания МК из 12 вольт (это здесь, а вообще диапазон входного напряжения может быть шире) от внешнего источника питания устройства. Вот интересно - диод D5 (вертикальный цилиндрик на плате вверху под зелеными клеммами) с конденсатором C19 (алюминиевый бочонок чуть ниже диода) позволяет МК получать непрерывное питание 5 вольт даже при

кратковременном обнулении входного напряжения - такое очень возможно при коммутации мощного эл.

двигателя, еще при этом возникают значительные импульсные помехи в проводе питания - их гасят конденсаторы C18 C19 C20 и резистор R25 значительно повышает эффективность конденсаторов C19 C20 в

подавлении помех от источника питания. Резистор R25 еще защищает стабилизатор MC78M05 от короткого замыкания выхода +5 вольт на землю - он

ограничивает ток.

10

Светодиод D6 (smd корпус - белый прямоугольничек под стабилизатором MC78M05 ) индицирует наличие +5

вольт питания МК - это очень удобно и правильно!

ВАЖНО ! Необходимыми для питания устройства являются лишь 3 элемента - стабилизатор и по

одному конденсатору на его входе и выходе. Но компонентов значительно больше - это сделано для

обеспечения надежной работы устройства. Не поддавайтесь копеечной экономии и обманчивой простоте "ведь работает же" - это не критерий ! Устройство должно

работать надежно !

2) Правее можно увидеть схему интерфейса LIN - он очень широко применяется в автомобилестроении и в других

местах с сильным уровнем помех и позволяет передавать сообщения по последовательному протоколу (хорошо совместим с USART и UART) между устройствами с соединенными "землями" по одному сигнальному проводу со

скоростью до 20 Кбит в секунду. 3) на странице схемы 3/4 изображен МК. Есть несколько интересных моментов:

Питание на МК (вывод VCC) и на встроенный в МК АЦП (вывод AVCC) подается через резистор 10 Ом и эти

выводы зашунтированы 10 нФ конденсаторами на землю устройства - это сделано для фильтрации (ослабления) высоко частотных и импульсных помех наводящихся на цепи питания устройства. Лучший результат можно получить поставив вместо резисторов индуктивности по 60-100 нГн а совсем уж

крутизна применить специальные проходные фильтры для питания, например Murata. К выводу опорного напряжения АЦП МК (вывод AREF) подсоединен лишь конденсатор 100 нФ на землю для

снижения пульсаций напряжения - очевидно используется внутренний источник опорного напряжения - такой имеется и у МК ATmega - на 2,56 вольт. Обратите внимание на разъем J2 JTAG-ISP - этот разъем позволяет прошить МК прямо в системе (с помощью

ISP адаптера) и проводить отладку и мониторинг работы программы МК прямо в готовом устройстве по интерфейсу JTAG . 4) На странице схемы 4/4 изображен мощный драйвер для 3-х фазного электро-мотора. Сделан ОЧЕНЬ ПРАВИЛЬНО - надежно! Оставив 4 транзистора из 6-ти вы получите классический Н-мост (H-bridge) и с его помощью можете управлять обычным коллекторным (щеточным) электродвигателем постоянного тока - DC motor. Есть АпНоуты и по управлению Сервоприводом и Коллекторными двигателями и Асинхронными моторами и

Шаговыми моторами. - полевые транзисторы-ключи SUD35N05-26L (6 черных квадратиков справа на плате) управляются МК через

специальные драйверы IR2184 для полевых транзисторов.

Драйверы IR2184 обеспечивают правильные сигналы на затворах полевых транзисторных

ключей гарантирующие полное и быстрое их открытие и быстрое закрытие - это снижает выделение тепла на транзисторах. Кроме того автоматически формируют паузу между открытым состоянием нижних и верхних

транзисторов одного плеча моста. Одновременное открытое состояние транзисторов вызовет протекание "сквозного тока" от источника питания через оба транзистора ! А "по жизни" ток должен

протекать через нагрузку. Используйте драйверы аналогичные IR2184 - это ПРАВИЛЬНО !

- интересный узел и очень полезный - часто используется во многих устройствах обеспечивая

безотказность их работы : Измеритель суммарного тока протекающего через драйвер и двигатель - схема его стандартна - 3 транзистора

нижнего плеча в драйвере подсоединены к одному проводу, не к "общему" проводу устройства ! А этот провод

через токоизмерительный резистор R18 (беленький прямоугольник справа внизу на плате с надписью R100 - значит 0.1 Ом) подключен к "земле" устройства. Протекание тока I через резистор R вызывает падение напряжения U на нем : U = I * R ( это закон Ома для участка цепи ) это напряжение фильтруется ФНЧ (фильтром нижних частот) образованным R20 и C16 и подается на компаратор LMV7219M5 - он сравнивает его с напряжением заданным с помощью ЦАП (сигнал DAC_OUT) и в

случае превышения на выходе компаратора возникает высокий уровень over_cur - означающий превышение

током заданного значения.

Обычно делают проще - используют не компаратор а ОУ (операционный усилитель) и без сравнения с чем либо усиливают напряжение с R18 (нормируют сигнал) и подают на АЦП. Программа МК по результату АЦП судит

о величине тока.

11

Однако примененная схема с компаратором (его роль может выполнять и ОУ) позволяет быстрее реагировать на

превышение тока выше заданного значения - ведь сигнал с компаратора можно подать на один из входов INTx - это ножки МК имеющие возможность прерывать программу МК по внешнему событию. МК при возникновении

такого прерывания примет меры для снижения тока - обычно это делается путем изменения величины ШИМ

сигнала управляющего "мостом". Обратите внимание! Для защиты драйверов IR2184 по питанию - предусмотрен защитный диод TVS SMBJ18 -

но на плате его нет.

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

В АпНоуте AVR492 еще много информации к размышлению и применению и еще есть архив с программой для МК !

Пожалуйста найдите время и просмотрите!

12

- стр. 2 - Советую читать курс с начала !

Что такое Микроконтроллер (МК) ? Почему AVR ? Главное по устройству МК. Внешние сигналы. Как МК решает, что на ножке: "1" или "0" Ножки - выводы МК - какие они бывают.

Я считаю, что МК это микросхема (чип, камень, IC) - которая в ответ на внешние электрические сигналы

действует в соответствии с : - возможностями заложенными производителем - электроникой подключенной к МК - программой которую в него загрузите ВЫ.

Возможность МК действовать по вашей программе - вот суть-соль МК. Это главное отличие МК от "обычных" НЕ

программируемых микросхем. Что такое AVR ? Это семейство МК (Таблица всех МК AVR) от компании ATMEL разработанных

с учетом особенностей и удобства написания программ на языке Си. Вот ознакомительная статья: Знакомьтесь, господа: AVR ! Вот полное описание МК AVR на русском языке - перевод ДатаШита : AVR ATmega русский ДШ.

Книги и учебники по AVR тут Почему AVR ? Это не дорогие, широко доступные, надежные, простые, довольно быстро считающие большинство инструкций

выполняется за 1 такт - т.е. при кварце 10 МГц выполняется до 10 млн. инструкций в секунду ! AVR имеют развитую периферию, т.е. набор аппаратуры окружающей процессор-вычислитель в одном корпусе МК или набор встроенных в МК электронных устройств, блоков, модулей. Вот основные параметры AVR: - тактовая частота до 20 МГц ; - встроенный программируемый RC-генератор, частота 1, 2, 4, 8 МГц; - Flash-ПЗУ программ, программируемое в системе, 10 000 циклов перезаписи; - EEPROM данных (100 000 циклов) - она не "забывает" при откл. питания; - внутреннее ОЗУ со временем доступа 1 такт; - 6 аппаратных команд умножения (для семейства mega); - развитая система адресации, оптимизированная для работы с С-компиляторами; - 32 регистра общего назначения (аккумулятора); - синхронный (USART) или асинхронный (UART) (в mega64 и mega128 их по 2); - синхронный последовательный порт (SPI); - двухпроводный интерфейс TWI, совместимый с интерфейсом I2C; - многоканальный PWM 8-, 9-, 10-, 16-битный ШИМ-модулятор; - 10-битный АЦП с дифференциальными входами; - программируемый коэффициент усиления перед АЦП 1, 10 и 200; - встроенный источник опорного напряжения 2,56 В; - аналоговый компаратор; - сторожевой таймер - перезагружает МК при "зависании"; - настраиваемая схема задержки запуска после подачи питания; - схема слежения за уровнем напряжения питания; - JTAG-интерфейс для подключения эмулятора (в МК с объемом ПЗУ от 16 кбайт); - микропотребление (менее 100 мкА в активном режиме на частоте 32 кГц); - датчик температуры (в ATtiny25 ATtiny45 ATtiny85).

Существуют AVR-ы со встроенными интерфейсами USB, CAN и со встроенными радио приемо-

передатчиками.Есть специализированные МК AVR для управления электроприводом электродвигателями - серия AT90PWMxxxx Очень важный, Добрый совет вам : Вы начинающий и наверно благоразумно не планируете делать сразу серийное коммерческое устройство, а хотите использовать МК для любительских штучных изделий, Используйте в ваших устройствах какой-то один и тот же

"многоногий" МК AVR серии ATmega Желательно один из этих: ATmega16 - настоятельно рекомендую! ATmega169, ATmega32, ATmega64 ATmega128 - настоятельно рекомендую! (... а вот он же на мини плате)

- они позволяют выполнить любую задачу любительского уровня (и многие

задачи профессионального уровня - это же серийный МК) - они поддерживаются симуляторами электронных устройств на AVR - VMLAB (о нем чуть позже и подробней) и

супер-пупер симулятором PTOTEUS (он кстати позволяет симулировать и другие МК семейств PIC, 8051, ARM7,

13

Motorola).

- они имеют достаточно оперативной памяти и памяти для вашей программы - они имеют много выводов (ножек) - это очень удобно !

- они имеют встроенный RC генератор и могут работать без внешнего кварца - достаточно подать питание на

новый МК и он "затикает" ! Используйте один и тот же МК и он станет вам "своим в доску" . Вы сможете: - хорошо изучить его устройство и особенности - распечатать важные страницы ДатаШита - не тратить каждый раз время на изучение особенностей другого МК,

на поиск "граблей" у новичка, - у вас будут накапливаться куски программ уже проверенных вами

именно на этом МК - вам будет ВСЕГДА хватать ножек (выводов) МК и памяти для программы

Вам будет ОЧЕНЬ удобно работать a это важно для уверенного старта. Вы будете знать всего один МК , но будете знать его очень хорошо ! Не бойтесь многоногих ATmega с большим количеством "периферии" (встроенных в МК, полезных, но возможно

не нужных вам пока устройств с непонятными названиями). Все они изначально - "по умолчанию" обычно отключены и о них можно не думать. Вам нужно будет позаботится о включении и конфигурации только

тех из них, которые понадобятся вам а вашем устройстве.Забегая вперед скажу что сделать это очень просто благодаря встроенным в компиляторы CVAVR и ICC интерактивным визадам мастерам начальной конфигурации

МК и создающим начальный текст программы.

Если вы хотите только помигать для начала светодиодом - то даже на ATmega128 вам нужно всего лишь подключить к МК : - питание от 4 до 5.5 вольт (3 пальчиковых батарейки например) - 5 проводков на принтерный порт ПК для ISP "прошивания" программы в МК (подробнее об этом на стр. 7

курса) - светодиод (катод (черточка на схеме) к ножке МК а анод светодиода к + питания МК через резистор

430-750 Ом ) - написать программу мигания светодиодом и загрузить (=прошить=прожечь) еѐ в МК.

Вас совершенно не тронет и не напряжет та "навороченность" что заложена в ATmega128. Она будет тихо ждать пока вы ее не затребуете! Четкое понимание алгоритма работы устройства это основа - базис для успешной разработки самого устройства и

программы для МК ! Микроконтроллер AVR ATmega - ключевые моменты устройства Напомню: Самая подробная и полная информация по МК содержится КОНЕЧНО же в его ДШ.Он доступен в оригинале и на русском языке. Подробнее об основах и тонкостях устройства МК AVR и работе с ними читайте в книгах : - Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel

- Микроконтроллеры AVR от простого к сложному - Микроконтроллеры это же просто

об основах и тонкостях электроники и схемотехники читайте в настольной книге электронщика: П.Хоровиц, У.Хилл. Искусство схемотехники - общепризнанная

библия электронщика на РУССКОМ языке. Уже 5-е издание. Я уже предупреждал вас выше: МК является микросхемой которая в ответ на внешние электрические сигналы

действует в соответствии с возможностями заложенными производителем, электроникой подключенной к МК, программой которую в него загружена, например вами. Разберем по пунктам: Внешние электрические сигналы Это напряжения и токи поступающие к МК от подключенных к нему проводниками других компонентов электронного устройства. Важнейший из них - это напряжение питания МК. МК AVR серии ATmega могут работать,

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

Диапазон допустимых напряжений питания указан на первой странице ДШ

и составляет обычно 4.5 - 5.5 вольт постоянного напряжения - плюс которого подключается к выводам VCC МК.

Для МК ATmaga с буквой L в названии диапазон питания 2.7 - 5.5 вольт - он шире (достаточно литиевой батарейки или двух пальчиковых) но зато максимальная частота тактирования МК в 2 раза ниже и обычно

составляет 8 МГц.

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

Проводник соединенный с выводами GND МК называют общим или нулевым или "земля" и на схеме обозначают специальным символом - например жирной горизонтальной черточкой или несколькими

горизонтальными полосками друг под другом убывающей длины.

14

Электрические сигналы это токи и вызываемые их протеканием напряжения. Но говоря о сигналах

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

момент времени и если он был 2 вольта а стал 4 вольта то он обязательно принимал все значения лежащие

между 2-мя и 4-мя вольтами. ( ВАЖНО ! )В цифровой технике приняты некоторые правила по которым можно представить аналоговый

сигнал допустимый для подачи на ножку МК (он должен быть выше -0.5 вольт и ниже чем напряжение питания МК увеличенное на 0.5 вольта, я советую 0.3 вольта ) как 1-битный цифровой сигнал или как одно из двух

значений: "1" - высокий логический уровень (ВЛУ) - логическая единица "0" - низкий логический уровень (НЛУ) - логический ноль

Эти правила для ножек МК которые могут быть входами (и кроме XTAL1 и RESET) в МК AVR описаны в разделе ДШ "Electrical Characteristics" и иллюстрированы графиками : График 181 из ДШ на МК ATmega16 Показывает зависимость порогового (Threshold) напряжения переключения из "0" в "1" от

напряжения питания МК.

Очень важно правильно понять этот график ! Он означает следующее: Если МК считал напряжение на ножке (левая вертикальная шкала графика)

логическим нулем и это напряжение было ниже линии графика, то при достижения напряжением на ножке

этой линии графика - МК начинает считать что теперь на ножке присутствует логическая единица - "1". Значит теперь в регистре PINX порта_Х которому принадлежит эта ножка соответствующий ей бит стал "1" - единицей (а

был "0" - нулем) Это типовое значение ! т.е. наиболее вероятное для вашего МК. По графику при напряжении питания МК 5 вольт этот порог примерно 1.9 вольт в диапазоне температур от -40 до 85 градусов.

Но есть еще и гарантированное значение напряжения при превышении которого МК будет считать, что на

ножке появилось напряжение соответствующее логической единице. Оно равно 60% от напряжения питания МК - для 5 вольт это будет 3 вольта. Запомните ! Что бы быть уверенным что МК AVR (питающийся от 5 вольт) воспримет входной сигнал (входное напряжение) как "1" вы должны позаботится о том что бы это напряжение было не ниже

чем 3 вольта ! Уточняйте в разделе ДШ "Electrical Characteristics" для вашего МК ! График 182 из ДШ на МК ATmega16 Показывает зависимость порогового (Threshold) напряжения переключения из "1" в "0" от

напряжения питания МК.

15

Он означает следующее: Если МК считал напряжение на ножке логической единицей и оно было выше линии графика, то при снижении напряжения на ножке МК до линии графика - МК начинает считать что теперь на

ножке присутствует логический ноль - "0". Значит теперь в регистре PINX порта_Х которому принадлежит эта ножка соответствующий ей бит стал "0" - нулем - НЛУ (а был "1" - ВЛУ) Это типовое значение ! т.е. наиболее вероятное для вашего МК.

По графику при напряжении питания МК 5 вольт этот порог примерно 1.3-1.4 вольта в диапазоне температур от -40 до 85 градусов. Но опять существует гарантированное значение напряжения ниже которого МК будет считать, что на ножке появилось напряжение соответствующее логическому нулю. Оно равно 20% от напряжения питания МК -

для 5 вольт это будет 1 вольт. Что бы быть уверенным что МК ATmega16 (питающийся от 5 вольт) воспримет входной сигнал (входное напряжение) как "0" вы должны позаботится о том что бы это

напряжение было не выше 1 вольта ! Запомните: Напряжение на ножке выше чем 60% напряжения питания МК гарантировано воспринимается им как ВЛУ

или "1" - высокий логический уровень Напряжение на ножке ниже чем 20% напряжения питания МК гарантировано воспринимается им как НЛУ

или "0" - низкий логический уровень Эти пороговые уровни для напряжения питания 5 вольт будут 3 и 1 вольт Это справедливо для диапазона напряжений питания VCC = 2.7-5.5V

Возникает вопрос - а чем будет считать МК сигнал 1.7 или скажем 1.46 вольта ? т.е. как МК

интерпретирует напряжение на ножке между рассмотренными выше пороговыми уровнями ? Это зависит от того

чему был равен соответствующий этой ножке бит в регистре PIN_X (т.е. от того каким ЛУ считал МК напряжение на ножке) до появления напряжения попадающего между двумя порогами переключения - и по приведенным

выше двум правилам - этот бит не может изменится ! Важный вывод - любое изменение напряжения на ножке МК лежащее между двумя пороговыми

напряжениями не ведет к изменению того каким логическим уровнем считает МК напряжение на этой ножке в данный момент ! Внимательно прочитайте и поймите, запомните - все входные сигналы с ножек МК поступают на

встроенные триггеры Шмитта (аналогичные двум последовательно включенным элементам микросхемы 74HC14) - это устройства имеющие гистерезис (иначе - разность напряжений) по входному напряжению переключения их

выходов из "1" в "0" и наоборот. По графику 183 в AVR гистерезис составляет примерно 0.57 вольта при VCC 5 вольт

16

Г истерезис по входному напряжению позволяет отсечь помеху (существующую во входном сигнале и/или наводку - напряжение создаваемое внешними электромагнитными полями в проводнике подводящем сигнал

ко входу приемника - в нашем случае к ножке МК) с размахом до величины гистерезиса и четко распознать преобразовать в логические единицы и нули зашумленный цифровой сигнал. Если подключить двух лучевой осциллограф ко входу и выходу триггера Шмитта и подать на его вход смесь

цифрового сигнала размахом 4-5 вольт и шумового сигнала размахом чуть меньше гистерезиса - мы увидим следующую картину: На входе тригера Шмитта будет черти что в котором будет угадываться цифровой сигнал а

на выходе будет чистенький прямоугольный цифровой сигнал !(Вы можете смоделировать это в PROTEUS или в MicroCAP) Подробнее об основах и тонкостях электроники и схемотехники читайте в книге оглавление которой на заглавной

странице. Теперь вы знаете как AVR преобразует напряжения на его ножках в "1" или "0" МК внешние сигналы : 1) сигнал сброса RESET - при "0" на этой ножке МК останавливает выполнение программы, содержимое

регистров МК становится начальным (см. таблицу регистров в конце ДШ - в основном все биты нули) а все выводы становятся высокоомными входами (говорят: Z - состояние). После появления на этой ножке "1" и наличии питания МК - выполнение программы начнется с начала, как после включения питания МК Подробней см. в разделе "Resetting the AVR" ДШ. Эту ножку можно ни куда не

подключать благодаря внутреннему резистору "подтягивающему" ( подающему ток от источника более высокого напряжения) ее к питанию МК, но я бы посоветовал не оставлять reset в воздухе а "заземлить" конденсатором

0.1 мкФ - а еще лучше и подключить к reset диод типа 4148 черточкой к + питания МК и параллельно

диоду резистор 5-12 КОм. Запомните: Черточка над названием сигнала: SIGNAL означает что активный уровень этого сигнала "0" - т.е.

событие соответствующее ему происходит при НЛУ. Косая черта / может означать в описании бита : o R/W - если бит "1" режим R а если бит "0" режим W o R/W - может еще означать возможность записи и чтения этого бита 2) питание аналоговой части МК, АЦП (входы ADC_x ) ножка AVCC - ее нужно соединить с выводом VCC питания МК даже если вы не предполагаете использовать АЦП. 3) опорное напряжение для АЦП (входы ADC_x ) ножка AREF - напряжение на ней должно быть от 2 вольт до напряжения питания МК. Напряжение на входах АЦП равное или превышающее AREF будет оцифровываться

в код 1023 (давать результат АЦП равный 1023. Всегда желательно заземлять эту ножку конденсатором на 0.1 мкФ. Вы можете использовать внутренний источник опорного напряжения на 2,56 вольт. (МК AVR ATmega

имеет встроенный 8-ми канальный (АЦП) Аналого Цифровой Преобразователь - он позволяет преобразовать

напряжение на ножках МК подключаемых к АЦП в число от 0 до 1023 - т.е. в 10 битный результат.) 4) ножки для подключения кварца или керамического резонатора XTAL1 XTAL2. Для работы МК необходимритм

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

имеют встроенный источник тактовой частоты RC-генератор (с завода он включен на частоту 1 МГц обычно) и к

этим выводам можно ни чего не подключать, чаще требуется более точный источник тактирования -

17

наиболее популярный это кварц - правильнее кварцевый резонатор - его подключают между этими ножками МК, а

с самих ножек подключают конденсаторы 22-33 пФ на землю.

Важно установить фьюзы (Fuses) в соответствии с параметрами нужного вам тактового сигнала и его

источника. Читайте раздел ДШ "Sestem clock and Clock options" и таблицу 2. "device clocking options select"

18

. FUSE (фьюз) - Это в общем то обычный бит в регистрах фьюзов но программа МК не может их изменить.

Вы можете менять их только программатором. Фьюз "запрограммирован" - его значение "0" Фьюз "НЕ запрограммирован" - его значение "1"

С завода МК поставляется с определенной комбинацией фьюзов - все указано в ДШ. Будьте внимательны с

фьюзами! Прежде чем менять фьюзы определите точно что вы делаете, иначе вы можете по ошибке отключить

режим ISP программирования и МК можно будет перепрограммировать только специальным программатором. Список фьюзов для каждого МК удобно смотреть и устанавливать их состояние в диалоге настройки

программирования компилятора CodeVisionAVR. Вот список комбинаций состояний фьюзов для МК ATmega128 с кратким описанием их назначения: рис. више.

Не пугайтесь! В большинстве МК их гораздо меньше. МК ATmega16 поставляется с такой комбинацией 6-ти фьюзов относящейся к

источнику тактового сигнала - абзац "Default Clock Source" : SKSEL 0001 SUT 10 Это означает - включен внутренний источник тактовой частоты - RC-генератор и генерируемая частота 1 МГц. Подробней о фьюзах на стр. 7 курса. О фьюзах AVR рассказано и внизу этой

страницы. По умолчанию в МК включен интерфейс JTAG - поэтому 4 ножки в PORTC не доступны для обычного использования. Чтобы отключить JTAG нужно изменить фьюз JTAGEN в "1". JTAG можно выключить и программно

- для этого нужно два раза подряд вписать "1" в бит JTD в регистре MCUCSR в течении 4 тактов МК. Чтобы опять включить JTAG нужно два раза подряд вписать "0" в бит JTD. Ножки - выводы МК - какие они бывают. Если вам нужно тактировать МК внешним сигналом (например от другого МК в системе или какой либо микросхемы имеющий собственное тактирование) то его нужно подать на ножку XTAL1 , а ножку XTAL2

оставить свободной. Параметры такого сигнала см. в ДШ. Есть еще выводы и для подключения очень точного но медленного часового кварца - обычно это маленький

цилиндрик с двумя гибкими ножками, конденсаторы ему обычно не нужны, да и сам этот кварц нужен если вы хотите сделать например часы реального времени - т.е. он совсем не обязателен. Порт в МК С учетом занятости некоторых ножек МК под конструктивно заданные функции, количество выводов МК доступных вам для использования меньше чем имеет МК ! МК ATmega16 позволяет

использовать 32 ножки из 40 в корпусе DIP. Эти 32 ножки составляют 4 порта МК Порт в МК - это 8 ножек или линий ввода-вывода (выводов МК или IO или I-O или I/O) имеющие

индивидуальные номера от 0 до 7 и общую букву A, B, C, D, ... отличающую этот порт от других. Пример для PORTB : Порт_B имеет (как и другие порты МК) минимум 3 сопоставленных ему регистра : DDRB - значение битов в этом регистре определяет чем будет ножка этого порта с номером этого бита -

начальное (при включении МК или после сброса) значение "0" - ножка вход если сделать бит = "1" (говорят: установить бит англ. set bit ) эта ножка станет выходом. если сделать бит = "0" - говорят: сбросить или

очистить бит англ. clear bit PINB - биты этого регистра показывают чем ("1" или "0") считает МК напряжение на ножке порта с номером этого бита. (этот регистр в ATmega16 нужно только читать, записывать в него что либо бесполезно).

ВНИМАНИЕ ! В микроконтроллерах AVR старой серии AT90s и в ATmega8, -16, -32, -48, -64, -88, -128, -

168 имеет смысл только читать из регистров PINx.

В микроконтроллерах ATtiny2313, ATtiny13, ATtiny25, ATtiny45 в других ATtiny в AT90PWM2, AT90PWM3, в AT90USB, в ATmega640, 1280, 1281, 2560, 2561 Запись "1" в бит регистров PINx вызывает

изменение соответствующего бита в PORTx Вывод этих контроллеров можно переключать очень быстро - с частотой тактового сигнала !

PORTB - бит этого регистра нужно сделать "1" или "0" что бы на ножке порта с номером этого бита появился "1" или "0". При этом такой же бит регистра DDRB должен быть "1" - т.е. ножка должна быть выходом. Если она

сконфигурирована как вход (т.е. еѐ бит в регистре DDRB очищен или равен нулю) - то если очищен и соответствующий бит в регистре PORTB ножка будет высокоимпедансным входом (Z-состояние, вход с очень

высоким входным сопротивлением более 10 МОм), а если бит в регистре PORTB установлен, т.е. равен "1" то

включается "подтяжка" (pull-up) высокоимпедансного входа к плюсу питания МК через встроенный резистор примерно 40 КОм - ножку как бы соединяют таким резистором с питанием МК. "Подтяжку" можно использовать для создания четкой лог. "1" на ножке-входе МК без внешних компонентов. К такому входу вы можете подключить кнопку замыкающую его на "общий" провод устройства - GND - при

нажатии. При отпущенной кнопке на входе будет "1" и соответствующий бит в регистре PINx тоже будет "1". При

нажатии кнопки ее контакты замкнут вход на GND и на нем станет "0" - соответственно и в PINx появится "0" и ваша программа сможет прочитав PINx определить что кнопка нажата.

19

Подтяжку на всех портах одновременно можно отключить! Для этого нужно установить бит PUD в

регистре SFIOR Вот Таблица состояния ножки МК при условии подключения допустимой нагрузки - т.е. ток через ножку не

превышает 20 мА и при не активности аппаратуры МК использующей данные ножки для своей работы.

Значение бита_х Состояние вывода МК

Программа может только читать этот бит !

(Отличия для некоторых МК описаны выше)

Программа управляет

этими битами PBx

PINB.x DDRB.x PORTB.x

1

1

1

Высокий лог. уровень

(вывод как бы

подсоединен к питанию МК резистором

около 20 Ом)

0 0

Низкий лог. уровень (вывод как бы заземлен

резистором

около 20 Ом)

определяется только реальным

напряжением

на ножке МК !

Напряжение преобразуется в "1"

или "0" по приведенным выше правилам.

0

1

Подтяжка - pull-up. Вывод как бы

подсоединен к питанию МК

через

резистор 40 КОм

0

Z-состояние.

ВысокоОмный вход

Аналогично для порта_C будут регистры: PORTC PINC DDRC Ножки портов обозначаются в ДШ так: PB3 - ножка 3 порта_B PA0 - ножка 0 порта_A

Итак ... 32 ножки IO микроконтроллера ATmega16 могут быть программно и индивидуально

сконфигурированы (и переконфигурированы по мере необходимости) как : 1) входы с высоким (более 10 МОм) входным сопротивлением (для напряжений от 0 до напряжения

питания МК !) или Z-вход 2) входы по п 1) но с подключенным внутренним подтягивающим резистором на + питания МК (номинал

резистора примерно 40 кОм) 3) как выходы способные обеспечить ток до 20 мА (но общий ток на порт только до 80 мА, а ток всех

портов до 200 мА в DIP корпусе и до 400 мА в квадратном) Важно: эти 32 ножки МК имеют и дополнительное функциональное назначение описанное в ДШ и книгах - они

являются входами-выходами (пишут: IO или I/O ) и для устройств периферии МК. И при активации какого либо периферийного устройства МК программой, соответствующие ножки МК автоматически конфигурируются ( для

PWM не автоматически. Подробней в ДШ) так как требуется для правильной работы этого устройства не зависимо от того как они были сконфигурированы ранее. А после отключения устройства их конфигурация станет

такой что была задана последней по тексту программы. (Подробнее в разделе "Alternate Port Functions" ДШ.)

Пример: Предположим, что ножки RXD и TXD вы сконфигурировали как входы с подтяжкой (Inputs with pull-up) затем, по

ходу работы, программа включила USART на прием (например данных с COM-порта ПК через преобразователь уровней интерфейса rs-232 MAX232) и сразу же ножка RXD станет просто входом (подтяжка уберется) и по ней

будут приниматься данные в МК, а вот состояние TXD не изменится и будет доступно программе для изменения

как любой другой из 32 линий IO. А вот если включить USART сразу и на прием и на передачу то ножка TXD станет выходом и не будет доступна

изменению программой до выключения передатчика USART. После выключения USART ножки RXD и TXD снова станут входами с подтяжкой, если конечно в программе не

было команд меняющих эту конфигурацию.

20

Назначение ножек можно изменять по ходу программы в соответствии с реализуемым алгоритмом - т.е. по

вашему усмотрению. Советую: 1) для того чтобы не повредить (не пожечь) выводы МК - подключайте их через резисторы 200 - 360 Ом

(если это допустимо по схеме - в большинстве случаев это так) - эти резисторы ограничат ток через вывод МК на

допустимом уровне при замыкании элементов схемы на питание или землю. Когда устройство будет отлажено, эти резисторы можно исключить, а можно и оставить - я оставляю. 2) Не подключаемые (не используемые) в вашей схеме ножки МК рекомендуется сделать входами с

подтяжкой - это не позволит ножке хаотично менять свое напряжение под действием внешних помех. Такое беспорядочное изменение напряжения вызывает дополнительное потребление тока на внутренние переключения

в МК и часто вызывает недоумение большим током потребления в спящем режиме работы МК. Если в программе

вы используете режимы пониженного энергопотребления то сделайте неиспользуемые ножки IO входами и соедините их с GND. Не оставляйте не подключенными выводы в Z-состоянии !

Я обычно стараюсь развести неиспользуемые "подтянутые" ножки на отдельный разъем на плате - сам разъем можно не паять - но в случае необходимости вы сможете легко впаять его и так задействовать эти выводы МК. Что делать если внешний сигнал превышает диапазон напряжений допустимый для ножки МК ? Ответ прост :

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

Нам важно чтоб на самой ножке МК он не выходил за допустимый диапазон . Этот диапазон я указал выше. Чтобы выполнить это условие очевидно нужно между большим внешним сигналом и ножкой МК поставить какой то элемент на котором будет падать (поглощаться, гаситься) напряжение на которое входной сигнал выходит за

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

Например для определения перехода напряжения сети 220 вольт через ноль (точнее близко к нулю) в системах тиристорного регулирования мощности на ножку МК подают напряжение фазы через два резистора (не чипы)

включенных последовательно и имеющих общее сопротивление от 1 до 10 МОм. пример AppNote AVR182 Если при этом посмотреть осциллографом напряжение на ножке МК настроенной как Z-вход - мы увидим почти меандр (прямоугольный сигнал с равными длительностями "0" и "1" ) с размахом примерно на 0.7-0.9 вольт

больше напряжения питания МК. Важно! Номинал гасящего (или токоограничивающего) резистора выбирается таким чтобы ток втекающий через него в МК не превышал тока потребляющего работающим МК, иначе возникнет "паразитное

питание" МК - этот ток будет повышать напряжение питания МК проходя на вывод VCC МК через встроенные в МК защитные диоды линий (ножек I-O) ввода-вывода. У каждой ножки I/O (у других ножек не у всех) МК есть два защитных диода - один катодом на VCC а

второй анодом на GND. Не надейтесь на серьезную защиту МК этими диодами ! Ток через них не должен превышать 1 мА ! "паразитное питание" - возможно при питании МК стандартными стабилизаторами напряжения типа 7805 78L05 и т.п. так как они не "сопротивляются" повышению напряжения на их выходе внешним током! А вот при

питании параметрическими стабилизаторами - например шунтирующий стабилизатор типа TL431 или резистор со стабилитроном - паразитное питание не возникнет, но можно пожечь защитные диоды ...

Если вы не можете поставить большое гасящее сопротивление, то поставьте максимально допустимое,

затем стабилитрон на напряжение чуть ниже напряжения питания МК - при питании 5 вольт подойдут стабилитроны типа - 1N4730 1N4731 1N4732. От стабилитрона на ножку МК поставьте резистор 1 КОм. Подробнее про правильное питание ( это очень важно ! ) устройства в целом и МК смотрите в АпНоутах в Книгах и проектах. Про электротехнические расчеты, о схемах деления напряжения, усиления сигнала и его ограничения

- читайте в книге оглавление которой на заглавной странице курса. Другой вариант приведения входного сигнала к диапазону напряжений допустимых для МК (это называется нормирование) - применить усилитель с нужными параметрами. Пример там.

21

- стр. 3 - Микроконтроллер AVR ATmega

ключевые моменты. (Прерывания в AVR - подробно описаны

на этой странице но НИЖЕ.) Возможности заложенные в МК производителем

Они определяются конструкцией МК - и дают вам шанс реализовать на нем то или иное устройство и в тоже время ограничивают вас. Обычно ключевые моменты устройства МК и его параметры указаны на первой странице

ДатаШита а полному раскрытию их посвящен весь ДШ, в частности на второй странице ДШ показано расположение ножек МК в различных корпусах и их обозначения связанные с их дополнительными функциями.

Я ранее уже перечислял основные устройства содержащиеся в МК AVR ATmega и называемые периферией

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

Ограничения заключаются в том что все устройства имеют определенные параметры и лучше, быстрее работать не могут. Вы должны это знать и правильно подбирать МК соответствующей вашей задаче. Если

производитель подключил входы АЦП к конкретным ножкам МК то вы не можете это изменить - это данность.

Тоже относится и к другим периферийным устройствам - всем им сопоставлены определенные ножки МК. Однако некоторые из этих устройств (например USART, SPI, TWI он же i2c) можно реализовать программно

(старайтесь избегать этого!) и тогда им можно сопоставить любые не занятые ножки IO. А что делать если вам нужно, например 4 интерфейса TWI (боле известен как i2c от philips) а в МК AVR

он только один ? Выход прост - можно применить аналоговые ключи - мультиплексоры, например компании Analog.com серии ADGxxx и программно коммутировать (переключать) ими линию SCL МК на линию SCL

одного из 4 интерфейсов TWI используемого в данный момент. Напомню что на одну линию TWI ( i2c ) можно

поставить несколько устройств с разными адресами! Аналогично можно поступить и в других случаях, либо реализовать дополнительные интерфейсы программно. Работа МК - шевелить, дергать ножками. Это очень метко сказано. Нам нужно получить практический результат работы МК - обычно это информационные сигналы поступающие от него в виде

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

работающая в МК буквально "дергает" его ногами в нужные моменты времени. Для того чтобы правильно подключить внешние электронные компоненты принимающие эти электрические сигналы от МК, важно знать как

напряжения на ножках МК зависят от подключенной к ним нагрузки. Программа может "приказывать" МК AVR выводить либо "1" либо "0" на ножки I/O назначенные выходами. МК

преобразует эти логические уровни в напряжения на ножках открывая соответствующий полевой транзистор -

ключ. Чтобы вывести "1" открывается транзисторный ключ

соединяющий ножку МК с + питания. Чтобы вывести "0" открывается транзисторный ключ

соединяющий ножку МК с выводом GND МК. Если к ножке ни чего не подключено то при выводе "1" на ножке будет напряжение почти равное

напряжению питания МК - это VCC - в курсе по умолчанию считаем +5 вольт. А при выводе логического "0" - напряжение на ножке будет очень близко к 0 вольт - это потенциал GND.

Однако: Если к ножке МК подключить что либо проводящее ток и так "сопротивляющееся" созданию нужных программе выходных сигналов - напряжения на ножках могут уже не достигать потенциалов VCC и GND и

значительно! Это связано с тем что открытый полевой транзистор имеет некоторое не нулевое сопротивление и

соответственно протекание тока через него вызывает падение напряжения. Значения этого отклонения показывают графики в конце ДШ. (Там есть и другие графики поясняющие работу МК - найдите

время разобраться в них! Наверно теперь вы понимаете почему я советую вам использовать один универсальный МК ... ) Вот, к примеру, для ATmega16 График 179 показывает каким будет напряжение на ножке МК при выводе на нее "0" при подключенной нагрузке "тянущей" эту ножку током (в мА на левой вертикальной оси графика) к источнику положительного

напряжения :

22

примечание: бит в регистре PORTx равен "0" а бит в регистре DDRx установлен т.е. равен "1" - значит ножка

сконфигурирована как выход. Из графика видно, что при втекающем в ножку токе равном 10 мА напряжение на

ножке МК будет 0.25 вольт, а при токе 20 мА уже 0.45 вольт

пример: Вы подключили к ножке МК анодом (где у диода черточка на схеме) светодиод и хотите чтоб через него

протекал ток 15 мА. Как рассчитать токоограничительный резистор включаемый последовательно со светодиодом - от его катода к +5 вольт питания МК? Вот так: 1) в ДШ на светодиод вы находите (или измеряете на "живом" светодиоде) падение напряжения

на нем при токе через него 15 мА - пусть это будет 2 вольта. 2) По графику выше находите что при токе 15 мА на ножке будет примерно 0.35 вольт. 3) Суммируете эти напряжения и вычитаете из напряжения питания МК:

5 - (2 + 0.35) = 2.65 вольт - это напряжение которое должно падать на искомом резисторе при токе

15 мА 4) Чтоб найти номинал этого резистора - по закону Ома нужно разделить падение напряжения

на ток его вызывающий: 2.65 / 0.015 = 177 Ом Выбираем ближайший стандартный номинал резистора - 180 Ом.

Так как линия графика почти прямая до 20 мА - можно вычислить внутреннее сопротивление ключа

обеспечивающего вывод низкого напряжения на ножку МК - это примерно 24 Ома. (нужно напряжение разделить на ток). График 177 показывает каким будет напряжение на ножке МК при выводе на нее "1" при подключенной нагрузке "прижимающей" эту ножку током (в мА на левой вертикальной оси графика) к "земле" т.е. к нулю вольт :

23

примечание: бит в регистре PORTx равен "1" а бит в регистре DDRx установлен т.е. равен "1" - значит ножка

сконфигурирована как выход. По этому графику можно определить что при токе "на землю" в 10 мА на ножке МК будет не 5 вольт а примерно 4.75 вольт - это соответствует подключению резистора 475 Ом от ножки МК на

GND.При токе 20 мА напряжение на ножке будет 4.5 вольт примерно - это соответствует подключению к ножке МК резистора 225 Ом.

Значит резистор 240 Ом гарантирует не превышение тока через ножку МК более 20мА при замыкании его на VCC или GND.

Пожалуйста хорошо усвойте что означают эти графики - вы будете знать что реально будет на ножках МК когда вы ими "шевелите" - т.е. выводите на них нужные вам сигналы. Я уже говорил ранее что все сигналы

аналоговые и поэтому изменение напряжения на ножках МК не происходит мгновенно. Фронт сигнала (переход из "0" в "1") и спад сигнала (переход из "1" в "0") не вертикальные линии, а наклонные

! Наклон этот тем больше чем выше емкость нагрузки подключенной к ножке. Это связано с тем что для

изменения напряжения на конденсаторе (на емкости) требуется изменение его заряда - а изменение заряда равно произведению протекающего тока на время протекания (точнее интеграл тока по времени), так как все эти

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

Если вам нужно получить ток превышающий 20 мА Вы можете объединить несколько ножек МК вместе - лучше через токо-уравнивающие резисторы 20-33

Ом А можно применить какие либо внешние буферные микросхемы с более высоким выходным током,

например счетверенный Операционный Усилитель (ОУ) AD8534 обеспечивает выходной ток до 250 мА

МК это микроКомпьютер и он тоже может зависнуть ... В результате не совершенства созданной вами программы или под влиянием внешних "злых сил" а может и по вашему умыслу МК может зависнуть. Для воскрешения зависшего МК в нем предусмотрено специальное

устройство - Сторожевой таймер - Watchdog Timer (сокращенно WDT) - это таймер который тактируется (т.е. ведет отсчет) своим собственным встроенным в МК RC-генератором с частотой примерно 1 МГц. WDT -

активируется специальным фьюзом при программировании МК и затем программа может выключать и включать

его (фьюз конечно не меняется при этом) через регистр управления сторожевым таймером - Watchdog Timer Control Register – WDTCR В этом же регистре делают установку времени через которое WDT перезагрузит МК

путем установки коэффициента деления частоты задающего генератора . Если WDT активирован то вы должны в своей программе расставить команды обнуления его счетчика

#asm("wdr") //так в компиляторе CodeVisionAVR так часто чтобы обнуление WDT происходило через промежутки времени ГАРАНТИРОВАНО меньшие чем время

переполнения таймера WDT - я советую расставлять такие команды так часто насколько возможно.

24

В соответствии с ДШ Table 17. Watchdog Timer Prescale Select время от обнуления до переполнения WDT и

вызванного этим сброса МК (т.е. рестарта его программы с начала) может быть установлено вами программно от 16 мСек до 2 Сек. Предположим вы установили это время 16 мСек и пока программа в МК не зависла, она исправно обнуляет за счет

предусмотренных вами команд. #asm("wdr") Но вот МК завис - теперь как только WDT переполнится (не позднее чем через 16 мСек с последнего

обнуления) произойдет перезагрузка МК и программа начнет свою работу снова. При этом будет установлен

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

Хорошая новость:

WDT - удобно использовать в энергосберегающем режиме работы - подробнее в ДШ раздел - Power

Management and Sleep Modes в таком режиме МК большую часть времени "спит" и пробуждается лишь по переполнению сторожевого таймера - выполняет что нужно, например опрашивает ножки МК,

реагирует на их изменения и опять засыпает. Соответственно МК потребляет очень мало энергии. Существуют и другие источники пробуждения МК - например изменение напряжения на его

ножке.AVR ATtiny24 Attiny44 ATtiny84 - потребляют во сне всего 100 НАНО-Ампер !

Далее ... Электроника подключенная к МК

МК обычно располагается на плате, среди других электронных компонентов, для удобства рассмотрения я

условно делю их на группы: 1) задача первой группы отсечь опасные токи и напряжения для защиты схемы и нормировать сигналы

подлежащие обработке в МК к виду допустимому и понятному для МК и ещѐ наиболее удобному для обработки средствами содержащимися в МК. Например: вам нужно обработать сигнал датчика тока - с максимальным током

в 2А. При токе 2 А падение напряжения на резисторе в 0.1 Ом будет всего 2 * 0.1 = 0.2 вольта - если подать такой сигнал на АЦП МК ATmega (а рекомендованное минимальное опорное напряжение для него - 2 вольта и тогда 2

вольта это код АЦП 1023) то оно будет преобразовано в код 102 а меньший ток в еще меньший код. Значит несмотря на то что АЦП имеет разрядность в 10 бит вы получите результат лишь в 7 бит примерно - грубовато... Очевидно нужно усилить сигнал с датчика тока в 10 раз - до 2-х вольт и мы получим оцифровку тока с разрешением 10 бит - это и называется нормирование сигналов - предварительная их подготовка. К

понятию нормирования сигналов - относится и различная фильтрация сигналов для выделения интересующего

участка спектра сигналов подлежащих обработке.

Пример: задача 9_b "Фильтрация и нормирование измеряемого сигнала перед подачей на АЦП".

Хорошая новость: МК ATmega16 -32 -64 -128 и некоторые другие имеют встроенный усилитель

входного сигнала в 10 и в 200 раз. Этот усилитель симулирует PROTEUS но не симулирует VMLAB.

Например еще раз: вам нужно передавать в МК информацию от COM-пота ПК - но сигналы USART MK

"перевернуты" относительно COM-овских и напрямую связать их неправильно! Оптимальное решение поставить специальную микросхему MAX232 или ее дешевый и доступный аналог - который можно найти на rel.ru по

запросу: *232* С помощью этой микросхемы вы согласуете физические уровни (проще - напряжения) сигналов ПК к уровням

требуемым USART МК (ножка RxD) - можно сказать нормируете их. Тоже делает и "шнурок" для сотового

телефона 2) другая часть электроники подключенной к МК предназначена для обеспечения стабильного и достаточно

"чистого" питания МК

3) группа электронных компонентов подключенных к МК и обеспечивающие вывод в том или ином виде

результата его работы. Примером может быть также микросхема MAX232 но теперь нормирующая сигнал от USART МК (ножка TxD) для

того чтобы его принял и понял COM-порт ПК. Конечно существует большое количество других устройств которыми может управлять МК непосредственно или

через специальные микросхемы интерфейсы или драйверы - Тиристоры, Симисторы, Транзисторы, элементы индикации, радио модули и так далее. Важно! Все перечисленные группы внешних компонентов общаются с внешним миром. А в мирУ бушуют страсти,

трещат статические разряды !!! т.е. нужно предусматривать элементы защищающие от вредного

25

воздействия окружающей среды. И сами силовые элементы управляемые МК и коммутирующие большие токи так

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

передавать или принимать информацию (сигналы) на МК но и обмениваться с ним - это микросхемы памяти, LCD

дисплеи, другие микросхемы сообщающие МК тем или иным способом о том что в них происходит.

О защите входов и выходов МК и устройства в целом я рассказываю в задаче-упражнении 9. Там

же пример нормирования входного сигнала с датчика. Подробней о защите читайте на сайте очень полезном для начинающих электронщиков микроконтроллерщиков эмбедеров caxapa раздел: схемы -

защита.

Прерывания в AVR. Interrupts - прерывания, очень важная и мощная функция МК AVR ATmega ATtiny. Иногда требуется максимально быстрая реакция программы на какие-то события. Например приход данных на USART или завершение АЦП или изменение уровня на ножке МК подключенной к контактному датчику или

переполнение таймера ... Быструю реакцию обеспечивает механизм прерываний. При возникновении

события которое может вызвать разрешенное в данный момент времени прерывание и при ГЛОБАЛЬНОМ разрешении прерываний (бит7 в регистре SREG "установлен"), выполнение программы МК останавливается,

сохраняются (запоминаются) место остановки и некоторые нужные данные, бит7 в регистре SREG обнуляется, очищается флаг сработавшего прерывания и затем происходит вызов и выполнение функции обработчика

данного прерывания. От момента наступления события до начала выполнения функции обработчика прерывания проходит не менее 4

тактов процессора. Т.е. Скорость реакции на прерывание напрямую зависит от частоты на которой работает МК

!

В регистре SREG есть бит7 называется он " I " Если этот бит равен "1" (установлен) то ГЛОБАЛЬНО разрешены прерывания - значит могут

возникать разрешенные индивидуально прерывания. Если этот бит равен "0" (бит сброшен, очищен) то ГЛОБАЛЬНО запрещены прерывания - значит

любые события не вызывают прерывания программы. Флаг прерывания - это просто бит который становится "1" (устанавливается) при возникновении события которое может вызвать прерывание не зависимо от того разрешены ли прерывания ГЛОБАЛЬНО

(установленным битом 7 в SREG) или индивидуально - т.е. флаг устанавливается даже если прерывание не обрабатывалось программой и не было разрешено. Что бы сбросить флаг прерывания нужно записать

в него "1" Программно установить бит-флаг НЕВОЗМОЖНО !

Если программа находится в функции обработчике прерывания и в этой функции не был установлен бит SREG.7

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

обрабатывать все прерывания - т.е. не пропускать нужные события. В конце функции обработчика прерывания компилятор ставит инструкцию RETI после выполнения которой бит7

в регистре SREG становится "1" - т.е. прерывания опять ГЛОБАЛЬНО разрешаются и программа продолжает

выполняться с того места где она была в момент возникновения прерывания. НО ! Если при глобальном разрешении прерываний обнаружится установленный флаг разрешенного прерывания, то будет вызвана функция

обработчик этого прерывания. Такая ситуация может возникнуть если во время выполнения обработчика прерывания возникло другое прерывание - т.е. установился его флаг. Если возникнет несколько разрешенных

прерываний одновременно то первым будет выполняться то которое выше в списке векторов прерываний МК в

ДШ. Соответственно по мере отработки накопившихся и разрешенных прерываний их флаги будут очищаться. А вот флаги неразрешенных прерываний не очистятся пока программа этого не сделает записью в них числа 1. Вы

можете запрещать и разрешать как все прерывания сразу, так и каждое по отдельности! Все сразу - изменяя бит7 в регистре SREG вот такими строчками в компиляторе CodeVisionAVR: #asm("sei") /* бит_I сделать "1" теперь разрешенные прерывания будут обрабатываться, если есть установленный флаг прерывания то произойдет вызов его функции обработчика */ #asm("cli") /* бит_I сделать "0" запретить все прерывания ГЛОБАЛЬНО. */ По отдельности рулить прерываниями сложней это ДШ надо читать ... или хотя бы русское описание AVR Прерывания легко настроить интерактивно и главное ПРАВИЛЬНО с помощью мастеров начального

кода компиляторов CVAVR и ICC. Как использовать мастер начального кода показано в упражнениях курса

26

В МК AVR и других, прерывания могут возникать по многим событиям: - изменение уровня на некоторых ножках МК - "0" на некоторых ножках МК - переполнение таймеров - "насчитывание" таймером определенного значения - завершение АЦП преобразования - изменение уровня на выходе компаратора - события в USART - другие события ...

В общем снова - читайте ДатаШит .. Для ATmega16 прерывания перечислены в таблице 18 "Reset ana

Interrupt Vectors"

Примеры объявления функций обработки прерываний в популярных компиляторах: в CodeVision:

interrupt [прерывание] void adc_isr(void)

{ код выполняемый при возникновении разрешенного локально и глобально прерывания

} в ICC : #pragma interrupt_handler timer0_ovf_isr:7

{ код выполняемый при возникновении разрешенного локально и глобально прерывания

} просто указываем компилятору название функции timer0_ovf_isr которая будет вызываться при

возникновении прерывания № 7.

в IAR:

#pragma vector=прерывание __interrupt void irqHandler(void)

{

код выполняемый при возникновении разрешенного локально и глобально прерывания } в WinAVR: #include <avr/interrupt.h>

ISR(прерывание_vect) {

код выполняемый при возникновении разрешенного локально и глобально прерывания } В примерах слово "прерывание" нужно заменить на название прерывания из ДатаШита либо из заголовочного файла *.h для используемого МК.

Скачайте и запустите проект: Демонстрация механизма прерываний в AVR Программировал в CVAVR и симулировал в VMLAB. К ножкам-входам внешних прерываний INT0 INT1 INT2 ATmega16 я подключил резисторы по 10 КОм к +

питания МК для создания внешней подтяжки и еще подключил три кнопки 0, 1 и 2 в "Control Panel" симулятора. Нажимая кнопку мышкой можно замыкать соответствующую ножку на "землю" создавая на ней "0" на

время пока кнопка нажата. Когда кнопки не нажаты на ножках "1". Конфигурировал прерывания и USART с помощью мастера генератора начального кода CVAVR. Прерывания INT0 INT1 разрешены и сконфигурированы "по любому изменению уровня" - т.е. прерывание

может возникать и по фронту ("0" -> "1") и по спаду ("1"->"0") сигнала на ножке PD2 и PD3 соответственно. Прерывание INT2 не конфигурировал - оно оставлено "по-умолчанию" т.е. отключено. Откройте проект vmlab.prj в VMLAB и сделайте "ребилд-ол" В меню View откройте, если их нет на экране, панели "регистры и флаги" "SCOPE" и "Control Panel" -

разместите их поудобней. Теперь нажмите несколько раз на светофор - чтоб прекратились меседжи и симуляция шла непрерывно.

Кликните по панели "регистры и флаги" чтоб вывести ее на передний план. Теперь нажмите кнопку K2 и отпустите.

27

Посмотрите в панели "регистры и флаги" в регистре флагов GIFR (обязательно почитайте об этом регистре

в ДатаШите) установился бит_5, если навести на него мышку то появится его название - INTF2 - это флаг прерывания INT2. Вы видите что хотя мы не включали это прерывание его флаг установился при

событии соответствующем ему. Как я вам и обещал выше ! Теперь (симуляция продолжается, время с начала программы МК в правом нижнем углу бежит...) нажмите K0 в панели "Control Panel" сразу же произойдет разрешенное прерывание, и программа перейдет в функцию

обработчик прерывания INT0 и в виртуальном терминале TTY появится сообщение: int0 Отпустите K0 и нажмите K1 отпустите K1 Смотрите: так как мы находимся в отработке паузы 100 мС в обработчике прерывания от INT0. Бит_7 в SREG остается "0" и значит прерывания не исполняются. Все правильно - но отпускание кнопки K0 вызвало установку

флага INTF0 а нажатие и отпускание K1 установило флаг INTF1. Если теория прерываний изложенная мной выше верна то по завершении текущей обработки прерывания INT0

должны произойти еще по 1 вызову обработчиков прерываний INT0 и INT1 - причем сейчас МК не "знает" какое из них случилось первым и значит будет обрабатывать их по порядку перечисления в таблице 18 ДШ. Ждем не долго ... появляются с некоторой паузой одно сообщение и затем другое свидетельствующие о вызове

соответствующих обработчиков прерываний: int0

int1 При этом вначале очистится бит INTF0, а затем INTF1.

Вопрос для самоконтроля: Почему нажатие и отпускание кнопки K0 вызвало две обработки прерывания INT0, а от кнопки K1 только одно ?

Попробуете симуляцию снова и измените порядок нажатия кнопок: вначале K1 а затем K0 - и вы увидите что последние два прерывания все равно будут выполнены в том же порядке: int0 и затем int1 Важно ! Из примера выше следует что Накопление не обработанных прерываний крайне не желательно так как МК "не помнит" последовательность возникновения соответствующих событий !

Практическое применение прерываний будет рассмотрено в задачах - упражнениях курса. ... и теперь самый пожалуй интересный пунктик - ПРОГРАММА "зашитая" в МК Я постулировал ранее что - Возможность МК действовать по вашей программе - вот суть-соль МК. Это главное

отличие МК от "обычных" непрограммируемых микросхем. Я уже рассказал выше - о внешних электрических сигналах поступающих на МК - про электронику подключенную к МК - о возможностях заложенных производителем

AVR ATmega содержит многократно программируемую FLASH память программ - в нее загружается (есть

различные варианты прошивки, загрузки программы - достаточно пяти проводков от LPT-порта к МК) программа которую будет исполнять МК при наличии следующих условий: 1) есть питание МК 2) есть уровень "1" на выводе Reset

3) есть источник тактового сигнала 4) нет сброса от иного источника сброса (== перезагрузки МК) При наличии этих условий МК начинает шагать по программе которая представляет из себя последовательность

инструкций которые может выполнять МК иногда прерываясь так как было описано выше. Даю определение - запомните : Программа взаимодействует с МК записывая, изменяя в нужное время числа в

регистрах МК и читая в нужное время числа из определенных регистров. Важно понимать - Именно взаимодействует с МК, а не просто управляет! То что содержится в регистрах МК влияет на ход

выполнения программы если она это предусматривает. О как ! ... да что ж это за регистры такие, будь они не ладны! Регистры МК Регистр (Register) MK AVR - это набор из 8 бит т.е. 1 байт. Как бы ящичек с 8-ю ячейками с номерами от 7 до 0. В

этих ячейках находятся 8 бит этого регистра.

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

бит7 самый левый - MSB - наиболее значимый бит, старший бит. бит0 самый правый - LSB - наименее значимый бит, младший бит.

Бит может иметь значение "1" или "0". 8 бит составляют байт и могут хранить десятичное

число от 0 до 255 другие формы записи этого диапазона чисел таковы:

в 16-тиричном виде: от 0 до 0xFF или от $0 до $FF или от 0h до FFh в двоичном виде от 0b00000000 до 0b11111111

Число которое находится в регистре - есть значение регистра. Значение в регистре вычисляется как сумма составленная из восьми

таких слагаемых :

28

(значение бита) умножить на (2 в степени равной номеру бита) Пример:

- если бит 7 равен "1" то он добавляет в сумму число 128 (это 2 в 7-й степ.)

- если бит 4 равен "1" то он добавляет в сумму число 16 (это 2 в 4-й) Теперь вы видите почему бит 7 называется "мост сигнификант бит" - MSB - наиболее значимый бит, старший бит.

Если некоторый бит равен "0" он конечно ни чего не добавляет в сумму.

Запись бит_Х означает что речь идет о бите с номером Х Запись бит_5_2 или бит 5..2 и подобные означают что речь идет о нескольких битах, тут: 5 4 3 и 2

Регистры в других МК бывают и 16 битными и больше! но лучше говорить: шире. в МК AVR есть 32 регистра общего назначения из которых 6 регистров R26 - R31 (или R26_31) могут быть

виртуально объединены в пары и таким образом получается три 16-битных регистра. Регистры МК имеют индивидуальные, уникальные адреса и наименования которые обычно образуются из их

полного названия в ДШ (DS, DataSheet). Полное название регистра соответствует назначению регистра. Например:

полное название регистра - Watchdog Timer Control Register

сокращенное название – WDTCR назначение регистра - управление сторожевым таймером

адрес регистра WDTCR - $21 или 0x21 Такой же принцип соблюдается в именовании отдельных битов регистров.

Например:

название бит - Bits 2..0 – Watchdog Timer Prescaler 2, 1, and 0

сокращенное название – WDP2, WDP1, WDP0 назначение регистра - биты установки коэффициента деления

тактовой частоты сторожевого таймера При программировании на языке Си вы можете в программе обращаться к регистрам МК по их

названию в ДШ - это удобней чем помнить абстрактные числа - адреса регистров. Например так:

PORTB++; // добавить 1 в значение регистра PORTB

PORTA = 135; // записать число 135 в регистр PORTA

PORTA ^= (1 << n); /* изменить

бит_n в

регистре PORTA

я специально написал этот комментарий

в несколько

строк для примера */ Все регистры МК в таблице в конце ДШ ! Там же названия всех бит в регисторах, их номера и страницы ДШ на

которых они описываются. Вот пример схемы -- устройства регистра WDTCR из ДШ

Регистры целиком либо отдельные биты могут быть:

- R/W можно читать и записывать (== изменять) - W можно только записывать в него

- R можно только читать, записать в него не получится. Initial Value - это то что будет в регистре после включения питания или после появления перехода из "0" в "1"

на ножке Reset или после прекращения сброса МК от другого источника. После такой схемы регистра в ДШ идет подробное описание функций каждого бита !

Обязательно разберитесь с регистрами ! они являются средством общения программы с МК т.е. РЕГИСТРЫ очень

важны. Белых пятен быть не должно !

Программа не может измерить уровень существуют на ножке МК, но она может узнать об этом прочитав значение соответствующего бита в соответствующем регистре !

29

Например так : if (PINB.5) { сделать что-то };

/* если на ножке PB5 есть "1" (не "0" значит "истинно") то программа сделает что-то, а если на ней "0" (значит

"ложно") то не сделает, а просто пойдет дальше, на следующую строку */ Дойдя до этой строчки программа проверит чему равен бит_5 в регистре PINB - в нем МК сохраняет результат преобразования напряжения на ножках порта_В в логические уровни "0" или "1" по правилам о которых я

рассказал уже ранее - и по результату проверки программа будет действовать далее. while (PINA.6) { делать что-то };

/* пока на ножке PA6 есть "1" (не "0" значит "истинно") то программа будет делать что-то, и опять проверять

что на PA6 */ Дойдя до этой строчки программа проверит чему равен бит_6 в регистре PINA - если он "1" то выполнит то что в

скобках { } затем опять проверит этот бит. Так программа будет работать пока не будет прерывания либо пока бит_6 не станет "0".

Если бит_6 стал "0" то программа пойдет дальше не выполняя того что в { }

Значит так вы можете ввести в программу ожидание нажатия кнопки замыкающей ножку PA6 на "землю" (только

обеспечив "1" на ножке при отпущенной кнопке). while (PINA.6);

/* пока на ножке PA6 есть "1" программа будет выполнять эту строчку. Когда возникнет "0" программа перейдет на следующую строку программы. */

Если вы уже "въехали" или "въезжаете" то надеюсь поняли

что регистры PIN_Х должны быть ReadOnly - "только чтение" - ведь значения в них может определять только сам МК по реальным уровням напряжений на соответствующих ножках.

Программа может только читать из этих регистров. Если не понятно - перечитайте пожалуйста ! Не оставляйте на потом !

30

- стр. 4 - ПРОГРАММА для МК

ПО для микроконтроллеров Компиляторы и Симуляторы

Книги и учебники по электронике и микроконтроллерам AVR Это 4-я страница краткого курса. вы уже должны представлять себе 1) что такое МК AVR и в чем его особенности 2) как МК взаимодействует с электроникой подключенной к нему 3) как МК преобразует напряжения на его ножках в "1" или "0" 4) что является посредником в общении программы с МК 5) какие напряжения на своих выводах может создавать МК AVR 6) с чего нужно начать разработку эл. устройства 7) какая документация по МК особенно полезна и необходима 8) где найти книги и дополнительные материалы

Если вы читаете курс не первый раз и все равно не можете ответить на эти вопросы - наверно вам нужно

остановится и попробовать найти ответы в прочитанной части курса либо в книгах. Иначе понимание дальнейшего материала курса может оказаться затруднительным. Итак ... - вы определились с тем какое электронное устройство творите, - понимаете что оно должно делать, - нарисовали схему устройства физически способную выполнить вашу задумку ! - например

слепили из кусочков взятых в ДШ, АпНоутах, опираясь на аналогичные проекты других электронщиков найденные в интернете и по советам других радио Губителей. Пора создавать программу которая, будучи загруженной (зашитой, прожженной) в МК, будет изменять физическое состояние его внутренностей и ножек делая записи в регистры МК и узнавать о физическом

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

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

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

компилятора в пакете есть отладчик-симулятор и/или программатор то это уже IDE (интегрированная среда разработки).

Компилятор позволяет написать программу для МК на универсальном языке программирования - одинаковом и для ПК и для различных МК (кстати для МК требуется всего 3-5% всех возможностей языка программирования).

Текст программы набранный вами (или другими добрыми людьми) в компиляторе называют исходным кодом

(или исходником или сырцом - англ: source code) Компилятор по вашей команде проверяет отсутствие ошибок в набранном исходнике и, если ошибок нет, преобразует исходник (компилирует его) в специальный файл обычно с

расширением .hex - его называют "прошивка". Прошивку с помощью программатора (для AVR это например 5 проводков с параллельного порта ПК) помещают

во FLASH память программ МК и при необходимости частично в его EEPROM. Очень трудно написать программу сразу правильно и без ошибок поэтому - Важнейшим этапом разработки электронного устройства является отладка программы МК (программа МК называется - firmware). Для

отладки вы :

- включаете ваше устройство с прошитым МК (либо симулятор МК) - находите отклонения от требуемого алгоритма вызванные ошибками проги,

- выявляете хитрыми способами эти ошибки,

- вносите соответствующие изменения в исходный текст программы - опять компилируете

- прошиваете новый .hex в МК и опять на верхний пункт этого списка И так до победного конца - т.е. до тех пор пока устройство заработает так как вам нужно. Не всегда допустимо включить устройство не зная наверняка правильно ли работает программа МК - в некоторых

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

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

"прошитого" вашей программой МК и его обвязки - т.е. электронных компонентов окружающих МК по схеме

устройства. Кроме того симуляторы позволяют вам:

31

- останавливать программу когда нужно - в ручную и автоматически - выполнять программу по шагам - видеть как именно происходит выполнение программы - наблюдать и изменять значения в регистрах МК - наблюдать текущие значения переменных - использовать виртуальные измерительные приборы с памятью - симулировать работу МК с обвязкой включающей различные электронные компоненты и устройства - виртуально обмениваться информацией с терминалом на ПК - делать еще много полезного !

Теперь подробнее ... Компиляторы Си для AVR Не пугайтесь! я не предлагаю вам изучить еще и язык Си - мы просто будем использовать несколько инструкций из него - как я говорил всего несколько процентов языка. Я сам начинал изучать и применять МК сразу на Си - и

очень доволен результатом. Считаю, что : Для начинающих наиболее удобен в работе компилятор Си для AVR CodeVisionAVR ( или CVAVR) Вам нужно скачать и установить эту программу!

(демо-версия доступна с официального сайта (< 4 Мб)) Полную версию можно найти на заглавной странице курса. Компилятор содержит очень понятный и

очень мощный генератор начального кода программы по вашим потребностям в конфигурации периферии МК AVR - называется он : CodeWizardAVR

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

будете использовать и установить нужные параметры их работы. Затем мастер ("визад") создаст файл

проекта .prj и файл исходного текста программы на языке Си с расширением .c - в нем уже будет содержаться код на Си конфигурирующий МК по сделанному вами "заказу". Вам нужно будет добавить лишь код реализующий

нужный вам алгоритм работы устройства. Используйте этот мастер и далее по ходу работы программы - точно так же как и в начале, но не генерируйте новые файлы а просто откройте меню "файлы - просмотр" и

посмотрите нужный кусок программы на Си, возьмите что вам нужно и вставьте в вашу программу.

Подробно и с картинками работу с КодВизадом - мастером начального кода CodeVisionAVR я

описал в задаче 1

Обязательно читайте Help к компилятору - по сути это одновременно и учебник по Си для AVR и

именно в нужном вам объеме ! Это относится и к другим используемым вами программам. Читайте инструкцию и помощь ! Смотрите пробуйте изучайте ПРИМЕРЫ к программе !

32

Компилятор CodeVisionAVR имеет и встроенный программный модуль для прошивки МК и конфигурирования

фьюзов прямо в схеме Компания Atmel подсказывает как начать работать с этим компилятором Си для AVR: AN AVR033 "Getting Started with the CodeVisionAVR C Compiler". Это АпНоуто Atmel - надеюсь вы уже скачали хотя бы их список ! Если нет то скачайте обязательно их

перечень.Они ВСЕ нужны ВАМ !!! как справочник конкретно по AVR. Для полного цикла разработки устройства достаточно только одного компилятора CodeVisionAVR. Однако, я

рекомендую вам, скачать еще один компилятор: ICC AVR от компании Imagecraft Я использую и его генератор начального кода на

Си - конфигуратор периферии AVR - в паре с CodeWizardAVR. Работая в паре, два мастера

конфигурирования МК - идеально дополняют друг друга! Например конфигурация Таймеров МК по моему лучше, понятней и наглядней сделана в мастере ICC. Atmel - подсказывает как начать работать и с

этим компилятором Си для AVR в Апликейшн Ноуте: AN AVR031 "Getting Started with ImageCraft C for AVR"

В компиляторах есть отличные примеры программ на Си для наиболее часто встречающихся задач на

МК в CodeVisionAVR примеры в папке - CVAVR\Examples

в ICC примеры находятся в папке - ICC\examples.avr Примеры - это исходные тексты программ на Си для управления периферией МК и интерфейса

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

комментариями!

Комментарии это то что написано : - после двух косых черточек // - в одну строку !

- либо между /* и */ - в одну или несколько строк Не забывайте и вы комментировать тексты ваших программ. Иначе, буквально через пару месяцев, вам

будет очень затруднительно понять, что делает тот или иной кусок даже ВАШЕЙ программы!

Существуют и другие компиляторы. БЕСПЛАТНЫЙ и великолепный WinAVR (размер 25 Mb) - по честному

бесплатный пакет на основе

компилятора GCC - о нем очень хорошие отзывы. Создает очень правильный и компактный код! Есть версия и под Linux. Есть вариант WinAVR в USB-флэшке. Этот компилятор хорошо интегрируется с симулятором VMLAB

и фирменным симулятором Atmel - AVRstudio (о симуляторах ниже и в самом низу страницы) Вы ставите на ПК WinAVR и забываете о нем! Вся работа идет из симулятора VMLAB - в нем есть пример такой

интеграции, находится в папке: C:\VMLAB\WinAVRdemo Работать с самим WinAVR тоже очень просто. Компиляция проекта в WinAVR - запустите "пуск" -> "WinAVR" -> "Programmers NotePad" - откройте демо проект C:\WinAVR\examples\demo\demo.c - затем меню "Tools" и "Make All"

Проект откомпилируется и в папке C:\WinAVR\examples\demo\ появятся: o demo.hex - файл для прошивки в МК st o demo.lst - это листинг на ассемблере с привязкой к Си коду программы o demo.elf - файл содержит информацию для отладки программы в симуляторе. Например в

PROTEUS. Подробней о WinAVR читайте в низу этой страницы. AtmanAVR C/C++ Compiler AVRGCC - он как и WinAVR основан на GCC но имеет отладчик и ГЛАВНОЕ для

начинающего: прекрасный генератор начального кода ! Самый лучший и дорогой - IAR - требует несколько замысловатой настройки, не имеет множества примеров в

инсталляции и не имеет генератора начального кода. Хотя компания IAR явно считает генератор полезным, так как продает его в виде отдельного программного продукта. Компилятор IAR генерирует самый быстрый и

компактный код. Demo версия на 30 дней - полностью рабочая без ограничений, нет только не нужных

начинающему исходников включенных в пакет библиотек. Вы можете скачать DEMO с сайта производителя - примерно 65 Мб.

Примеры программ на Си подходят с незначительными изменениями для любых компиляторов и для любых МК ! Так как язык Си машино не зависимый - т.е. программы мало зависят от того для какого

процессора они написаны. Огромное количество НУЖНЫХ исходников (примеры программ) для AVR на Си здесь - AVRLib можно

скачать все одним ZIP-архивом.

Средства отладки программ и устройств содержащих МК Симуляторы для AVR и электроники

33

Вы скачали компилятор Си для AVR CodeVisionAVR и АпНоуты инсталлировали его и получили файл прошивку для МК. Естественно вы хотите узнать - будет ли прошивка, а значит ваша программа работать в МК так как вам

нужно. Для этого удобно использовать специальные

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

модель МК но и работу модели целого электронного устройства. Записать на диск результат его работы для последующего анализа, поиска недочетов. В задачах-упражнениях курса я использую Бесплатный симулятор-эмулятор для AVR - VMLAB (скачайте и

установите на ПК) Несмотря на небольшой размер (около 4.2 Мб), программа является самостоятельным средством

разработки ПО на ассемблере для МК сразу двух производителей: ATMEL.com и ST.com.

Мультипроцессорность - это эмуляция двух МК в устройстве, у каждого своя прошивка и они работают не зависимо - это очень мощно если правильно этим воспользоваться!

Юзер дефайн компонентс - в общем если вам нужен какой либо электронный компонент отсутствующий в списке VMLAB, вы можете создать его сами! в соответствии с ДШ или по вашим потребностям - даже не

существующий в природе! Я сделал упражнение - задачу 3 в которой очень подробно рассмотрел симуляцию программы на

VMLAB с картинками.

В поставку VMLAB включено множество примеров программ и прошивок для немедленной

симуляции - эмуляции устройства с МК. Примеры находятся в папках: Tutorial и AVR_demo Запустите их и освойтесь, поиграйте с симулятором на досуге ...

Есть пример работы VMLAB с CodeVisionAVR. откройте файл проекта C:\VMLAB\AVR_demo\codevisi.prj и по-симулируйте ! При симуляции вы увидите

движение по исходному тексту программы на Си, и можете расставлять точки останова программы,

наблюдать за изменениями значений в регистрах МК, посмотреть осциллограммы сигналов на ножках МК и многое другое ... Уже упоминал: пример работы VMLAB с WinAVR вы устанавливаете winavr в папку по умолчанию и больше ни когда не заглядываете в неѐ Вся работа от написания кода на Си до отладки выполняется из VMLAB -

это очень удобно. C:\VMLAB\WinAVRdemo\файлы.prj -захотите попробуете ...

Совет ! Скачайте мою заготовку (Шаблон, "РЫБА" - всего 6 Кб) для быстрого старта в совместном использовании компилятора CodeVisionAVR и симулятора VMLAB с МК ATmega16 Распакуйте файлы из архива в папку: С:\VMLAB\WORK

Теперь откройте проект cv.prj в компиляторе CodeVisionAVR. Вы можете править текст программы

(исходник) и перекомпилировать его. Для эмуляции работы устройства откройте в VMLAB проект vmlab.prj

Вы можете проверить работу программы на Си для МК ATmega16 мигающей светодиодами и

посылающей сообщение через USART на монитор-терминал VMLAB.

Если добавить адаптер MK- rs232 то сообщения можно будет увидеть на экране ПК. В общем качайте ! - это нужно ВАМ !

повторю :

На софт-эмуляторе симуляторе VMLAB мы будем проверять работу программы для разрабатываемого устройства. Файл-прошивку для МК (расширение .hex) созданный в компиляторе будем прогонять в симуляторе МК с внешними компонентами и смотреть что работает, что нет, и как работает...

При необходимости будем корректировать исходный текст программы на Си, опять компилировать, и так по кругу

до достижения правильной работы устройства. Этот процесс называется - отладка программы или дебагинн - очистка от всякой нечисти -

"тараканов" и "жучков"...

34

Скачав рекомендованные программы - установите

их на диск С:\ в каталоги : CVAVR ICCv7avr VMLAB тогда рабочие файлы будут находятся по тем же адресам что и в задачах-примерах. Значит будет проще помочь,

ответить на ваши вопросы. Сделайте архивы установленных программ целиком - это поможет восстановить, случайно

испорченные при опробовании программ, файлы примеров и помощи, без переИнсталляции.

Хелпы во всех рекомендуемых программах качественные и подробные! НЕ забывайте их читать!

Не обязательный для курса но ВЕЛИКОЛЕПНЫЙ Пакет для разработки электронных устройств от схемы до печатной платы PROTEUS Действительно супер !

Во первых PROTEUS может симулировать несколько МК в одном устройстве, причем не только AVR но и PIC и Motorola и 8051 и даже ARM7 вперемешку !

Во вторых в поставку PROTEUS входит очень много моделей компонентов.

В третьих вы можете симулировать любые электронные устройства и не содержащие МК и очень сложные и электро-механические системы - это очень полезно, Вам нужно проверить какую то идею или вариант реализации

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

работать, каковы будут выходные параметры. PROTEUS - симулирует очень реалистично ! И главное наглядно видна работа устройства, напряжения и токи в нем.

В четвертых PROTEUS - по сути справочник электронных компонентов Когда вы просматриваете

библиотеки для добавления компонента на схему - вам сразу показываются его основные свойства и корпус компонента - какова его площадка на плате. Просто класс ! Для поиска компонента вам достаточно ввести в окно

несколько символов из его марки или описания и затем выбрать из предложенных категорий.в пакет включены отличные примеры работы в PROTEUS примерно 60 устройств готовых к симуляции. Это : - дата логер на жесткий диск (есть модель IDE HDD ! ) - можно поиграть в шахматы с ATmega128 !!! (есть модель "точскрина" ) - есть пример работы с графическим LCD дисплеем - управление шаговым двигателем - управление электродвигателем - управление servo - радиочастотные схемы, трансформаторы, линии передачи. - конечно кнопки, индикаторы, светодиоды, связь с ПК, разные датчики, память - конечно есть виртуальные приборы. - отладка интерфейсов UART i2c TWI SPI

... Короче все примеры "весят" 16 Мб в распакованном виде ! Вы можете скачать DEMO версию (около 26 Мб) - она полностью рабочая ! Только одно ограничение - не

позволяет вам сохранить результат вашей работы. Читайте Краткий Курс Самоучитель PROTEUS

А если нет модели нужного вам компонента ? Вот что я придумал - Если вы не находите модели нужного вам компонента, то вы можете изобразить ее с

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

PROTEUS и все работает. Думаю вычислительная мощность МК в таком режиме позволит вам изобразить что угодно. Преимущество моего метода - Вам не нужно изучать методику и иметь инструментарий для

создания моделей для VMLAB или PROTEUS стандартным способом. Вы лишь лишний раз поупражняетесь в программировании МК с которым работаете. Кроме того теперь PROTEUS не

работает с моделями созданными без специально полученного кода для создания модели ! А по моему

методу вы сможете делать модели и при желании продавать их не имея такой лицензии и законно!

Надеюсь вы попробуете такой финт ушами ...

Итог этой страницы курса : Вам необходимы две программы - CVAVR и VMLAB для усвоения дальнейшего материала курса.

35

стр.5 часть 1

Язык Си для МК (Чуток, но и этого будет достаточно ...)

Я расскажу об устройстве и структуре программы на языке Си и опишу используемые в МК конструкции языка. По умолчанию компилятор CVAVR. В других компиляторах могут быть незначительные отклонения, нюансы не связанные с языком Си а обусловленные стараниями и предпочтениями разработчиков этих компиляторов. Я покажу вам, что Си это ДЕЙСТВИТЕЛЬНО ОЧЕНЬ ПРОСТО, если у вас реальные для начинающего цели!

Кстати БЭЙСИК тоже не плох ! Вот скачайте архив (5 Кб всего) с перечнем АпНоутов - великолепных

и интересных устройств в которых программы для МК AVR написаны на языке Бэйсик. Скачать BASCOM-AVR-1.11.8.3 full - полная версия можно там

Минимальная программа на Си может быть такой:

main(){}

Эта программа не делает ни чего полезного - но это уже программа и она показывает что в программе на языке Си - должна быть главная функция main - обязательно ! Реальные программы на Си конечно

больше. Скачайте и Распечатайте - Памятка Си для МК на ОДНОЙ странице ! Рассказывая про МК я говорил вам что, задача программы МК: читать числа из регистров МК, делать что-то

с ними и записывать числа в регистры. Только так программа может общаться с МК. Как это делать на языке Си Регистры МК в программе на Си имеют названия как и в ДШ и так как числа в большинстве из них можно менять

- для программы регистры являются по сути переменными. 1) Чтобы поместить число в переменную (в регистр) в Си есть оператор присваивания - это знак

= ("равно" ) . В Си этот знак не означает равенство , = в Си означает вычислить результат того что справа от оператора присваивания и поместить этот результат в переменную находящуюся левее оператора

присваивания.

PORTB = PINB + 34;/* Эта строчка на Си означает

Взять (прочитать, считать) значение переменной (регистра) PINB, затем прибавить к нему число 34 и поместить результат в переменную PORTB */

ПЕРЕМЕННАЯ = PINC; /* Эта строчка на Си означает

Взять (прочитать, считать) значение переменной (регистра) PINC и поместить результат в переменную с

именем ПЕРЕМЕННАЯ */

Чтобы в Си взять (прочитать) число из регистра или значение переменной нужно написать его название НЕ непосредственно с лева от оператора присваивания ! во загогулина понимашшшь... Ж) примеры : 1) Строка где переменная стоит слева от = но через знак & PORTB & = 0x23; на Си означает - прочитать содержимое переменной PORTB, затем выполнить "поразрядное (побитное) логическое И" между прочитанным значением и числом 0x23 и поместить (записать, присвоить) результат в

переменную PORTB 2) Строка где переменная стоит непосредственно слева от = PORTB = 0x23; на Си означает - не читая содержимое переменной PORTB присвоить ей значение 0x23

Вместо & "И" (AND - только 1 и 1 дают 1) могут быть и другие побитные логические операции:

| "ИЛИ" (OR только 0 и 0 дают 0)

36

^ "Исключающее ИЛИ" (XOR изменить бит напротив "1") ~ "инвертирование битов" (INV изменить биты регистра) и арифметические операции: + - * / %

С оператором присваивания

используются вот такие сокращения:

ДЛИННАЯ ЗАПИСЬ СМЫСЛ СОКРАЩАЕТСЯ ДО

x = x + 1; добавить 1 x++; или ++x;

x = x - 1; вычесть 1 x--; или --x;

x = x + y; прибавить y x += y;

x = x - y; вычесть y x -= y;

x = x * y; умножить на y x *= y;

x = x / y; поделить на y x /= y;

x = x % y; остаток от деления x %= y;

x--; вычесть 1 x -= 1;

x++; добавить 1 x += 1;

примеры :

10010 | 1001111 // "ИЛИ" - только 0 и 0 дают 0

// англ. название OR 1011111 // это результат

// только биты_5 в обоих числах были нули

10010 & 1001111 // "И" - только 1 и 1 дают 1 // англ. название AND 10 // это результат // только биты_2 в обоих числах были единицы

10010 ^ 1001111

/* "исключающее ИЛИ" - результат любое из пары чисел в котором инвертированы биты напротив битов

равных "1" в другом числе.

англ. название XOR*/ 1011101 // это результат /* изменились биты во втором числе напротив

установленных битов 4 и 1 первого числа. */

~ 1001111 /* инвертировать биты те что были "1" станут "0" и наоборот */ 110000 // это результат

Запомните ! Результатом поразрядных (побитных) логических операций : & | ^ ~ является число,

которое может быть интерпретировано компилятором как "истина" если оно не ноль и "ложно" если число ноль.

Числа В компиляторе можно записывать в виде указанном в его Help'е ! Раздел - константы - Constants.

37

например - Целые числа могут быть записаны : - в десятичной форме - 1234 - в двоичной форме с префиксом 0b так: 0b101001 - в шестнадцатеричной форме с префиксом 0x так: 0x5А - в восьмеричной форме с префиксом 0 так: 0775

Числа с плавающей точкой имеют в записи эту точку и какое либо число после этой точки, так:

61.234 или так: 73.0 и так: .786 и могут иметь в конце F вот так: 61.234F Цвета я применил УСЛОВНО для лучшей читаемости!

Различные представления числа D3h равно 0xD3 равно 0b1101 0011 равно 211

шестнадцатеричное число 0xD3

0 x D 3

двоичное представление - число 0b1101 0011

0 b 1 1 0 1 0 0 1 1

номера бита 7 6 5 4 3 2 1 0

два в степени равной номеру бита

128 64 32 16 8 4 2 1

число 211 в десятичном виде это сумма степеней двойки где биты равны "1"

Сложите +128 +64 +16 +2 +1

Четыре бита это 1 нибл или 1 символ в 16-ричной системе или десятичное число от 0 до 15. "В уме" удобно оперировать ниблами:

двоичный десятичный 16-ричный

0000 0

0001 1

0010 2

0011 3

0100 4

0101 5

0110 6

0111 7

1000 8

1001 9

1010 10 A

1011 11 B

1100 12 C

1101 13 D

1110 14 E

1111 15 F

38

Для перевода чисел из одного вида в другой можно использовать калькулятор Windows в инженерном виде. Есть в Си операции которые изменяют значение переменной и без оператора присваивания :

PORTA++; /* Эта строчка на Си означает

Взять значение переменной PORTA добавить к ней 1 и записать результат обратно в PORTA говорят: Инкрементировать регистр PORTA */ PORTC--; /* Эта строчка на Си означает обратное действие! Декрементировать - вычесть 1 из значения регистра PORTC */

Инкремент и декремент удобно использовать для изменения значения различных переменных счетчиков. Важно помнить что они имеют очень низкий приоритет - поэтому чтобы быть уверенными в порядке выполнения

желательно писать

их отдельной строчкой программы !

Обратите внимание ! В конце выражения или конструкции в программе на Си ставят точку с запятой. Длинные выражения

можно писать в несколько строк. /* ЗЕЛЕНЫМ я пишу комментарий к программе в Си он может быть написан в несколько

строк */ // или в одну после двух черточек Компилятор игнорирует все что написано в комментариях. Вы не компилятор , не игнорируйте,

пишите и читайте !

Когда инкремент или декремент используется в выражении то важно где стоят два знака + или - перед переменной или после переменной :

a=4; b=7; a = b++; /* Эта строчка на Си означает Взять значение переменной b присвоить его переменно a затем

добавить 1 к переменной b и сохранить результат в b. В результате a будет содержать число 7 а b будет содержать число 8 */ a=4; b=7; a = ++b; /* Эта строчка на Си означает Взять значение переменной b затем добавить к нему 1 и сохранить результат в b и этот же результат присвоить a. Теперь a будет содержать число 8 и b будет

содержать число 8 */

2) Арифметические операции в Си

x + y // сложение x - y // вычитание

x * y // умножение x / y /* деление. Если числа целые результат - целое число с отброшенной дробной частью - не округленное ! т.е. если в

результате деления на калькуляторе получается 6.23411 или 6.94 то результат будет просто целое число 6 - запомните ! Если числа с плавающей точкой, то есть float или double и записываются с точкой и

числом после точки, то и результат будет число с плавающей точкой */ x % y // вычислить остаток от деления нацело // примеры:

5 / 2 // даст 2 5 % 2 // даст 1

39

3) Операторы сравнения (или отношения): используются для сравнения переменных, чисел (констант)

и выражений.

x < y // X меньше Y

x > y // больше x <= y // меньше или равно

x >= y // больше или равно

x == y // равно x != y /* не равно

Результат выполнения этих операторов: "истина" это "1" (точнее "не ноль") "ложно" это "0" Значения хранимые в переменных (в регистрах) х и у НЕ изменяются. Берутся (считываются) значения хранящиеся (или содержащиеся) в переменных и сравниваются */ ! /* "НЕ" - логическое отрицание */

4) Логические операции :

|| // "ИЛИ" - только "ложь" и "ложь" // дают "ложь"

&& // "И" - только "истина" и "истина" // дают "истина" ! // "НЕ" - логическое отрицание /* Правило - в Си считается: "Ложь" (False) только ноль. "Истина"(True)- не ноль. или так: (!0) */ !(истина) // дает "ложь" !(ложь) // дает "истина"

В результате логической операции вы получаете НЕ ЧИСЛО, а логическое значение "истина" или "ложь" Для логических операций && и || берутся результаты выражений слева и справа от знака операции преобразованные в "истину" или "ложь" и определяется логический результат операции. Компилятор, для

определенности наверно, результат "истина" превращает в 1 а не в любое отличное от 0 число.

Совет: Используйте скобки

( () + ( () * () ) ) чтобы точно знать порядок выполнения

операций программой !

Логические операции могут объединять несколько проверяемых условий. Например: if((выражение1)&&((выражение2)||(выражение3))) {/*

Код программы здесь будет выполняться если: Выражение1 "Истина" (значит не ноль) и хотя бы одно из выражений 2 и 3 тоже "Истина" (значит не ноль).

}; Подробнее о логических операциях обязательно прочитайте по линку в низу 2-й части этой

страницы ! Самое интересное - Ходовые конструкции на Си 5) if(){}else{}; идеальная конструкция если вам нужно выполнить какую то часть программы при наличии

каких либо условий :

if (выражение) { /* делать этот код если выражение "истина" - т.е. результат его вычисления не ноль

*/ }

else { /* делать этот код если выражение "ложь" - т.е. результат его вычисления равен нулю */

40

};

} else { это не обязательный элемент конструкции :

if (выражение) { /* делать этот код если выражение "истина" - т.е. результат его вычисления не ноль

*/

};

6) while(){}; условный цикл - используйте если вам нужно выполнять какой то код программы пока выполняется (существует,

справедливо, не ноль) некоторое условие :

while (выражение) { /* делать этот код если выражение "истина" - т.е. результат его вычисления не ноль. Пока выполняется этот код выражение не проверяется на истинность ! После выполнения кода происходит переход к строке while снова проверять истинность выражения */ };

Цикл while имеет вариант do - while при котором код в { } выполняется по меньшей мере один раз не

зависимо от истинности условия в скобках :

do { /* сделать этот код один раз

затем, если выражение есть "истина" - т.е. результат его вычисления не ноль - опять делать код с начала, и так до тех пор пока выражение истина */ }

while (выражение);

7) for(;;){}; - этот цикл позволяет выполнить часть программы нужное число раз:

char i; /* объявление переменной для for это обычная переменная и значит может иметь любое допустимое имя по вашему желанию */ for (i=5;i<20;i+=4) { /* код цикла for i=5 - это начальное выражение Число 5 просто для примера, может быть таким, как позволяет объявление переменной i, в нашем случае от 0 до 255 i<20 - контрольное выражение Может быть с разными операторами отношения, важно лишь чтобы по ходу цикла оно становилось

когда-то "ложью" - иначе цикл "зациклится" т.е. ни когда не кончится. i+=4 - счетчик Обычно это i++ т.е.к переменной добавляется 1 каждый "прогон" цикла. Но опять же может быть таким

какое вам требуется, важно лишь достижение когда либо условия абзацем выше ! Иначе цикл станет бесконечным. Код цикла for будет первый раз выполнен для i=5, затем по выражению i+=4, i станет 9 теперь будет проверено контрольное выражение i<20 и так как 9<20 код цикла for будет выполнен еще раз. Так будет происходить до тех пор пока контрольное выражение "истино"

Когда оно станет "ложно" цикл for закончится и программа пойдет дальше. */

};

Начальным условием - может быть любое допустимое в Си выражение результатом которого является целое число. Контрольное выражение - определяет до каких пор будет выполнятся цикл. Счетчик - показывает как изменяется начальное выражение перед каждом новом выполнении цикла . циклы for(;;) и while() часто используют вот так:

while(1); for (;;); /* Так написанные эти циклы означают : МК выполнять эту строчку пока есть питание, нет сброса и нет прерывания.

41

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

*/

8) switch(){}; - оператор множественного выбора,

позволяет вам сделать выбор из нескольких вариантов.

switch (выражение) {

case 5: /* этот код будет выполняться если результат вычисления выражения равен числу 5 на этом работа оператора switch закончится */

break; case -32:

/* этот код будет выполняться если результат вычисления выражения равен отрицательномц числу -32 на этом работа оператора switch закончится */

break; case 'G':

/* этот код будет выполняться если результат вычисления выражения равен числу соответствующему

символу G в таблице ASCII на этом работа оператора switch закончится */

break;

default:

/* этот код будет выполняться если результат вычисления выражения не равен ни 5 ни -32 ни 'G' на этом работа оператора switch закончится */

}; /* switch закончен - выполняется дальнейший код программы */

case - может быть столько сколько вам нужно, чтобы программа работала быстрее старайтесь наиболее вероятные варианты располагать выше! default - не обязателен. break; - лучше писать, иначе найдя нужный вариант программа будет проверять и следующие условия case -

напрасно тратя время. Скачайте и Распечатайте Таблицу символов ASCII на ОДНОЙ странице ! 9) goto - оператор безусловного (немедленного) перехода.

mesto_5: /* сюда мы попадем после выполнения строки программы goto mesto_5 */ goto mesto_1; /* перейти в то место программы где в начале строки написано mesto_1: */ goto mesto_5; /* перейти в то место программы где в начале строки написано mesto_5: */ mesto_1: /* сюда мы попадем после выполнения строки программы goto mesto_1 */

goto - существует наверно во всех языках и в ассемблере в том числе. Используйте его с осторожностью! Думайте к чему может привести выполнение функций или конструкций вашей программы не до конца. Например: Если вы покинете функцию - обработчик прерывания по goto не завершив ее, то не произойдет автоматического включения прерываний глобально - т.е. не установится бит I в регистре SREG, Этот бит

устанавливается автоматически после полного выполнения функции обработки прерывания и "естественного" выхода из неѐ. Ну вот - ПОЧТИ всѐ что нужно нам из Си ! Как использовать описанное выше вы можете посмотреть в примерах к

компилятору ! Примеры в папке : C:\CVAVR\EXAMPLES Открывайте файлы .с и разбирайте текст программ - что делает каждая строчка! Это великолепный способ само- обучения программированию ! Структура программы на языке Си Программа на языке Си это текстовый файл с расширением .c Текст программы называют исходным или "исходником" или "сурцом" от анг. source code - это вам ключевые

слова для поиска ! "Исходник" на Си имеет определенную структуру : 1) заголовок 2) включение необходимых внешних файлов 3) ваши определения для удобства работы 4) объявление глобальных переменных

42

Глобальные переменные

- объявляются вне какой либо функции.

т.е. не после фигурной скобки { - доступны в любом месте программы - значит можно читать их значения и присваивать им значения там где требуется. 5) описание функций - обработчиков прерываний 6) описание других функций используемых в программе 7) функция main - это единственный обязательный пункт !

Это не жесткий порядок а ориентировочный ! Иногда п.6 это прототипы функций, а сами функции описываются полностью после п.7 Прототип функции - показывает образец того как применять функцию в программе, какие значения в

нее передаются и если она возвращает какое-то значение то прототип указывает тип возвращаемых

данных. Прототип не имеет скобок { } а после скобок ( ) ставится ; Функция - имеет { "тело" } в фигурных скобках. Тело это код на Си определяющий то что делает

функция. ; после функции не ставится.

Программа на Си начинает работу с функции main(), по необходимости из main()вызываются другие функции программы, по завершении работы функции программа возвращается в main() в то место от куда функция была

вызвана. main(){

... какой то код программы ... вызов функции_1; //программа перейдет в функцию_1 строка программы; // будет выполнятся после

// возврата из функции_1

... какой то код программы ... } функции могут вызываться не только из main() но и из других функций.

Пример программы на Си с описанной выше структурой я буду писать на голубом фоне. По мере надобности я буду разрывать голубой фон обычным текстом, затем голубой фон и программа будет

продолжаться.

/* п.1 заголовок программы Он оформляется как комментарий, и обычно содержит информацию - о названии, назначении, версии и авторе программы

- краткое описание алгоритма программы - пояснения о назначении выводов МК

- другие сведения которые вы считает полезным указать

*/ // комент. после двух косых черт пишут в одну строку! //п.2 включение внешних файлов

#include <mega16.h> /* перед компиляцией, препроцессор компилятора вставит вместо этой строчки

содержимое (текст) заголовочного файла "хидера" mega16.h - этот файл содержит перечень регистров имеющихся в МК ATmega16 и соответствие их названий их физическим адресам в МК. Посмотрите его содержание CVAVR\inc\mega16.h */ //delay functions

#include <delay.h>

/* перед компиляцией, препроцессор компилятора вставит вместо этой строчки текст "хидера" delay.h -

43

этот файл содержит функции для создания пауз в программе. Теперь чтобы сделать паузу вам нужно лишь написать : delay_ms(x); // сделать паузу x милиСек

delay_us(x); // сделать паузу x микроСек x - число от 0 до 65535 (тип unsigned int) */ //п.3 определения пользователя // AD7896 control signals PORTB bit allocation

#define ADC_BUSY PINB.0 #define NCONVST PORTB.1

/* после этих двух строк, перед компиляцией, препроцессор компилятора заменит в тексте программы

ADC_BUSY на PINB.0 и NCONVST на PORTB.1 Таким образом вместо того что бы помнить что вывод занятости AD7896 подключен у вас к ножке PB0 вы

можете проверять значение осмысленного понятия ADC_BUSY - "АЦП занят" а вместо управления абстрактной ножкой PB1 (через PORTB.1) вы можете управлять "НьюКонвешнСтат" -

NCONVST - "стартовать новое АЦ преобразование" #define - Это удобно ! но ВОВСЕ не обязательно. */

#define INIT_TIMER0 TCNT0=0x100L-F_XTAL/64L/500L

// этот пример показывает что определения

// могут быть и сложней !

Определения (соответствие номера бита в регистре его названию по ДШ) отдельных битов есть в "хидерах" .h в ICC, IAR и других компиляторах, но их нет в хидерах CodeVisionAVR Поэтому я сделал для вас файл -

заголовок m8_128.h скачайте его и добавьте в программу вот так: #include <mega16.h> //сперва обычный хидер

#include <m8_128.h> //мой хидер для битов Теперь вы можете использовать примеры на Си из ДШ на соответствующий МК ! Мой файл m8 128.h содержит

определения битов для микроконтроллеров ATmega8 ATmega16 ATmega32 ATmega64 ATmega128

Мастер начального кода программы в компиляторе ICC умеет по вашему желанию

автоматически делать #define для ножек МК !Подробней про это и с картинкой смотри в соответствующей задаче курса.

#define - может содержать и некоторые переменные, вместо которых в тексте программы могут быть подставлены

и числа и слова. Например: #define invbit(p,n) (p=p^bit(n)) Здесь переменные величины это 'p' и 'n'. Кроме того в самой правой части эти переменные величины могут быть связаны и арифметическими операциями и таких переменных может быть много.

44

стр. 5 часть 2

Язык Си для МК часть 2

Объявление переменных Перед использованием переменной в программе на Си еѐ необходимо объявить - т.е. указать компилятору какой

тип данных она может хранить и как она называется.Наиболее подробно об этом по ссылке: 1.2. ТИПЫ ДАННЫХ И ИХ ОБ ЯВЛЕНИЕ. Ниже сжато - самое главное: Формат объявления переменной таков: [<storage modifier>] <type definition> <identifier>;

[<storage modifier>]- необязательный элемент, он нужен только в некоторых случаях и может быть: extern - если переменная объявляется во внешнем файле - например в хидере delay.h приведенном

выше. volatile - ставьте если нужно предотвратить возможность повреждения содержимого переменной в

прерывании, и не позволить компилятору попытаться выкинуть еѐ при оптимизации кода.

Советую ставить если не знаете точно нужно или нет !

пример: volatile unsigned char x; static - если переменная локальная т.е. объявлена в какой либо функции и должна сохранять свое значение до следующего вызова этой функции. flash и eeprom - используются с указателями.

Глобальные переменные объявляются до появления в тексте программы какой либо функции.

Глоабльные переменные доступны в любой функции программы. Локальные переменные объявляются в самом начале функций - т.е. сразу после фигурной скобки "{". Локальные переменные доступны только в той функции где они объявлены! В разных функциях могут быть

объявлены локальные переменные с одинаковыми именами - я не советую вам так делать. Советую не использовать ЛОКАЛЬНЫЕ переменные в главной функции main. <type definition> - тип данных которые может хранить переменная. наиболе часто используемые типы данных : unsigned char - хранит числа от 0 до 255 (байт) unsigned int - хранит числа от 0 до 65535 (слово == 2 байта) unsigned long int - хранит от 0 до 4294967295 (двойное слово == 4 байта)

Подробнее все типы данных посмотрите в Help CVAVR\bin\CVAVR.HLP Раздел "Data Types"

Вместо unsigned char - можно писать писать просто char, так как компилятор по умолчанию считает

char без знаковым байтом. А если вам нужен знаковый байт то объявляйте его так : signed char imya_peremennoi;

<identifier> - имя переменной - некоторый набор символов по вашему желанию, но не образующий

зарезервированные слова языка Си. Выше был уже пример идентификатора - имени переменной: imya_peremennoi

Желательно давать осмысленные имена переменным и функциям - напоминающие вам об их назначении. принято использовать маленькие буквы, а для отличия имен переменных от названия функций - имена переменных можно например начинать с буквы, а названия функций (кроме main конечно) с двух

символов подчеркивания. Например так :

moya_peremennaya __vasha_funkziya

Внимание! Глобальные переменные, а также локальные с модификатором static - при старте и рестарте

программы равны 0 если вы не присвоили им (например оператором =) иное значение при их объявлении или по

45

ходу программы.Подробные примеры объявления переменных посмотрите пожалуйста в разделе Variables в

"Хелп" компилятора. Вот несколько примеров объявления переменных : unsigned char my_peremen = 34;

unsigned int big_peremen = 34034; Это объявлены две переменные и им присвоены значения. Первая my_peremen - символьного типа - это 1 байт, она может хранить число от 0 до 255. В данном случае в

ней хранится число 34. Вторая big_peremen - целого типа, два байта, в ней может хранится число от 0 до 65535 , а в примере в неѐ

поместили десятичное число 34034. Пример массива содержащего 3 числа или элемента массива.

char mas[3]={11,22,33}; Нумерация элементов начинается с 0. Т.е. элементы данного массива называются mas[0], mas[1], mas[2] и в них хранятся десятичные числа 11, 22 и 33. Где то в программе вы можете написать: mas[1] = 210; Теперь в mas[1] будет хранится число 210 - массивы могут быть многомерными, - можно не присваивать значений элементам массива при объявлении НО только при объявлении вы можете присвоить значения всем элементам массива сразу ! Потом это можно

будет сделать только индивидуально для каждого элемента. Строковая переменная или массив содержащий строку символов.

char stroka[6]="Hello"; Символов (букв) между кавычками 5 , а я указал размер строки 6 ! Дело в том, что строки символов должны заканчиваться десятичным числом 0.

Не путайте его с символом '0' которому соответствует десятичное число 48 по таблице ASCII - которая устанавливает каждому числу определенный символ. Например : Элемент строки stroka[1] содержит число 101 которому по таблице ASCII соответствует символ 'e'

Элемент stroka[4] содержит число 111 которому соответствует символ 'o'

Элемент stroka[5] содержит число 0 которому соответствует символ 'NUL' его еще обозначают вот так '\0' Строковая переменная может быть "распечатана" или выведена в USART MK вот так: printf("%s\n", stroka);

Вы можете преобразовать строковую переменную в число ! Если исходная строка символов такая : char stroka[]="3654694"; то вот так: perem_1 = atoi(stroka); мы поместим в переменную perem_1 (которую должны были ранее в программе объявить как

"беззнаковую целую") число 36546. Это число влезет в переменную perem_1 которая может хранить числа от 0 до 65535.А вот 9 и 4 уже не поместятся.Для бОльших чисел есть функция - atol() Чтобы использования эти функции необходимо

включить в начале программы заголовочный файл : #include <stdlib.h> Для преобразования числа в строку есть itoa() и ltoa()

Подробнее об этих и других полезных функциях смотрите раздел "Standard Library Functions" справки компилятора.

Советую вам скачать заголовочный файл m8 128.h Он содержит названия битов МК ATmega8 -16 -32 -64 -128 и сокращенные названия типов данных как в компиляторе IAR. вот отрывок из него: #define u8 unsigned char // 0 to 255 #define s8 signed char // -128 to 127

#define u16 unsigned int // 0 to 65535 #define s16 signed int // -32768 to 32767

#define u32 unsigned long int // 0 to 4294967295

46

#define s32 signed long int // -2147483648 to 2147483647

#define f32 float // ±1.175e-38 to ±3.402e38

#define d32 double // ±1.175e-38 to ±3.402e38

После включения моего "хидера" в текст вашей программы вы сможете писать вместо длинного unsigned long int <имя 32 битной переменной> коротко : u32 <имя 32 битной переменной> u - беззнаковая - значит не отрицательная s - значит переменная со знаком 32 - количество бит в переменной

Следующий пункт в структуре программы на Си для МК ...

/* п.5 описание функций - обработчиков прерываний Подробно о прерываниях в AVR читайте на стр. 3

курса ! мы будем использовать в ЭТОЙ программе - только одно прерывание и значит одну функцию

обработчик прерывания. Программа будет переходить на неѐ при возникновении прерывания :

ADC_INT - по событию "окончание АЦ преобразования" */

interrupt [ADC_INT] void adc_isr(void) {

PORTB=(unsigned char) ~(ADCW>>2);

/* отобразить горящими светодиодами подключенными от + питания МК через резисторы 560 Ом к ножкам порта_B старшие 8 бит результата аналого-цифрового преобразования */ /* сделаем паузу 127 мСек чтобы в реальном устройстве можно было увидеть переключение светодиодов */

delay_ms(127);

/* В реальных программах старайтесь не делать пауз в прерываниях! Обработчик прерывания должен

быть как можно короче и быстрее */ // начать новое АЦ преобразование

ADCSRA|=0x40;

} // закрывающая скобка для обработчика прерывания

Функция обработчик прерывания может быть названа вами произвольно - как и любая функция кроме

main.

Здесь она названа : adc_isr

При каком прерывании ее вызывать - компилятор узнает из строчки :

interrupt[ADC_INT] по первому зарезервированному слову - interrupt - он узнаѐт, что речь идет об обработчике прерывания, а номер вектора прерывания (адрес куда физически, внутри МК перескочит программа при возникновении прерывания)

будет подставлен вместо ADC_INT препроцессором компилятора перед компиляцией - этот номер указан в подключенном нами ранее заголовочном файле ("хидере") описания "железа" МК - mega16.h - это число

сопоставленное слову ADC_INT. Очень информативна и тем ценна для обучающегося следующая строка программы: PORTB = (unsigned char) ~(ADCW>>2); Давайте проанализируем как она работает. = оператор присваивания. Он означает присвоить значение выражения

справа от оператора присваивания той переменной что указана слева от него. Значит нужно вычислить выражение справа и поместить

его в переменную PORTB. Вычислим что справа от оператора присваивания. ADCW - это переменная слово (двухбайтовая величина - так она объявлена в файле mega16.h) в котором

CodeVisionAVR сохраняет 10-битный результат АЦП - а именно в битах9_0 (биты с 9-го по 0-й) т.е. результат выровнен обычно - вправо.

47

Но у нас, в VMLAB только 8 светодиодов и нужно отобразить 8 старших бит результата - т.е. биты_9_2 - для

этого мы сдвигаем все биты слова ADCW вправо на 2 позиции ADCW >> 2 /* биты 1 и 0 вылетают вправо из числа в небытие,

бит_9 перемещается в позицию бит_7, бит_8 в позицию бит_6 и так далее до бит_2 становится бит_0 */ Теперь старшие 8 бит результата АЦП встали в биты7_0 младшего байта (LowByte - LB) слова ADCW

>> n означает сдвинуть все биты числа вправо на n позиций это равносильно делению

на 2 в сепени n

<< n означает сдвинуть все биты числа влево на n позиций это равносильно умножению

на 2 в сепени n

Сдвиг используется очень часто !

Светодиоды подключены так как написано выше - т.е. подключены правильно ! Загораются (показывая "1") при "0" на соответствующем выводе МК - значит нам нужно выводить в PORTB число в котором "1" заменены "0" и наоборот - это делает как я рассказал выше : ~ операция побитного инвертирования Значит результатом этого выражения ~(ADCW>>2) будут инвертированные 8 старших бит результата АЦП находящиеся в младшем (правом - LB) байте двух байтового слова ADCW

Выше я уже говорил что : в Си в переменную можно помещать только тот тип данных который она может хранить ! Так как PORTB это байт, а ADCW - это два байта, то прежде чем выполнить оператор присваивания (это знак = ) нужно преобразовать слово (слово - word - значит два байта) ADCW в без знаковый байт.

Преобразование типов данных - делают так : перед тем что надо преобразовать записывают в скобках ( )

тип данных к которому нужно преобразовать.

Пишем ... (unsigned char) ~(ADCW>>2) Результат этой строки - один байт и мы можем поместить его в PORTB Если в регистре DDRB все биты равны "1" - т.е. все ножки порта_B выходы, мы безусловно увидим старшие 8 бит

результата АЦП горящими светодиодами. Вам должна быть абсолютно понятна разобранная строка: PORTB = (unsigned char) ~(ADCW>>2); Если это не так то повторите разбор, и почитайте рекомендованное ниже по Си. разберем еще одну строчку : ADCSRA|=0x40; обратите внимание на необходимость ставить в конце выражений точку с запятой - не забывайте ! Эта строка означает следующее:

Двигаемся слева на право : - берем значение переменной ADCSRA (это регистр МК - значит программа прочитает его, возьмет число

из него) - выполняем с этим числом операцию обозначаемую вертикальной черточкой | ( это поразрядная

операция ИЛИ - только "0" и "0" дают "0" ) с числом 0x40 - присвоим или поместим результат поразрядного ИЛИ обратно в переменную ADCSRA - т.е. запишем

результат в регистр ADCSRA 0x40 это в двоичном виде: 0100 0000

так как в результате поразрядного ИЛИ только два "0" дают "0" биты в ADCSRA напротив нулей не изменятся, а

вот бит_6 в ADCSRA оказывается напротив "1" и теперь он станет "1" не зависимо от того каким он был до этого ! т.е. смысл рассматриваемой строки программы ADCSRA|=0x40; "установить" (т.е. сделать "1") бит_6 в регистре ADCSRA

48

Число справа от составных операторов |= &= ^= обычно называют маской,

и говорят "наложить маску" - так как в результате меняются лишь те биты которые нужно изменить.

Для обнуления нужных бит используют обозначаемое знаком & поразрядное логическое И - только "1" и "1"

дает "1" PEREM &=(~0x04); // обнулить бит_2 в переменной PEREM Скобки здесь я добавил для улучшения читаемости кода. Самоконтроль - важно: а) обязательно разберитесь почему обнуляется бит_2 б) Как в двоичном виде выглядит результат (~0x04)

/* п.6 функции используемые в программе */ // их может быть столько сколько вам нужно. // у нас будет одна, кроме main и

// обработчика прерывания. /* =================================

Это будет функция в которой описано начальное

конфигурирование МК в соответствии с

поставленной задачей Удобно над функцией сделать заголовок

подробно поясняющий назначение функции !

===================================== */

(void)__init_mk(void) {

/* Вначале любой функции объявляются ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ - если конечно они вам нужны */ /* void - означает пусто. Перед названием функции - void - означает что функция не возвращает ни какого значения. А в скобках

после названия означает что при вызове в функцию не передаются ни какие значения. */ // инициализация Port_B DDRB=0xFF; // все ножки сделать выходами

PORTB=0xFF; // вывести на все ножки "1" /* настройка АЦП - производится записью определенного числа в регистр "ADC Control and Status Register

A" – ADCSRA посмотрите его описание в ДШ МК мега16. Нам нужно: - Включить модуль АЦП - Установить допустимую частоту тактирования АЦП при частоте кварца 3.69 МГц - мы выберем коэф.

деления 64 - это даст частоту такта для процессов в АЦП 57.656 КГц - Включить прерывание по завершению АЦ преобразования. По ДШ для этого нужно записать в регистр ADCSRA

число: 1000 1110 или 0х8E */ // ADC initialization w Oscillator=3.69MHz

// ADC Clock frequency: 57.656 kHz // ADC Interrupts: On

ADCSRA=0x8E; /* Теперь выбираем вход АЦП ADC0 (ножка PA0) и внешнее опорное напряжение (это напряжение код АЦП которого будет 1023) с ножки AREF

Смотрим что нужно записать для этого в регистр

мультиплексора (выбора входа) АЦП ADMUX

см. ДШ */

49

// Нужно записать 0 (он там по-умолчанию) ADMUX=0;

/* Разрешаем ГЛОБАЛЬНО все прерывания

разрешенные индивидуально ! Вы наверно поняли что индивидуально мы разрешили

лишь прерывание по завершении АЦП - вот оно то и сможет возникать у нас. */

#asm("sei")

Внимание ! так делаются вставки ассемблерных инструкций: #asm("инструкция на ассемблере") Обратите внимание - точки с запятой НЕТ ! Такие вставки принято иногда делать НО они не являются необходимыми, На Си можно управлять ВСЕМИ программно изменяемыми битами в регистрах МК !

Напоминаю ... Все регистры МК перечислены в конце ДШ с указанием номеров страниц с

подробным описанием регистра и его битов.

Но почему-то часто используются такие строки: #asm("sei") // Разрешить ГЛОБАЛЬНО все прерывания #asm("cli") // Запретить ГЛОБАЛЬНО все прерывания #asm("nop") // Пауза в 1 такт процессора #asm("wdr") // Сбросить сторожевой таймер

// все функция закончена

} // скобка закрывающая для функции __init_mk()

Далее...

/* п.7 главная функция main() - обязательная !

*/ /* ================================= Главная функция - Си программа начинает выполнятся с нее!

===================================== */ void main(void){ /* Вначале любой функции объявляются

(если нужны) ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ */ __init_mk();/*Вызываем функцию инициализации, настроийки аппаратуры МК. Выполнив ее программа

вернется сюда и будет выполнять

следующую строку */ // запускаем первое АЦП

ADCSRA|=0x40; // бесконечный цикл в ожидании прерываний

while(1); /* Программа будет крутится на этой строчке постоянно проверяя истинно ли условие в

скобках после while а так как там константа

1 - то условие будет истинно всегда!

// функция main закончена } // скобка закрывающая для функции main()

Теперь программа будет работать так :

50

По завершении АЦП будет возникать прерывание и программа будет перескакивать в функцию обработчик

прерывания adc_isr(), при этом будут автоматически запрещены все прерывания ГЛОБАЛЬНО !В конце adc_isr() запускается новое АЦ преобразование и при выходе из обработчика прерывания снова разрешаются

глобально прерывания, и программа возвращается опять в бесконечный цикл while(1) .Такая чехарда будет

продолжаться пока есть питание МК и не будет сброса. Светодиоды будут высвечивать 8-ми битный код АЦП напряжения на ножке PA0 Еще щепотка Си : Пример: делать что-то пока на ножке PBn есть "1" while(PINB & (1 << n)){

что-то /* что-то будет выполнятся снова и снова, пока проверка условия в скобках после while будет давать "истину" -

значит пока на ножке PBn есть логическая единица */ }; примечание - в CVAVR можно написать проще while(PINB.n){ Пример: выполнить что-то если на ножке PCn есть "0" if((~PINC)&(1 << n)){ что-то

/* что-то начнет выполняться если на ножке PCn был "0" */

}; примечание - в CVAVR можно написать проще while(!(PINB.n)){ Помните ! Выполнение чего-то может быть прервано прерыванием.

После завершения обработки прерывания выполнение чего-то продолжится. примечание - Условие : if((~PINC)&(1 << n)) { можно записать и вот так : if(!(PINC & (1 << n))) {

К битам регистров с адресами от 0 до 31 в компиляторе CodeVisionAVR можно обратится (и читать и

записывать) проще. Вот так: REGISTR.BIT

Пример: PINB.2 или PORTA.5 Пример:

if(!PINB.2){ этот код /* Если на ножке PB2 низкий

логический уровень - то выполнить этот код */

}; Пример:

PORTA.3 = 1; /* Сделать бит 3 в регистре PORTA единицей - говорят: "установить бит"

по англ. "set bit" */

Битовые операции подробно описаны в задаче 1 и конечно в help компиляторов !

Всѐ программа на Си написана. Вам должно быть все ясно и абсолютно понятно. Если это не так то

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

51

- стр. 6 - Задачи-упражнения

по краткому курсу AVR Чтобы двигаться дальше вам нужны программы: 1) Компилятор CodeVisionAVR 2) Софт симулятор-эмулятор AVR VMLAB 3) Вы должны знать материал предыдущих страниц курса

Если это так: Приступайте к работе! Задачи-упражнения курса - это практические занятия, примеры по написанию программ для AVR с сопутствующим

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

на инструменте: сколько не читай - играть ни фига не научишься ... Задачи нужно проделать читая, прочувствовать - только так! Большинство задач могут быть выполнены виртуально, на ПК. Вам не нужно покупать МК и что-то паять, что

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

рабочей программы. Операции над отдельными битами.

Задача 2 знакомство с эмулятором электронных устройств - VMLAB - симулятором МК AVR на примере файла-

прошивки полученной в задаче 01. Мигаем светодиодами, измеряем длительность сигналов на экране виртуального осциллографа (окно

scope) Задача 3 Закрепить навыки программирования и работы в компиляторе CodeVisionAVR очень подробно и с картинками учимся моделировать работу электронного устройства в симуляторе

VMLAB Делаем универсальный таймер на микроконтроллере ATmega8, с дискретной установкой

времени. Задача 4 Адаптер для связи вашего МК устройства с COM-портом ПК по rs232. Метод отладки вашего устройства - нахождение ошибок программы и "железа" с помощью вставки

контрольных сообщений в текст программы. Программы для ПК позволяющие вести, отслеживать и сохранять на жестком диске обмен по COM-

портам. Задача 5 Создаѐм программу для ATmega16 принимающую и передающую данные обмениваясь ими с ПК через

COM-порт по интерфейсу rs232 с помощью USART встроенного в МК серии ATmega. Углубляем навыки создания программы в CVAVR и продолжаем использовать Си для микроконтроллеров. Подключаем и управляем символьным ЖКИ LCD 16x2 (2 строки по 16 символов)

Задача 6 Тщательное знакомство с компилятором ICC и подробный рассказ с картинками о применении его

мастера начального кода. Создаем программу 50 раз в секунду прерывающуюся по Таймеру_0 и посылающую данные на ПК. Точная подгонка временных интервалов создаваемых с помощью таймеров. Различные режимы работы

таймеров. В симуляторе VMLAB проверяем правильность времени прерываний и сохраняем принятые от МК

данные в файл.

Задача 7 Помнить все! добавляем 2 Мб памяти - быстрой и не забывающей информацию при отключении питания - стоит

всего 5 баксов. Подключение AT45DB161 к МК AVR по SPI со схемой и программой на Си с подробными

комментариями.

Задача 8 Что такое ШИМ (PWM) сигнал. Как аппаратно сделать ШИМ.

Как сделать ЦАП с помощью ШИМ и отфильтровать сигнал - т.е. получить аналоговый сигнал из

цифрового. Программа к задаче написана в компиляторе Си CodeVisionAVR, симуляция выполнена в VMLAB.

52

Задача 9 Электронный вольтметр - измеритель вибрации.

Цель задачи: разработать устройство и программу для МК ATmega16 для измерения напряжения и

частоты сигнала от датчика вибрации и отображения результата на 2х разрядном 7-ми сегментном светодиодном индикаторе.

Задача знакомит с АЦП ATmega16 (такой же в ATmega32 ATmega64 ATmega128) используется

компилятор CodeVisionAVR - дан пошаговый пример создания программы с нуля. Симуляция в VMLAB

с комментарием.

Задача 9 часть 2 Проектирование входной цепи для сигнала

- расчет уилителя-фильра сигнала перед подачей на АЦП - применение ОУ (операционных усилителей) для изменения параметров входного сигнала

- защита устройства от внешних электрических воздействий !

Задача 10

Устройство изменяющее состояние нагрузки при громком звуке длительностью от 5 до 20 мС. Цель задачи: разработать устройство и программу для МК ATmega16 которое будет анализировать длительность

сигнала от микрофона и если она будет лежать в пределах 5-20 мС то будет менять состояние подключенной нагрузки: если была выключена - то включит и наоборот. Задача повторяет-закрепляет навык генерации начального кода программы в компиляторе CodeVisionAVR для ATmega16. Задача 11

АЦП - аналоговый сигнал преобразуем в Цифровой код при помощи 10 битного АЦП встроенного (там целых 8

каналов!) в МК AT90s8535. Программу пишем на CodeVisionAVR, компилируем и затем отладим в эмуляторе с наблюдением движения программы по тексту на Си. Приступайте к работе! Того что есть вполне достаточно для уверенного старта, остальное в АпНоутах и в

Интернете навалом. А какой AVR выбрать для поделок ?

их там много... Вы не спец и надеюсь не собираетесь делать серийное устройство, соответственно вопросы конкурентной борьбы

и цены МК в серии вас не сильно волнуют - вам похоже нужно комфортно, без изворотов и ухищрений,

получить быстрый результат. Я уже давал совет на 1-й странице курса, здесь дополню: Комфортно касательно МК - это когда много памяти и ножек (выводов, пинов) чтоб не сталкиваться с их не хваткой.

Комфортно когда на одном МК вы сможете сделать и то что вам надо сейчас и надо будет сделать потом и

легко что-то добавить в работающую систему. Советую вам выбрать универсальный МК - пусть он будет один у вас - зато вы сможете хорошо его узнать и не тратить время на изучение разных МК под каждый следующий проект. Используйте ATmega16 (-32 -64 -128) ATmega16 недорогой, выпускается в 40-ка выводном удобном для самоделкиных корпусе DIP-40 с шагом ножек

2.54 мм. длина МК - 53 мм ширина 17 мм.

53

- 16 Кб многократно программируемой памяти (Flash Program Memory) для вашей программы, - 1 Кб оперативной памяти SRAM, - 512 байт памяти EEPROM - сохраняющей информацию при отключении питания, - 8-ми канальный 10 битный АЦП (АЦП 90s8535) - USART позволит вам организовать скоростной двусторонний обмен по Rs232 с COM портом ПК, либо с

другими устройствами, - TWI интерфейс (это i2c но по ATMEL'овски) - SPI интерфейс (пример использования)

при напряжении питания от 4,5 до 5,5 вольт может работать с тактовой частотой от 0 до 16 МГц - эта частота

определяется внешним кварцевым или керамическим резонатором, либо другим внешним источником тактирующего сигнала либо простым RC генератором - встроенным или внешним.

этот МК может работать без кварца так как имеет встроенный RC генератор, обеспечивающий частоту 1, 2, 4 или

8 МГц с точностью +- 3%. Во многих устройствах такая точность достаточна. Еѐ можно повысить калибровкой,

она описана в Апликухах (надеюсь вы уже знаете что это такое!) С завода МК ATmega поставляются с включенным внутренним генератором на 1 МГц. Изменить это можно изменив программатором

установку Фьюзов МК. Если вы выбрали другой AVR - ни чего страшного, так как это именно семейство МК, все они имею одинаковый набор инструкций и программы легко переносятся с одного на другой с минимальной - однако необходимой!

корректировкой.

После выбора МК Вам необходимо скачать ДатаШит (ДШ) на него (DataSheet.pdf) - это паспорт МК в нем

есть "Errata" - описание уже обнаруженных ошибок МК - про него не забывайте!

Идеально распечатать и изучить весь ДШ - но я понимаю, что сделать это не просто, он ведь большой.

Поэтому настоятельно прошу вас распечатать стр. 1-5 и раздел "Register Summary" (примерно стр. 329-330) -

это список регистров МК и ссылки на номера страниц с их подробным описанием. Скачивайте свежий ДШ !

Краткие рекомендации по созданию

электронных устройств.

Обычно первый монтаж устройства выполняют на макетных платах (а в случае единичного устройства такой

монтаж бывает и окончательным вариантом). Здесь посмотрите варианты простых макетных плат от

OLIMEX

54

там же есть интересные проекты устройств на AVR!

Такие макетные платы продаются в магазинах компонентов, а схемы свободно доступны на сайте.

Макетка - это обычная печатная плата содержащая множество отверстий обычно с шагом 2.54 мм, с одной (реже с двух) стороны вокруг отверстий есть луженые медные площадки.

Компоненты вставляют ножками в отверстия а с обратной стороны производят соединения гибким монтажным проводом. Вот пример монтажа устройства на макетной плате: (Это JDM-программатор для МК PIC и устройств

с интерфейсом i2c )

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

очень аккуратный и качественный монтаж.

Если сторону проводников после тестирования, промыть от флюса растворителем, просушить и залить компаундом или лаком - то устройство наверняка будет работать долго и надежно.

55

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

Очень удобно конденсаторы и резисторы брать чипы размера 0805 и 0603 и паять прямо на ножки

компонентов.

Немного о пайке: Электроника наука о контактах! это очень точное определение, большинство отказов

правильно спроектированных устройств вызвано отсутствием электрического контакта там где он

должен быть и наоборот. Пайка основной вид неразъемных электрических соединений применяемый в электронике -

поэтому вы легко можете найти материалы по тому как паять правильно. Важно чтоб паяльник имел нужную температуру! Используйте регулятор нагрева паяльника. Например комнатный выключатель света с

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

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

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

компонента, прогреть площадку около ножки и затем подводить жало к ножке... всего 2-4 сек. примерно. Нужен опыт конечно. Жало почаще протирайте сложенной в несколько слоев хб тряпочкой и при выгорании

затачивайте напильником и залуживайте. Я затачиваю жало паяльника как классическое жало плоской отвертки, только угол между

гранями больше - примерно 30 градусов, а ширина жала около 3 мм для большинства работ. Жало

простое медное диаметром 4.5 мм. Второе жало, аналогичное но с шириной всего 1 мм - это для

пайки компонентов для поверхностного монтажа размеров 0603 и 0805 и микросхем с шагом от 0.5 мм. Таким образом я всю пайку выполняю паяльником на 40 Вт с двумя сменными жалами. Желательно использовать не канифоль а активный флюс (он типа вазелина бывает), или

паяльную пасту - она с припоем уже. Плату после пайки промойте кисточкой растворителем в наклонном положении.

Подробно: Припои флюсы способы пайки - статья в FAQ'е курса

Очень рекомендую прочитать! Руководство по правильной разводке печатных плат и проводов в устройстве Подробно разъяснено происхождение, излучение и влияние электромагнитных помех и методы их снижения для

обеспечения EMC. Внимание ! Удобно купить мощный многоногий МК уже припаянный на плату с некоторыми нужными

дополнительными элементами. вот ATmega128 к примеру, на плате:

USB встроен и прочие приятности - документация тут.

в отверстия по краю платы впаяйте гребенки штырьков или гнезд и затем к ним подключайте без пайки разъемы

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

Аналогичный модуль от Olimex

56

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

А вот подороже но и по-навороченей: (Тестовая программа для платы ) :

Более качественный монтаж можно выполнить изготовив специальную плату для вашего устройства - обычно это

делают уже отладив устройство в симуляторе и/или на макетной плате. Вот примерный вид рисунка печатных проводников для переноса на плату:

А вот тот же программатор JDM, но собранный на

специальной печатной плате со сверлением:

57

Для рисования схем и "разводки" (размещение компонентов на плате и прокладка соединяющих дорожек) печатной платы устройства рекомендую - мощная и очень популярная у электронщиков программа рисования

схем и "разводки" (размещение компонентов на плате и прокладка соединяющих дорожек) печатной платы устройства: EAGLE (Она бесплатна для плат достаточно большого размера.)

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

дополнительные библиотеки электронных компонентов и различные микроконтроллерные проекты со схемами и

печатными платами выполненными в этой программе. Очень рекомендую! ( краткое руководство по EAGLE накрапал на русском)

Еще : DipTrace - очень приятная в работе программа! Чудесно разводит платы в автоматическом режиме.

ЛУТ или Лазерно - Утюжный метод изготовления печатной платы 1) Рисунок печатной платы ЗЕРКАЛЬНО печатаю на глянцевой стороне "Универсальной бумаги для струйной

печати" LOMOND - глянцевая-матовая двухсторонняя 50 листов А4, вес 170 гр/м2 (на торце пачки и над штрих-

кодом номер 0102009) с обычными настройками принтера HP LaserJet 6P. Можно использовать испорченные, неудачные фотографии.

К рисунку платы можно добавить изображение рамки большей чем контур заготовки платы примерно на 1 мм с каждой стороны - так будет легко правильно совместить рисунок и плату. Или сделать в плате 2 (или больше)

отверстия диаметром 3-4 мм, измерить РЕАЛЬНОЕ расстояние между ними и нанести на рисунок платы

соответствующие перекрестия-прицелы для точного визуального совмещения рисунка с платой. Это полезно при изготовлении двухсторонних плат.

2) Медь платы я шкурю шкуркой с зерном 300-500 в перекрестных направлениях, затем стираю пыль тампоном из бинта. Не касайтесь поверхности платы пальцами! 3) Положите на ровную УСТОЙЧИВУЮ поверхность:

- упругий, ровный материал типа коврика мыши или листовой жесткий упаковочный мелкопористый поролон (я

использовал 20 мм) - 2 листа бумаги А4

- рисунок ЗЕРКАЛЬНЫЙ платы тонером вверх !!! - плату положите на рисунок КОНЕЧНО медью к тонеру, для центровки используйте прозорливо напечатанные

контуры или отверстия в плате совмещаемые с перекрестиями на рисунке.

- если плата большая, то для более равномерного распределения нагрузки и тепла положите сверху еще 2-4 заготовки для плат.

- лист бумаги А4 чтоб не коцать подошву утюга.

58

- утюг ХОЛОДНЫЙ !!!

- груз на утюг - я кладу 2 кГ сахара в мешках на плату 60х80.

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

перекоса - тогда рисунок будет равномерно прижат к меди. 4) Моѐ ноу-хау в этом методе, возможно и позволяющее уверенно получать дорожки 0.1 мм - НЕ НАДО

ТОРКАТЬ ГОРЯЧИЙ УТЮГ ТУДА-СЮДА ! Вы просто отходите в сторонку от этого "пирога" и нежно включаете утюг в розетку. Он

нагревается и сам выключается-включается терморегулятором. Регулятор утюга я ставлю на "3" - у моего утюга

это 120-130 градусов всего. (я использую принтер HP LJ 6P - его тонеру этого достаточно). Не нужно греть сильней

После первого автоматического отключения нагрева я жду 5 минут, выключаю утюг из розетки. Оставляю установку минут на 20-30, что бы "пирог" остыл ниже температуры плавления тонера. Теперь можно снять утюг. 5) Плату с фотобумагой положите в теплую воду. Примерно через 3-5 минут она намокнет и по краям отойдет от платы. Не спешите! Я оставляю на 30 минут "изделие". После этого бумага уже хорошо отделяется от фотослоя,

который вживляется в поры тонера. Таким образом весть тонер покрыт фотослоем, его поры закрыты и при

травлении дорожки получаются не изъеденными раствором. К сожалению именно фотослой не дает делать зазоры менее 0.2 мм - он намертво заседает в маленьких зазорах и

не желает от туда вымываться. Однако после высыхания фотослой легко вычищается из зазоров иголкой. Остатки бумаги и фотослоя скатываются пальцами в воде - но их бывает мало и лишь в нескольких местах.

6) После высыхания платы внимательно с линзой проверьте рисунок платы на наличие дефектов. Особенно

фотослой в узких местах между тонером. Подретушируете при необходимости рисунок нитро-лаком (мебельный НЦ222, цапон, лак для ногтей) и кисточкой от лака для ногтей или зубочисткой.

7) Травлю, после высыхания ретуши, в хлорном железе в пластиковой емкости - свежий раствор работает быстрее, не грею.

удобно: Прикрепляю пенопласт к обратной стороне платы и плата плавает в хлорном железе травящейся стороной вниз - таким образом шлам от травления не оседает на плате а опускается на дно емкости и не

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

процесса травления. Проверяйте процесс чаще ! Не передерживайте в растворе для уменьшения бокового подтрава узких дорожек!

8) Хорошо промойте плату проточной водой и смойте тонер растворителем, еще раз пошкурьте медь мелкой шкуркой, просушите плату.

Вот пример платы с дорожками 0.15 мм изготовленной по описанной технологии под программатор-отладчик

для микроконтроллеров PIC ICD2

Линки на такие устройства на русском языке

есть в низу заглавной страницы курса.

9) Я залуживаю всю медь платы паяльником с припоем предварительно смазав ватной палочкой медь активным флюсом. Плату держу сильно наклонно и веду жало паяльника всегда вниз от контактных площадок,

чтоб на контактных площадках не скапливался припой! Вот и все!

59

- стр. 7 - Чем и как "прошить" МК AVR ?

Как загрузить программу в микроконтроллер. Как запрограммировать микроконтроллер AVR.

Напоминаю: Об основах и тонкостях электроники и схемотехники читайте в настольной книге

электронщика: П.Хоровиц, У.Хилл. Искусство схемотехники на РУССКОМ языке. Я советую прошивать микроконтроллер прямо из программатора встроенного в компилятор CodeVisionAVR через

простейший адаптер - буквально "пять проводков" соединяющих принтерный порт ПК с прошиваемым микроконтроллером AVR. ПОДРОБНО: Результат написания и компиляции программы - файл-прошивку с расширением .hex (и возможно

файл с содержимым для EEPROM МК) нужно записать ("зашить") в МК . МК AVR многократно программируются прямо в устройстве

в котором будут работать - такое программирование называют - "ин систем программинн" или ISP.

Для этого установите на плате вашего устройства 6 контактов, а лучше 6-ти штырьковый разъем для ISP

вид сверху платы на штырьки. выводы подсоединить к МК в соответствии с

указанными названиями.

Подробней по ISP разъемам посмотрите Апликейшн Ноут AVR910. Вывод 2 нужно подключить к + питания МК если вы собираетесь использовать программатор питающийся

от вашего же устройства - например фирменный ISP AVR.

Для "5 проводов" этот вывод не подключается. Для программирования достаточно 5 контактов.

Соответственно и разъем который вы будете использовать может быть любым удобным для размещения на плате и имеющий минимум 5 контактов. Все контакты ISP разъема подсоединяются к ножкам МК в соответствии с

названиями.

ВНИМАНИЕ ! в ATmega64 и ATmega128 выводы MOSI и MISO не применяют для ISP Внимательно

смотрите ДатаШит ! Например для ATmega128 сигналы MISO подключают к ножке PE1, MOSI подключают к ножке PE0

Я советую вам пользоваться интерфейсом программирования встроенным в компилятор CodeVisionAVR и

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

что вы от него ожидаете - значит в программу нужно будет вносить изменения и снова зашивать в МК , и так раз

20 и более. Вы можете в компиляторе CodeVisionAVR открыть меню "Проджект -> Конфига -> Афта Мэйк" и отметить чек

бокс "Program the chip" затем ОК. Еще нужно в меню "Сеттинс -> Программер" выбрать ваш адаптер (подробней ниже) для программирования. Теперь после безошибочной компиляции программы вам будет

доступна кнопка "Program" - нажмите на нее и произойдет программирование МК - т.е. файл .hex будет загружен

в память программ МК. Затем МК будет "сброшен" (на ножку RESET будет подан лог. 0 а затем опять "1") и начнет выполнять только что прошитую (загруженную в него) программу. Вам даже не нужно будет отсоединять адаптер

программирования от вашего устройства если вы не используете в устройстве последовательный интерфейс SPI. ... и так до окончательной отладки устройства.

В А Ж Н О ! В диалоге настройки программирования не трогайте галочки установки фьюзов МК если не разобрались четко что они делают! Иначе вы можете отключить режим ISP или

внутренний RC-генератор и для следующего программирования вам понадобится ставить кварц с конденсаторами или даже искать Параллельный программатор для AVR. Но

популярному ATtiny2313 даже параллельный программатор не поможет!

60

в ATmegaXXX с завода включен внутренний RC генератор на частоте 1 МГц ( уточните это по ДШ и его

возможные частоты ) Если вам нужна другая частота или нужно включить внешний кварцевый или керамический резонатор - вам нужно запрограммировать некоторые фьюзы по таблицам из ДШ или по таблице фьюзов на стр. 2 З а п о м н и т е : НЕ запрограммированный фьюз 1 ЗАпрограммированный фьюз 0

Пример: Чтобы включить в ATmega16 внешний кварцевый резонатор с частотой от 3 до 8 МГц с конденсаторами (по схеме рис. 12 ДШ) найдите в ДШ раздел "System Clock". В таблице 2 указаны комбинации фьюзов для разных источников тактового сигнала. Далее написано что с завода МК поставляется с такой комбинацией фьюзов SKSEL 0001 SUT 10 CKOPT 1 По таблице 4 находим :

Для кварца с частотой от 3 до 8 МГц нужны конденсаторы от 12 до 22 пФ и вот такая комбинация фьюзов : SKSEL 1111 SUT 10 CKOPT 1 Установка фьюзов в программаторе компилятора CVAVR

Для прошивания МК нажмите кнопку "Program All" Для использования ATmega16 (и других мег) с внешним кварцевым или керамическим резонатором на частотах

выше 8 МГц вам нужно установить фьюзы как в примере выше но запрограммировать CKOPT - значит сделать

его "0". Т.е. вам нужна такая комбинация: SKSEL 1111 SUT 10 CKOPT 0 CKOPT 0 - нужен и тогда когда вы хотите подключить к XTAL2 другой микроконтроллер или тактируемый прибор. Фьюзы SUT - определяют запуск генератора тактового сигнала, в большинстве случаев их установку можно

оставить "как с завода" - SUT 10 - более детально это описано в даташите в таблицах до 12. Для соединения компьютера с ISP разъемом устройства на AVR Советую сделать адаптер от STK200 - это

"правильные 5 проводков" с микросхемой буфером снижающим вероятность случайного повреждения порта ПК. В установках компилятора CodeVisionAVR интерфейс "5-проводков" называется "Канда системз

STK200+/300"

61

Программа узнаѐт адаптер STK200 по перемычкам на разъеме параллельного порта к которому он подключается -

должны быть соединены двумя перемычками пары выводы: 2 и 12, 3 и 11.

Внимание! Для программирования к МК должно быть подключено питание. Например +4...+5

вольт ко всем выводам МК в названии которых есть VCC и 0 вольт ко всем выводам GND (это "общий" провод). Пример тут

Если в МК нет внутреннего генератора тактового сигнала (например старые AVR серии AT90sXXXX или мега побывавшая в чьих то шаловливых руках изменивших фьюзы до того как попасть к вам) то нужно

подключить кварц на 1 - 8 МГц и два конденсатора от 15 до 33 пФ. Либо подать тактовый сигнал 1-1.5 МГц от внешнего источника - например генератора на микросхеме 74hc14 или на таймере LM555.

Программатор AVReAl может программировать МК без кварца и без конденсаторов. Он выводит тактовый сигнал на выв. 5 LPT его нужно подать на ножку XTAL1 МК и добавить в командной строке AVReAL

специальный ключ "-o0". Программатор AVReAl позволяет назначать какие ножки LPT порта использовать - это будет полезно когда часть ножек LPT вы уже спалите :-) (Тактовый сигнал генерирует и программатор на USB по ссылке внизу этой страницы.) Еще очень советую поставить подтягивающий резистор 10 кОм от ножки Reset МК на питание VCC и конденсатор 0.01-0.33 мкФ (в апноутах AVR040 и AVR042 рекомендуют 0.01 мкФ) от Reset на GND - как в схеме

к задаче 7 курса.

Я использую самый простой вариант адаптера STK200 - "для самых ленивых" - пять поводков

соединяющих линии параллельного (LPT) порта ПК и AVR так же как на схеме STK200 выше, но без микросхемы буфера. Лучше все же токоограничительные резисторы от 150 до 270 ом впаять Проводки

не более 15 см длиной !

Адаптер "5-проводков" прекрасно работает с компилятором CodeVision

Советую для изготовления адаптера взять " принтерный" шнур - он длинный и экранированный, а не

экранированные проводки не стоит делать более 10-15 см.

Для питания устройства при программировании и отладке можно кроме сетевого адаптера использовать: - батарейку на 6 вольт с 2 диодами последовательно для понижения напряжения... - можно три батарейки по 1,5 вольт последовательно соединить ... а можно +5 вольт взять с вывода 1 гейм порта компьютера или осторожно из гнезда USB.

Желательно питать устройство от ПК! В этом случае "земля" вашего устройства будет соединена с корпусом

ПК и можно будет безопасно подключать и отключать разъем программирующего адаптера.

ВНИМАНИЕ! Всегда старайтесь первыми соединить "земли" устройств, а затем питание и потом уже

62

сигнальные линии.

Не поленитесь: спаяйте адаптер STK200 на микросхеме буфере по рисункам внизу страницы - так как LPT порт компьютера более нежен чем COM - соответственно его спалить проще...

Если вы хотите использовать ножки МК SCK, MOSI, MISO в вашем устройстве то подключайте другие

компоненты к ним через резисторы 4.7 КОм - чтобы не мешать программированию. Так рекомендовано в апноуте AVR042 Для Мега64, -128, -256 вместо MOSI и MISO используются другие ножки для

ISP программирования !

Если у вас нет LPT порта сделайте Аналог "5 проводков" для COM-порта Или соберите простой, дешевый USB программатор для AVR Или соберите похожий программатор USB программатор AVR и AT89s Вот топик об успешной сборке этого интерфейса для программирования на ATmega8. Это новый вариант платы

для него. Архив с разводкой платы Внимание ! Этот программатор выдает тактовый сигнал 1 МГц и меньше для прошивки МК без кварца и с выключенным внутренним генератором. тактовый сигнал выводится на контакт

"LED". Его нужно подвести к ножке XTAL1.

Существуют специальные программы "бутлодеры" которые записываются в микроконтроллер

способами перечисленными выше и после этого микроконтроллер может сам, при включении, закачивать в себя программу (например из ПК через адаптер UART rs232 COM port - схема в задаче 4

курса) и запускать ее выполнение. Есть много бесплатных загрузчиков Вот хороший: Bootloader AVR. Вот еще: MegaLoad Bootloader

Программатор AVR микроконтроллеров. LPT программатор.

Кликни чтобы увеличить Принципиальная схема программатора на LPT порт показана на рисунке. В качестве шинного формирователя

используется микросхема 74HC244 (К1564АП5), 74LS244 (К555АП5) либо 74ALS244 (К1533АП5), хотя может

использоваться любой другой неинвертирующий шинный формирователь с тремя состояниями (в этом случае может потребоваться соответствующее изменение схемы). Светодиод VD1 индицирует режим записи микроконтроллера, светодиод VD2 - чтения,

светодиод VD3 - наличие питания схемы. Напряжение, необходимое для питания схема берѐт с разъѐма ISP, т.е. от программируемого устройства. Эта схема является переработанной схемой программатора STK200/300 (добавлены светодиоды для удобства работы),

поэтому она совместима со всеми программами программаторов на PC, работающих со схемой STK200/300. Для работы с этим программатором используйте программу CVAVR

Программатор можно выполнить на печатной плате и поместить еѐ в корпус разъѐма LPT, как показано на рисунках:

63

Для работы с программатором удобно использовать удлинитель LPT порта, который несложно изготовить самому (к примеру, из кабеля Centronix для принтера), главное "не жалеть" проводников для земли (18-25 ноги разъѐма)

или купить. Кабель между программатором и программируемой микросхемой не должен превышать 20-30 см. Файлы:

Схема LPT программатора (в формате sPlan 5.0) (22,5 кб)

Топология печатной платы LPT программатора (в формате Sprint Layout 3.0) (22,0 кб) AVR miniICE - Это профессиональное средство для программирования и отладки программы МК ATmega фирмы Atmel в

реальном устройстве. Он полностью совместимый с оригинальным AVR JTAG ICE. Автор данного устройства Milan Kostomlatsky [email protected] Оригинальное описание находится здесь Пример реализации: на макетке

64

- стр. 8 - Дополнительные материалы:

Platan.ru Рускоязычный сайт с морем информации по любым электронным компонентам там же: цены, DataSheet'ы и заказы р-деталей почтой по России. Можете бесплатно заказать CD-ROM'ы с

документацией ведущих производителей компонентов. Интересный AVR сайт: Sin-bad.narod.ru с информацией по AVR для начинающих и русским описанием

архитектуры этих МК, приемы программирования, документация.

В разделе "AVR документация" рекомендую пункты 5,6,9,10,13 - это переводы фирменых атмеловских Application Notes ссылка на оригинал которых находится ниже по тексту. Советую скачать и прочитать внимательно: "серия из 11 статей по МК опубликованых в журнале

"СхемоТехника" под общем названием: Микроконтроллеры? Это же просто! - подробно рассказывается о том что же такое микроконтроллер и как с ним работать" автор А. Фрунзе - много пишет для начинающих в

различных журналах - в низу страницы.

СОВЕТУЮ: будет время - скачайте и прочитайте 4 статьи из журнла Circuit Cellar (очень ценный журнал по электронным самоделкам на профессиональном уровне) о применении в достаточно серьезных проектах

компилятора Си ICC AVR: Цитата: Circuit Cellar magazine publishes many articles that use the ImageCraft compilers. Here are some that are using

especially helpful for ICCAVR users, from beginners to advanced users: 1. Taking a Swim with Atmel's STK500 2. Still Swimming With the STK500, Onto the JTAG ICE 3. Design with STKxxx, Build an Ethernet Controller 4. Construct an ATA Hard Drive Controller По ссылкам ищите "Соусыз и пдф" и скачивайте .pdf файлы статей, там же есть ссылки на прилагаемые "исходники" к статьям.

Здесь все публикации журнала с 1988 года - некоторые в свободном доступе. Базовые знания по Электронике можно получить здесь: 1) Basic Electronics Theory 2) Analog Dialogue - Крупнейший производитель компонентов публикует теоретические сведения для

электронщиков - все прекрасно рассказано, с картинками и бесплатно!

Профессиональные разработчики обычно используют для отладки устройство: AVR JTAG ICE. подробную информацию и документацию смотрите на сайте производителя. стоит устройство под сотню баксов и позволяет

отлаживать программу прямо в реально изготовленном, работающем устройстве. Вы можете за меньшие деньги

сделать AVR JTAG ICE самостоятельно

Я тоже обычно отлаживаю программу прямо в реально изготовленном, работающем устройстве. при помощи адаптера и способа описанных в задаче 4 курса.

65

- стр. 9 - МК "PIC" от MicroChip

от производителя PIC-ов, более 600 примеров применения с теорией схемами и кодом программ: All Application Notes (апликухи!) Начинающему PIC'оману от классика жанра: David Tait's PIC Links На самом деле это не линки, а бесценные для

старта материалы. Их можно скачать одним архивом 5 Мб - очень удобно.

Peter Anderson's PIC Page - супер! не только о ПИКах но и по связи ПК с внешним миром.

THE PIC COURSE без комментариев! из названия все понятно... и просто, с картинками Rentron.com - много готовых заготовок-кубиков из которых можно сложить свое устройство!

FAQ - два сборника ответов на вопросы по Си для PIC - один лучше другого ПО для разработки программ для PIC HT-PICC - Компилятор Си (пожалуй лучший) для PIC и классная инструкция.

SourceBoost IDE - Компилятор Си для PIC - недорогой от Павла Баранова. позволяют вести хорошую

графическую симуляцию работы МК. PIC Simulator IDE - среда разработки ПО и симуляции работы МК PIC от компании oshonSoft Ну и наконец: Программировать PIC (т.е. заливать в МК то, что вы наваяете) можно вот этим (я его использую и для i2c приборов): JDM PIC Programmer - там схема, рисунок платы (не забудьте, на плате есть 2 перемычки! - но

они плохо видны).

Софт для программирования рекомендую Ic-prog.com - я использовал успешно, значит проверено мной. Симулятор электроники и ПИКов - PROTEUS