Только в этом месяце - скидки на паяльники и электронику с нашими кодами (123avr.com) :
![]() |
|
Совет - умейте правильно находить информацию!
|
Добавить страницу в закладки: - стр. 3 - Микроконтроллер
AVR ATmega
|
пример: Вы подключили к ножке МК анодом (где у диода черточка на схеме) светодиод и хотите чтоб через него протекал ток 15 мА. Как рассчитать токоограничительный резистор включаемый последовательно со светодиодом - от его катода к +5 вольт питания МК? Вот так:
|
||
Так как
линия графика почти прямая до 20 мА -
можно вычислить внутреннее сопротивление ключа
обеспечивающего вывод низкого
напряжения на ножку МК - это примерно 24
Ома. (нужно напряжение разделить на ток).
График 177 показывает каким будет напряжение на ножке МК при выводе на нее "1" при подключенной нагрузке "прижимающей" эту ножку током (в мА на левой вертикальной оси графика) к "земле" т.е. к нулю вольт :
примечание: бит в регистре 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
- я советую расставлять такие команды
так часто насколько возможно.
В соответствии с ДШ Table 17. Watchdog Timer Prescale Select время от обнуления до переполнения WDT и вызванного этим сброса МК (т.е. рестарта его программы с начала) может быть установлено вами программно от 16 мСек до 2 Сек.
Предположим вы установили это время 16 мСек и пока программа в МК не зависла, она исправно обнуляет за счет предусмотренных вами команд.
#asm("wdr")
Но вот МК
завис
- теперь как только WDT
переполнится (не позднее чем через 16
мСек с последнего обнуления) произойдет
перезагрузка МК и программа начнет свою
работу снова. При этом
будет установлен специально обученный бит
прочитав который программа сможет при
необходимости определить причину
сброса, перезагрузки МК - в
данном случае сброс по переполнению WDT.
Хорошая
новость:
|
||
Далее
...
Электроника
подключенная к МК
МК обычно располагается на плате, среди
других электронных компонентов, для
удобства рассмотрения я условно делю их на
группы:
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-порт ПК.
Конечно
существует большое количество других
устройств которыми может управлять МК
непосредственно или через специальные
микросхемы интерфейсы или драйверы -
Тиристоры, Симисторы, Транзисторы,
элементы индикации, радио модули и так
далее.
Важно! Все перечисленные группы внешних компонентов общаются с внешним миром. А в мирУ бушуют страсти, трещат статические разряды !!! т.е. нужно предусматривать элементы защищающие от вредного воздействия окружающей среды. И сами силовые элементы управляемые МК и коммутирующие большие токи так же могут являться источником помех.
Это деление "обвязки" МК на группы чисто условное, и конечно элементы любой группы могут не только передавать или принимать информацию (сигналы) на МК но и обмениваться с ним - это микросхемы памяти, LCD дисплеи, другие микросхемы сообщающие МК тем или иным способом о том что в них происходит.
О защите входов и выходов МК и устройства в целом я рассказываю в задаче-упражнении 9. Там же пример нормирования входного сигнала с датчика. Подробней о защите читайте на сайте очень полезном для начинающих электронщиков микроконтроллерщиков эмбедеров caxapa раздел: схемы - защита. |
||
Попробуйте поискать полезную инормацию в Гугле - ее там море ! Учитесь искать!
Interrupts
- прерывания,
очень важная и мощная функция МК AVR ATmega ATtiny.
Иногда
требуется максимально быстрая реакция программы на какие-то события. Например
приход данных на USART или завершение АЦП
или изменение уровня на ножке МК подключенной к
контактному датчику или переполнение
таймера ... Быструю
реакцию обеспечивает механизм
прерываний. При
возникновении события которое может
вызвать разрешенное в данный момент
времени прерывание и при ГЛОБАЛЬНОМ
разрешении прерываний (бит7 в регистре
SREG "установлен"), выполнение
программы МК останавливается,
сохраняются (запоминаются) место
остановки и некоторые нужные данные, бит7
в регистре SREG обнуляется, очищается флаг
сработавшего прерывания и затем
происходит вызов и выполнение функции
обработчика данного прерывания.
От момента
наступления события до начала
выполнения функции обработчика
прерывания проходит не менее 4 тактов
процессора. Т.е. Скорость реакции на
прерывание напрямую зависит от частоты
на которой работает МК !
В регистре SREG есть бит7 называется он " I "
Флаг прерывания - это просто бит который становится "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.
Как использовать
мастер начального кода показано в упражнениях курса
В МК AVR и других, прерывания могут
возникать по многим событиям:
- изменение уровня на некоторых ножках МК
- "0" на некоторых ножках МК
- переполнение таймеров
- "насчитывание" таймером определенного значения
- завершение АЦП преобразования
- изменение уровня на выходе компаратора
- события в USART
- другие события ...
В общем снова - читайте ДатаШит .. Для ATmega16 прерывания перечислены в таблице 18 "Reset ana Interrupt Vectors"
Примеры объявления функций обработки прерываний в популярных компиляторах: в CodeVision: в ICC :
#pragma
interrupt_handler timer0_ovf_isr:7 просто
указываем компилятору название
функции timer0_ovf_isr которая будет вызываться при
возникновении прерывания №
7. в WinAVR:
#include <avr/interrupt.h> В примерах слово "прерывание" нужно заменить на название прерывания из ДатаШита либо из заголовочного файла *.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 и отпустите.
Посмотрите в панели "регистры и флаги" в регистре флагов 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
Число которое находится в регистре - есть значение регистра.
Значение в
регистре вычисляется как сумма
составленная из восьми
таких слагаемых :
(значение бита) умножить на (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 или после прекращения сброса МК от другого источника. После такой схемы регистра в ДШ идет подробное описание функций каждого бита !
Обязательно
разберитесь с регистрами ! они являются
средством общения программы с МК
т.е. РЕГИСТРЫ очень важны.
Белых
пятен быть не должно !
Программа не может измерить уровень существуют на ножке МК, но она может узнать об этом прочитав значение соответствующего бита в соответствующем регистре !
Например так :
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 - "только чтение"
- ведь значения в них может определять только
сам МК по реальным уровням напряжений на
соответствующих ножках.
Программа может только читать из этих регистров.
Если не понятно - перечитайте пожалуйста ! Не оставляйте на потом !
Попробуйте поискать полезную инормацию в Гугле - ее там море ! Учитесь искать!
Добавить страницу в закладки:
Copyright 2009-2019 123avr.com