Страница 3 Самоучитель Краткий курс Микроконтроллер AVR ATmega ключевые моменты - Устройство AVR Attiny ATmega. Это продолжение ! начало на стр. 2 курса.
Напомню:
Самая подробная и полная информация Он доступен в оригинале и даташит AVR на русском языке.
Книги и
учебники по электронике
Язык Си для МК AVR - самое нужное там
Страницы курса : заглавная 1 2 3 4 5 6 7 8 9 Задачи-упражнения курса по
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" открывается транзисторный ключ соединяющий ножку МК с + питания. Чтобы
вывести "0" открывается
транзисторный ключ
соединяющий ножку МК с выводом GND МК. А при выводе логического "0" - напряжение на ножке будет очень близко к 0 вольт - это потенциал GND. Однако: Если к ножке МК подключить что либо проводящее ток и так "сопротивляющееся" созданию нужных программе выходных сигналов - напряжения на ножках могут уже не достигать потенциалов VCC и GND и значительно ! Это
связано с тем что открытый полевой
транзистор имеет некоторое не нулевое сопротивление
и по закону Ома протекание тока через
него вызывает падение напряжения.
Значения
этого отклонения показывают графики в
конце ДШ.
Скачать даташит ATmega16 График 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 - в некоторых AVR (таблица фьюзов в низу стр. 2) активируется специальным фьюзом при программировании МК и затем программа может выключать и включать его (фьюз конечно не меняется при этом) через регистр управления сторожевым таймером - Watchdog Timer Control Register – WDTCR В этом же регистре делают установку времени через которое WDT перезагрузит МК путем установки коэффициента деления частоты задающего генератора. WDT - в
ATmega32 ATmega16
включается в программе установкой Bit 3 – WDE в регистре WDTCR
и может быть отключен программой специальной последовательностью команд
(стр. 43 в ДШ ATmega16) в
CVAVR вот так:
Если 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 или завершение
ЗАПОМНИТЕ ! При возникновении события которое может вызвать разрешенное (программой МК) в данный момент времени прерывание (список таких событий в даташите в разделе Interrupts таблица "Reset and Interrupt Vectors") или при наличии установленного флага разрешенного прерывания и при ГЛОБАЛЬНОМ разрешении прерываний (бит7 в регистре SREG "установлен"), выполняется до конца текущая инструкция, запоминается какая должна была быть следующая инструкция, сохраняются (запоминаются) некоторые нужные данные, бит7 в регистре SREG обнуляется, очищается флаг сработавшего прерывания и происходит вызов и выполнение функции обработчика данного прерывания. От момента наступления события до начала выполнения функции обработчика прерывания проходит не менее 4 тактов процессора. Значит Скорость реакции на
прерывание напрямую зависит
Если программа находится в функции обработчике прерывания ( и в этой функции программно не был установлен бит SREG.7 - так обычно и есть ) то другие события вызывающие прерывания не могут уже вызвать прерывание программы и свою обработку, они лишь "устанаваливают" свои флаги - получается очередь флагов. Поэтому: Делайте
функции обработчики прерывания как
можно короче !
НО ! Если в момент глобального разрешения прерываний обнаружится установленный флаг разрешенного прерывания, то будет вызвана функция обработчик этого прерывания. Такая ситуация может возникнуть если во время выполнения обработчика прерывания возникло другое прерывание - т.е. установился его флаг и оно разрешено (включено) программой. Если возникнет несколько разрешенных прерываний одновременно или несколько прерываний пока бит7 был нулем, то после установки бит7 в SREG первым будет выполняться то прерывание, которое выше в списке векторов прерываний МК в ДШ. Соответственно по мере отработки очереди накопившихся и разрешенных прерываний их флаги будут очищаться. А вот флаги неразрешенных прерываний не очистятся пока программа этого не сделает записью в них числа 1. Вы можете сами очистить флаги прерываний записью в них "1". Вы можете запрещать и разрешать как все прерывания сразу, так и каждое по отдельности! Все сразу -
изменяя бит7 в регистре SREG вот такими
строчками #asm("sei") /* бит_I сделать "1" теперь разрешенные прерывания будут обрабатываться, если есть установленный флаг разрешенного прерывания то произойдет вызов его функции обработчика и флаг очистится */ #asm("cli")
Даташит AVR на русском языке есть на странице 2 самоучителя AVR. НО ! Прерывания
легко настроить интерактивно
и главное ПРАВИЛЬНО с помощью мастеров кода
настройки AVR в компиляторе CVAVR
Как использовать мастер начального кода показано в упражнениях курса
Для
ATmega16
прерывания перечислены в таблице 18
Скачайте и запустите проект: Программировал в CVAVR и симулировал в VMLAB.
К ножкам-входам внешних прерываний INT0 INT1 INT2 ATmega16 я подключил резисторы по 10 кОм к + питания МК для создания внешней подтяжки и еще подключил три кнопки 0, 1 и 2 в "Control Panel" симулятора VMLAB. Нажимая кнопку мышкой можно замыкать соответствующую ножку на "землю" создавая на ней "0" на время пока кнопка нажата. Когда кнопки не нажаты на ножках "1". Конфигурировал прерывания и USART с помощью мастера генератора начального кода CVAVR и код конечно же работает. Прерывания 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 - причем сейчас МК AVR не "знает" какое из них случилось первым и значит будет обрабатывать их по порядку перечисления в таблице 18 ДШ. Ждем не долго ... появляются с некоторой паузой одно сообщение и затем другое свидетельствующие о вызове соответствующих обработчиков прерываний: int0 При этом вначале очистится бит INTF0, а затем INTF1.
Важно ! Из примера выше следует что Накопление не обработанных прерываний может быть не желательно или даже не допустимо по алгоритму программы, так как МК "не помнит" последовательность возникновения соответствующих событий !
... и теперь самый
пожалуй ПРОГРАММА "зашитая" в МК AVR
Я постулировал ранее что - Возможность
МК действовать по вашей программе - вот
суть-соль МК.
- о внешних электрических сигналах поступающих на МК - про электронику подключенную к МК - о возможностях заложенных производителем AVR
AVR ATmega содержит многократно (не менее 10 000 раз) программируемую FLASH память программ - в нее загружается (есть различные варианты прошивки, загрузки программы - достаточно пяти проводков от LPT-порта к МК) программа которую будет исполнять МК при наличии следующих условий: 1) есть
питание МК При наличии
этих условий МК начинает шагать по
программе которая представляет из себя
последовательность инструкций которые
может выполнять МК иногда прерываясь
так как было описано выше.
Программа взаимодействует с МК записывая, изменяя в нужное время числа в регистрах МК и читая в нужное время числа из определенных регистров. Важно понимать ! Именно взаимодействует с МК, а не просто управляет! То, что содержится в регистрах МК влияет на ход выполнения программы если она это предусматривает. О как ! ... да что ж это за регистры такие, будь они не ладны!
Регистры
МК AVR Регистр (Register) микроконтроллера 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-битных регистра.
Регистры МК
имеют индивидуальные, уникальные адреса Полное название регистра соответствует назначению регистра. Например:
Такой же
принцип соблюдается в именовании
При
программировании на языке Си вы можете в программе обращаться к регистрам МК по их названию в ДШ - это удобней чем помнить
абстрактные Например
так:
Все
регистры МК в
Там же названия всех бит
в регистрах, Скачать даташит ATmega16
Вот пример схемы -- устройства регистра 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);
Если
вы уже "въехали" или "въезжаете"
то надеюсь поняли Программа может только читать из этих регистров. Если не понятно - перечитайте пожалуйста ! Не оставляйте на потом !
|
|
http://www.sparkfun.com ARM tutorial - Jim
Lynch's tutorial for setting up the free GCC/GNU tool chain. The example
software is available here. Хостинг от uCoz
|