Только в этом месяце - скидки на паяльники и электронику с нашими кодами (123avr.com) :




Страницы курса:

Уроки

Задания


index.htm
01.htm
02.htm
03.htm
04.htm
05.htm
06.htm
07.htm
08.htm
09.htm


z1.htm
z2.htm
z3.htm
z4.htm
z5.htm
z6.htm
z7.htm
z8.htm
z9.htm
z10.htm
z11.htm

New! - ФОРУМ!

Совет - умейте правильно находить информацию!


Добавить страницу в закладки:

- стр. 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" при подключенной нагрузке "тянущей" эту ножку током (в мА на левой вертикальной оси графика) к источнику положительного напряжения :   

примечание: бит в регистре 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" при подключенной нагрузке "прижимающей" эту ножку током (в мА на левой вертикальной оси графика) к "земле" т.е. к нулю вольт :

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

     
 

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

 

     

Credit Star


  Пожалуйста хорошо усвойте что означают эти графики - вы будете знать что реально будет на ножках МК когда вы ими "шевелите" - т.е. выводите на них нужные вам сигналы.  Я уже говорил ранее что все сигналы аналоговые и поэтому  изменение напряжения на ножках МК не происходит мгновенно. Фронт сигнала (переход из "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.

     
 

Хорошая новость:
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-порт ПК

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

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

Это деление "обвязки" МК на группы чисто условное, и конечно элементы любой группы могут не только передавать или принимать информацию (сигналы) на МК но и обмениваться с ним - это микросхемы памяти, 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.  Как использовать мастер начального кода показано в упражнениях курса

В МК 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 и отпустите. 

Посмотрите в панели "регистры и флаги" в регистре флагов 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 - "только чтение" - ведь значения в них может определять только сам МК по реальным уровням напряжений на соответствующих ножках

Программа может только читать из этих регистров.

Если не понятно - перечитайте пожалуйста !  Не оставляйте на потом !

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

Добавить страницу в закладки:

<- Назад                                  Дальше ->

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Rating All.BY Rambler's Top100 ћ≈“ј - ”краина. –ейтинг сайтов



Copyright 2009-2019 123avr.com