Курс AVR123.nm.ru |
|
||
- стр. 3 - Краткий курс - Самоучитель - AVR - быстрый старт с нуля. Микроконтроллер (МК)
Продолжение ... Напомню:
Самая подробная и полная информация Он доступен в оригинале и на русском языке. Книги и учебники по 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" открывается
транзисторный ключ Если к ножке ни чего не подключено то при выводе "1" на ножке будет напряжение почти равное напряжению питания МК - это VCC - в курсе по умолчанию считаем +5 вольт. А при выводе логического "0" - напряжение на ножке будет очень близко к 0 вольт - это потенциал GND. Однако: Если к ножке МК подключить что либо проводящее ток и так "сопротивляющееся" созданию нужных программе выходных сигналов - напряжения на ножках могут уже не достигать потенциалов VCC и GND и значительно ! Это связано с тем что открытый полевой транзистор имеет некоторое не нулевое сопротивление и соответственно протекание тока через него вызывает падение напряжения.
График 179 показывает каким будет напряжение на ножке МК при выводе на нее "0" при подключенной нагрузке "тянущей" эту ножку током (в мА на левой вертикальной оси графика) к источнику положительного напряжения :
примечание: бит в регистре PORTx равен "0" а бит в регистре DDRx установлен т.е. равен "1" - значит ножка сконфигурирована как выход. Из графика видно, что при втекающем в ножку токе равном 10 мА напряжение на ножке МК будет 0.25 вольт, а при токе 20 мА уже 0.45 вольт
График 177 показывает каким будет напряжение на ножке МК при выводе на нее "1" при подключенной нагрузке "прижимающей" эту ножку током (в мА на левой вертикальной оси графика) к "земле" т.е. к нулю вольт :
примечание: бит в регистре PORTx равен "1" а бит в регистре DDRx установлен т.е. равен "1" - значит ножка сконфигурирована как выход. По этому графику можно определить что при токе "на землю" в 10 мА на ножке МК будет не 5 вольт а примерно 4.75 вольт - это соответствует подключению резистора 475 Ом от ножки МК на GND. При токе 20 мА напряжение на ножке будет 4.5 вольт примерно - это соответствует подключению к ножке МК резистора 225 Ом.
Пожалуйста хорошо усвойте что означают эти графики - вы будете знать что реально будет на ножках МК когда вы ими "шевелите" - т.е. выводите на них нужные вам сигналы.
Я уже говорил ранее что все сигналы аналоговые и поэтому изменение напряжения на ножках МК не происходит мгновенно Фронт
сигнала (переход из "0" в "1") и
спад сигнала (переход из "1" в
"0") Наклон этот тем больше чем выше емкость нагрузки подключенной к ножке. Это связано с тем что для изменения напряжения на конденсаторе (на емкости) требуется изменение его заряда - а изменение заряда равно произведению протекающего тока на время протекания (точнее интеграл тока по времени), так как все эти величины имеют конкретные конечные значения то и время переключения не равно нулю.
вывод: Стремитесь
к разумному уменьшению емкостей Если же емкость уменьшить не возможно - например ножка МК управляет затвором мощного полевого транзистора (затвор это по сути конденсатор) то поставьте между ними резистор хотя бы на 100 Ом.
МК это микроКомпьютер и он тоже может зависнуть ... В результате не совершенства созданной вами программы или под влиянием внешних "злых сил" а может и по вашему умыслу МК может зависнуть. Для воскрешения зависшего МК в нем предусмотрено специальное устройство - Сторожевой таймер - Watchdog Timer (сокращенно WDT) - это таймер который тактируется (т.е. ведет отсчет) своим собственным встроенным в МК RC-генератором с частотой примерно 1 МГц. WDT - активируется специальным фьюзом при программировании МК и затем программа может выключать и включать его (фьюз конечно не меняется при этом) через регистр управления сторожевым таймером - Watchdog Timer Control Register – WDTCR В этом же регистре делают установку времени через которое WDT перезагрузит МК путем установки коэффициента деления частоты задающего генератора . Если WDT
активирован то вы должны в своей
программе расставить #asm("wdr") //так в компиляторе CodeVisionAVR так часто чтобы обнуление WDT происходило через промежутки времени ГАРАНТИРОВАНО меньшие чем время переполнения таймера WDT - я советую расставлять такие команды так часто насколько возможно. В соответствии с ДШ Table 17. Watchdog Timer Prescale Select время от обнуления до переполнения WDT и вызванного этим сброса МК (т.е. рестарта его программы с начала) может быть установлено вами программно от 16 мСек до 2 Сек. Предположим вы установили это время 16 мСек и пока программа в МК не зависла, она исправно обнуляет за счет предусмотренных вами команд. #asm("wdr")
При этом
будет установлен специально обученный бит
прочитав который программа сможет при
необходимости определить причину
сброса, перезагрузки МК - в
данном случае сброс по переполнению WDT.
иТак ... с возможностями МК заложенными производителем мы разобрались ... как бы !
Далее ...
Электроника
подключенная к МК 1)
задача
первой группы отсечь опасные токи и
напряжения для защиты схемы и
нормировать сигналы подлежащие
обработке в МК к виду допустимому и
понятному для МК и ещё наиболее удобному для обработки
средствами содержащимися в МК. При токе 2 А падение напряжения на резисторе в 0.1 Ом будет всего 2 * 0.1 = 0.2 вольта - если подать такой сигнал на АЦП МК ATmega (а рекомендованное минимальное опорное напряжение для него - 2 вольта и тогда 2 вольта это код АЦП 1023) то оно будет преобразовано в код 102 а меньший ток в еще меньший код. Значит несмотря на то что АЦП имеет разрядность в 10 бит вы получите результат лишь в 7 бит примерно - грубовато... Очевидно нужно усилить сигнал с датчика тока в 10 раз - до 2-х вольт и мы получим оцифровку тока с разрешением 10 бит - это и называется нормирование сигналов - предварительная их подготовка.
К понятию нормирования
сигналов - относится и различная фильтрация
сигналов для выделения интересующего
участка спектра сигналов подлежащих
обработке.
Пример:
задача 9_b "Фильтрация и
нормирование измеряемого сигнала перед
подачей на АЦП".
Например еще раз: вам нужно передавать в МК информацию от COM-пота ПК - но сигналы USART MK "перевернуты" относительно COM-овских и напрямую связать их неправильно! Оптимальное решение поставить специальную микросхему MAX232 или ее дешевый и доступный аналог - который можно найти на rel.ru по запросу: *232* С помощью этой микросхемы вы согласуете физические уровни (проще - напряжения) сигналов ПК к уровням требуемым USART МК (ножка RxD) - можно сказать нормируете их. Тоже делает и "шнурок" для сотового телефона
2) другая часть электроники подключенной к МК предназначена для обеспечения стабильного и достаточно "чистого" питания МК - пример вы видели в разборе АпНоута, их много и в других аналогичных документах.
Примером может быть также микросхема MAX232 но теперь нормирующая сигнал от USART МК (ножка TxD) для того чтобы его принял и понял COM-порт ПК. Конечно
существует большое количество других
устройств которыми может управлять МК
непосредственно или через специальные
микросхемы интерфейсы или драйверы -
Тиристоры, Симисторы, Транзисторы,
элементы индикации, радио модули и так
далее. Важно! Все перечисленные группы внешних компонентов общаются с внешним миром. А в мирУ бушуют страсти, трещат статические разряды !!! т.е. нужно предусматривать элементы защищающие от вредного воздействия окружающей среды. И сами силовые элементы управляемые МК и коммутирующие большие токи так же могут являться источником помех - вы видели это в разборе АпНоута на стр1 курса.
Это деление "обвязки" МК на группы чисто условное, и конечно элементы любой группы могут не только передавать или принимать информацию (сигналы) на МК но и обмениваться с ним - это микросхемы памяти, LCD дисплеи, другие микросхемы сообщающие МК тем или иным способом о том что в них происходит.
как работают прерывания в микроконтроллере AVR прерывается как объявить функцию обработчик прерывания прерывания в МК
Прерывания
в AVR. Interrupts
- прерывания,
очень важная и Иногда
требуется максимально быстрая реакция Например
приход данных на USART или завершение АЦП
или изменение уровня на ножке МК подключенной к
контактному
При возникновении события которое может вызвать разрешенное в данный момент времени прерывание и при ГЛОБАЛЬНОМ разрешении прерываний (бит7 в регистре SREG "установлен"), выполнение программы МК останавливается, сохраняются (запоминаются) место остановки и некоторые нужные данные, бит7 в регистре SREG обнуляется, очищается флаг сработавшего прерывания и затем происходит вызов и выполнение функции обработчика данного прерывания. От момента
наступления события до начала
выполнения функции Скорость реакции на
прерывание напрямую зависит
Если программа находится в функции обработчике прерывания и в этой функции не был установлен бит SREG.7 то другие события вызывающие прерывания не могут уже вызвать прерывание программы и их обработку. Делайте функции обработчики прерывания как можно короче ! Не засиживайтесь в них ... Если
сейчас произойдут события которые могут
вызвать прерывания то установятся их
флаги, но даже разрешенные прерывания не
произойдут !
НО
! Если при глобальном разрешении
прерываний обнаружится установленный
флаг разрешенного прерывания, то будет вызвана
функция обработчик Такая ситуация может возникнуть если во время выполнения обработчика прерывания возникло другое прерывание - т.е. установился его флаг. Если возникнет несколько разрешенных прерываний одновременно то первым будет выполняться то которое выше в списке векторов прерываний МК в ДШ. Соответственно по мере отработки накопившихся и разрешенных прерываний их флаги будут очищаться. А вот
флаги неразрешенных прерываний не
очистятся пока программа этого не
сделает записью в них числа 1.
Все сразу -
изменяя бит7 в регистре SREG вот такими
строчками #asm("sei") /* бит_I сделать "1" теперь разрешенные прерывания будут обрабатываться, если есть установленный флаг прерывания то произойдет вызов его функции обработчика */ #asm("cli") /* бит_I сделать "0" запретить все прерывания ГЛОБАЛЬНО. */
это ДШ надо читать ... или хотя бы русское описание AVR
Для ATmega16
прерывания перечислены
Я
сделал для вас Программировал в CVAVR и симулировал в VMLAB. К ножкам-входам внешних прерываний INT0 INT1 INT2 ATmega16 я подключил резисторы по 10 КОм к + питания МК для создания внешней подтяжки и еще подключил три кнопки 0, 1 и 2 в "Control Panel" симулятора. Нажимая кнопку мышкой можно замыкать соответствующую ножку на "землю" создавая на ней "0" на время пока кнопка нажата. Когда кнопки не нажаты на ножках "1". Конфигурировал
прерывания и USART с помощью Прерывания INT0 INT1 разрешены и сконфигурированы "по любому изменению уровня" - т.е. прерывание может возникать и по фронту ("0" -> "1") и по спаду ("1"->"0") сигнала на ножке PD2 и PD3 соответственно. Прерывание
INT2 не конфигурировал - оно оставлено Откройте проект vmlab.prj в VMLAB и сделайте "ребилд-ол" В меню View
откройте, если их нет на экране, панели
"регистры и флаги" Теперь
нажмите несколько раз на светофор - чтоб
прекратились меседжи Теперь нажмите кнопку K2 и отпустите. Посмотрите в панели "регистры и флаги" в регистре флагов 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 При этом вначале очистится бит INTF0, а затем INTF1.
Важно ! Из примера выше следует что Накопление не обработанных прерываний крайне не желательно так как МК "не помнит" последовательность возникновения соответствующих событий !
... и теперь самый
пожалуй ПРОГРАММА "зашитая" в МК
Я постулировал ранее что - Возможность
МК действовать по вашей программе - вот
суть-соль МК.
- о внешних электрических сигналах поступающих на МК - про электронику подключенную к МК - о возможностях заложенных производителем
AVR ATmega содержит многократно программируемую FLASH память программ - в нее загружается (есть различные варианты прошивки, загрузки программы - достаточно пяти проводков от LPT-порта к МК) программа которую будет исполнять МК при наличии следующих условий: 1) есть
питание МК При наличии
этих условий МК начинает шагать по
программе которая представляет из себя
последовательность инструкций которые
может выполнять МК иногда прерываясь
так как было описано выше.
Программа взаимодействует с МК записывая, изменяя в нужное время числа в регистрах МК и читая в нужное время числа из определенных регистров. Важно понимать ! Именно взаимодействует с МК, а не просто управляет! То что содержится в регистрах МК влияет на ход выполнения программы если она это предусматривает.
О как ! ... да что ж это за регистры такие, будь они не ладны!
Регистры
МК
Регистр (Register) MK AVR - это набор из 8 бит т.е. 1 байт. Как бы ящичек с 8-ю
ячейками с номерами от 7 до 0.
бит7 самый левый - MSB - наиболее значимый бит, старший бит. бит0 самый правый - LSB - наименее значимый бит, младший бит. Бит может иметь значение "1" или "0". 8 бит
составляют байт и могут хранить
десятичное другие
формы записи этого диапазона чисел
таковы:
Число которое находится в регистре - есть значение регистра. Значение в
регистре вычисляется как сумма
составленная из восьми (значение бита) умножить на (2 в степени равной номеру бита) Пример: Теперь вы видите почему бит 7 называется "мост сигнификант бит" - MSB - наиболее значимый бит, старший бит. Если некоторый бит равен "0" он конечно ни чего не добавляет в сумму.
Регистры в других МК бывают и 16 битными и больше! но лучше говорить: шире. в МК AVR есть 32 регистра общего назначения из которых 6 регистров R26 - R31 (или R26_31) могут быть виртуально объединены в пары и таким образом получается три 16-битных регистра.
Регистры МК
имеют индивидуальные, уникальные адреса Полное название регистра соответствует назначению регистра. Например:
Такой же
принцип соблюдается в именовании
При
программировании на языке Си вы можете в Например
так:
В конце
ДатаШит (DataSheet = DS) есть сводная таблица
Вот пример схемы -- устройства регистра WDTCR из ДШ Регистры целиком либо отдельные биты могут быть: - R/W можно
читать и записывать (== изменять) Initial Value -
это то что будет в регистре после
включения питания или после появления
перехода из "0" в "1" на ножке Reset
или после прекращения сброса После такой
схемы регистра в ДШ идет
Обязательно разберитесь с регистрами ! они являются средством общения программы с МК т.е.
РЕГИСТРЫ очень важны.
Программа не может измерить уровень существуют на ножке МК, но она может узнать об этом прочитав значение соответствующего бита в соответствующем регистре !
Например так :
Дойдя до этой строчки программа проверит чему равен бит_5 в регистре PINB - в нем МК сохраняет результат преобразования напряжения на ножках порта_В в логические уровни "0" или "1" по правилам о которых я рассказал уже ранее - и по результату проверки программа будет действовать далее. while (PINA.6)
{ делать что-то };
Дойдя до
этой строчки программа проверит чему
равен бит_6 в регистре PINA - если он
"1" то выполнит то что в скобках
{ } затем опять
проверит этот бит. Так программа будет
работать пока не будет прерывания либо
пока бит_6 не станет "0". Значит так вы можете ввести в программу ожидание нажатия кнопки замыкающей ножку PA6 на "землю" (только обеспечив "1" на ножке при отпущенной кнопке). while (PINA.6);
Если
вы уже "въехали" или "въезжаете"
то надеюсь поняли Программа может только читать из этих регистров. Если не понятно - перечитайте пожалуйста ! Не оставляйте на потом !
|
ключевые слова:
программирование микроконтроллеров,
как написать программу для
микроконтроллера, обучение
программированию микроконтроллеров,
микроконтроллеры atmega128, как
запрограммировать микроконтроллер, как
прошить микроконтроллер, отладка
программы для AVR, моделирование работы
электронных схем, электронные проекты,
хобби, язык си для микроконтроллеров,
язык программирования си Основы
программирования (кнопочки, светодиоды)
Работа с портами. Прерывания и таймеры.
Основы ШИМ, программная и аппаратная
реализация. Сервоприводы. Работа с АЦП
Настройка и программирование UART Работа
с I2C Связь (UART, I2C, SPI) AT76C712 , AT76C713 , AT90CAN128 , AT90CAN128 Automotive , AT90CAN32 , AT90CAN64 , AT90PWM2 , AT90PWM3 , AT90S1200 , AT90S2313 , AT90S2323 , AT90S2343 , AT90S4433 , AT90S8515 , AT90S8535 , ATmega128 , ATmega1280 , ATmega1281 , ATmega16 , ATmega161 , ATmega162 , ATmega163 , ATmega164 , ATmega165 , ATmega168 , ATmega168 Automotive , ATmega169 , ATmega2560 , ATmega2561 , ATmega32 , ATmega323 , ATmega324 , ATmega325 , ATmega3250 , ATmega329 , ATmega3290 , ATmega406 , ATmega48 , ATmega48 Automotive , ATmega64 , ATmega640 , ATmega644 , ATmega645 , ATmega6450 , ATmega649 , ATmega6490 , ATmega8 , ATmega8515 , ATmega8535 , ATmega88 , ATmega88 Automotive , ATtiny11 , ATtiny12 , ATtiny13 , ATtiny15L , ATtiny2313 , ATtiny25 , ATtiny26 , ATtiny28L , ATtiny45 , ATtiny85 |
МикроКонтроллеры AVR Начинающим "с нуля"
|