Docsity
Docsity

Подготовься к экзаменам
Подготовься к экзаменам

Учись благодаря многочисленным ресурсам, которые есть на Docsity


Получи баллы для скачивания
Получи баллы для скачивания

Заработай баллы, помогая другим студентам, или приобретай их по тарифом Премиум


Руководства и советы
Руководства и советы

Микроконтроллеры AVR учебное пособие 2010 по информатике , Руководство, Проектов, Исследование из Информатика

Микроконтроллеры AVR учебное пособие 2010 по информатике

Вид: Руководство, Проектов, Исследование

2016/2017

Загружен 12.04.2017

refbank20391
refbank20391 🇷🇺

5

(1)

9 документы

1 / 95

Toggle sidebar

Сопутствующие документы


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

Скачай Микроконтроллеры AVR учебное пособие 2010 по информатике и еще Руководство, Проектов, Исследование в формате PDF Информатика только на Docsity! Микроконтроллеры AVR Введение Однокристальные микроконтроллеры находят широкие применение в самых разнообразных сферах: от измерительных приборов, фотоаппаратов и видеокамер, принтеров, сканеров и копировальных аппаратов до изделий электронных развлечений и всевозможной домашней техники. Со времени появления первых микропроцессоров в 1970-х годах их сложность постоянно возрастала за счет появления новых аппаратных решений и добавления новых команд, предназначенных для решения новых задач. Так постепенно сложилась архитектура, получившая впоследствии название CISC (Complete Instruction Set Computers – компьютеры со сложным набором команд). В дальнейшем обозначилось и нашло активное развитие еще одно направление: архитектура RISC (Reduced Instruction Set Computers – компьютеры с сокращенным набором команд). Именно к этой архитектуре относятся микроконтроллеры AVR от компании Atmel и PIC от компании Microchip, которым посвящена эта книга. Основное преимущество RISC-процессоров заключается в том, что они просты, выполняют ограниченный набор команд, и, как следствие, очень быстродействующие. Это позволяет снизить стоимость и сложность их программирования. Обратной стороной RISC-архитектуры стала необходимость создания дополнительных команд на ассемблере, которые у CISC-устройств реализованы в аппаратной части. Например, вместо того, чтобы просто вызвать команду деления, которая характерна для устройств CISC, разработчику, имеющему дело с RISC-процессором, приходится применять несколько последовательных команд вычитания. Однако подобный недостаток с лихвой компенсируется ценой и скоростью работы RISC- устройств. Кроме того, если создавать программы на языке С, то подобные проблемы вообще перестают иметь какое-либо значение для разработчика, поскольку они решаются компилятором, который автоматически генерирует весь недостающий ассемблерный код. На заре возникновения микропроцессоров разработка программного обеспечения происходила исключительно на том или ином языке ассемблера, ориентированном на конкретное устройство. По сути, такие языки представляли собой символьные мнемоники соответствующих машинных кодов, а перевод мнемоники в машинный код выполнялся транслятором. Однако главный недостаток ассемблерных языков заключается в том, что каждый из них привязан к конкретному типу устройств и логике его работы. Кроме того, ассемблер сложен в освоении, что требует достаточно больших усилий для его изучения, которые, к тому же, оказываются потраченными впустую, если впоследствии потребуется перейти на использование микроконтроллеров других производителей. Язык С, являясь языком высокого уровня, лишен подобных недостатков и может использоваться для программирования любого микропроцессора, для которого есть компилятор с языка С. В языке С все низкоуровневые операции, выполняемые компьютерами, представлены в виде абстрактных конструкций, позволяющих разработчикам сосредоточиться на программировании одной лишь логики, не заботясь о машинном коде. Изучив язык С, можно легко переходить от одного семейства микроконтроллеров к другому, тратя гораздо меньше времени на разработку. В программах, написанных на языке С, непосредственное обращение к регистрам общего назначения обычно не требуется, если только не используются фрагменты на языке ассемблера. Регистры специальных функций микроконтроллеров PIC Регистры специальных функций используются в микроконтроллерах PIC для управления различными операциями. Как и в случае с регистрами общего назначения, их количество и адресация отличаются от устройства к устройству. В программах, написанных на языке С, непосредственное обращение к регистрам специальных функций обычно не требуется, если только не используются фрагменты на языке ассемблера. Область ввода/вывода микроконтроллеров AVR Область ввода/вывода микроконтроллеров AVR содержит 64 регистра, используемых для управления или хранения данных периферийных устройств. К каждому из этих регистров можно обращаться по адресу ввода/ вывода (начиная с 0x000) или по адресу SRAM (в этом случае к адресу ввода/ вывода следует прибавить 0x020). В программах на языке С обычно используются условные имена регистров ввода/вывода, а адреса имеют значение только для программ на языке ассемблера. Имена, адреса ввода/вывода и SRAM, а также краткое описание регистров из области ввода/вывода микроконтроллеров AVR представлены в табл. 2.1. При этом следует отметить, что в различных моделях микроконтроллеров некоторые из перечисленных регистров не используются, а адреса, не указанные в табл. 2.1, зарезервированы компанией Atmel для использования в будущем. Таблица 2.1. Описание регистров из области ввода/вывода Имя регистра Адрес ввода/ вывода Адрес SRAM Описание ACSR 0x08 0x28 Регистр управления и состояния аналогового компаратора UBRR 0x09 0x29 Регистр скорости передачи данных через UART UCR 0х0А 0х2А Регистр управления приемопередатчиком UART USR 0x0В 0x2В Регистр состояния приемопередатчика UART UDR 0х0С 0х2С Регистр данных приемопередатчика UART SPCR 0x0D 0x2D Регистр управления интерфейсом SPI SPSR 0х0Е 0х2Е Регистр состояния интерфейса SPI SPDR 0x0F 0x2F Регистр ввода/вывода данных интерфейса SPI PIND 0x10 0x30 Выводы порта D DDRD 0x11 0x31 Регистр направления передачи данных порта D PORTD 0x12 0x32 Регистр данных порта D PINC 0x13 0x33 Выводы порта С DDRC 0x14 0x34 Регистр направления передачи данных порта С PORTC 0x15 0x35 Регистр данных порта С PINB 0x16 0x36 Выводы порта В DDRB 0x17 0x37 Регистр направления передачи данных порта В PORTB 0x18 0x38 Регистр данных порта В PINA 0x19 0x39 Выводы порта А DDRA 0x1А 0х3А Регистр направления передачи данных порта А PORTA 0x1В 0х3В Регистр данных порта А EECR 0x1С 0х3С Регистр управления памяти EEPROM EEDR 0x1D 0x3D Регистр данных памяти EEPROM EEARL 0x1Е 0х3Е Регистр адреса памяти EEPROM (младший байт) EEARH 0x1F 0x3F Регистр адреса памяти EEPROM (старший байт) WDTCR 0x21 0x41 Регистр управления сторожевым таймером ICR1L 0x24 0x44 Регистр захвата таймера/счетчика Т/С1 (младший байт) ICR1H 0x25 0x45 Регистр захвата таймера/счетчика Т/С1 (младший байт) OCR1BL 0x28 0x48 Регистр сравнения В таймера Т/С1 (младший байт) OCR1BH 0x29 0x49 Регистр сравнения В таймера Т/С1 (старший байт) OCR1AL 0х2А 0х4А Регистр сравнения А таймера Т/С1 (младший байт) OCR1AH 0x2В 0x4В Регистр сравнения А таймера Т/С1 (старший байт) TCNT1L 0х2С 0х4С Счетный регистр таймера/счетчика Т/С1 (младший байт) TCNT1H 0x2D 0x4D Счетный регистр таймера/счетчика Т/С1 (старший байт) TCCR1B 0x2Е 0х4Е Регистр управления В таймера/счетчика Т/С1 TCCR1A 0x2F 0x4F Регистр управления А таймера/счетчика Т/С1 TCNT0 0x32 0x52 Счетный регистр таймера/счетчика Т/С0 TCCR0 0x33 0x53 Регистр управления таймера/счетчика Т/С0 MCUCR 0x35 0x55 Регистр управления микроконтроллером TIFR 0x38 0x58 Регистр флагов прерываний от таймеров/счетчиков TIMSK 0x39 0x59 Регистр маскирования прерываний от таймеров GIFR 0х3А 0х5А Общий регистр флагов прерываний GIMSK 0х3В 0x5В Общий регистр маскирования прерываний SPL 0x3D 0x5D Указатель стека (младший байт) SPH 0х3Е 0х5Е Указатель стека (старший байт) SREG 0x3F 0x5F Регистр состояния Регистр состояния SREG микроконтроллеров AVR Регистр состояния содержит флаги условий микроконтроллеров AVR и располагается в области ввода/вывода по адресу $3F (адрес SRAM – $5F). После подачи сигнала сброса он инициализируется нулями. В микроконтроллерах AVR для обозначения результата выполнения операций используются восемь различных флагов: • разряд 0 (С) – флаг переноса (Carry); указывает на переполнение (перенос) после выполнения арифметической или логической операции; • разряд 1 (Z) – нулевой флаг (Zero); всегда устанавливается, если результат арифметической или логической операции равен нулю; сбрасывается, если результат операции не равен нулю; • разряд 2 (N) – флаг отрицательного результата (Negative); указывает на отрицательный результат после выполнения арифметической или логической операции; • разряд 3 (V) – флаг переполнения при вычислениях в дополнительных кодах (Two's complement Overflow); поддерживает арифметику дополнительных кодов (арифметика кодов с дополнением до двух); устанавливается, если при выполнении соответствующей операции Память программ как в микроконтроллерах AVR, так и в микроконтроллерах PIC реализована по технологии Flash–EPROM, которая подразумевает программирование пользователем и вытирание электрическим способом. Размер этой памяти варьируется в зависимости от микроконтроллера и обычно составляет несколько Кбайт командных слов. Флэш–память является энергонезависимой, то есть, сохраняет записанную в нее информацию даже после отключения питания микроконтроллера. Несмотря на то, что память этого типа – программируемая, для записи в нее используются только внешние аппаратные средства, поэтому с точки зрения программиста можно сказать, что память программ доступна только для чтения. Адресация команд в памяти программ реализуется с помощью специального регистра – счетчика команд, разрядность которого определяет допустимый размер этой памяти. Разрядность ячеек памяти программ, в зависимости от типа микроконтроллера, может составлять 14…16 бит. Кроме того, следует отметить, что в микроконтроллерах PIC в первых ячейках памяти программ (начиная с адреса 0x0000) содержатся векторы (адреса перехода) сброса и прерываний. Память EEPROM микроконтроллеров AVR Многие микроконтроллеры AVR оборудованы встроенной памятью EEPROM – электрически перезаписываемой энергонезависимой памятью. Хотя эта память и допускает запись, она редко используется для хранения программных переменных, поскольку, во-первых, медленнодействующая, и, во-вторых, имеет ограниченный (хотя и довольно большой) цикл перезаписи. Учитывая вышесказанное, память EEPROM используют, преимущественно, для хранения данных, которые не должны быть потеряны даже при потере питания. Это очень удобно, к примеру, при калибровке измерительных приборов, работающих под управлением микроконтроллеров, у которых в памяти EEPROM в процессе настройки сохраняются параметры корректировки. Благодаря этому, в большинстве случаев полностью отпадает необходимость в настроечных потенциометрах и триммерах. В отличие от флэш-памяти, для записи/чтения памяти EEPROM нет необходимости в специальном программаторе – эти операции доступны программно и допускают побайтную передачу данных с помощью регистра управления EECR, регистра данных EEDR и регистровой пары EEARL, EEARH, определяющей адрес ячейки памяти (см. табл. 1.1). Запись байта данных в память EEPROM осуществляется по следующей схеме: • удостовериться, что в разряде EEWE (разряд 1) регистра EECR находится лог. 0 (разрешение записи); • записать адрес ячейки EEPROM в регистр EEAR; • записать байт данных в регистр EEDR; • установить в лог. 1 разряд EEMWE (разряд 2) регистра EECR; • установить в лог. 1 разряд ЕЕWE (разряд 1) регистра EECR, чтобы активизировать процесс записи. По окончанию цикла программирования разряд EEWE аппаратно автоматически сбрасывается в лог. 0. Программа пользователя должна непрерывно опрашивать этот разряд, ожидая появления лог. 0, прежде чем приступить к программированию следующего байта. Чтение байта данных из памяти EEPROM осуществляется по такой схеме: • записать адрес ячейки EEPROM в регистр EEAR; • установить в лог. 1 разряд EERE (разряд 0) регистра EECR, чтобы активизировать процесс чтения; • по окончанию считывания разряда EERE аппаратное обеспечение считывает требуемый байт в регистр EEDR, после чего уже нет необходимости вновь опрашивать разряд EERE, поскольку считывание длится только один цикл такта системной синхронизации. Перед началом операции чтения программа пользователя должна постоянно опрашивать разряд EEWE и ждать появления лог. 0. Если во время программирования памяти EEPROM в соответствующий регистр будет записан новый адрес или данные, то еще продолжающийся процесс программирования будет прерван, и результат будет неопределенным! Обработка прерываний Прерывания – это вызовы определенных функций, генерируемые, главным образом, аппаратной частью микроконтроллера. В результате прерывания выполнение программы останавливается, и происходит переход к соответствующей подпрограмме обработки прерывания. Прерывания бывают внутренними и внешними. Источниками внутреннего прерывания являются встроенные модули микроконтроллера (например, таймер/счетчик или сторожевой таймер). Внешние прерывания вызываются сбросом (сигнал на выводе RESET) или сигналами предустановленного уровня на выводах INT. К примеру, в микроконтроллерах AVR за характер сигналов на выводах INT0/INT1, вызывающих прерывание, определяется с помощью разрядов регистра управления MCUCR: ISC00 (разряд 0), ISC01 (разряд 1) – для входа INT0; ISC 10 (разряд 2), ISC11 (разряд 3) – для входа INT1 (табл. 3.1 и табл. 3.2). Таблица 3.1. Выбор способа активизации прерывания по входу INT0 Разряд ISC01 Разряд 1SC00 Описание 0 0 Прерывание вызывается по уровню лог. 0 на входе INT0 1 0 Прерывание вызывается по ниспадающему фронту сигнала INT0 1 1 Прерывание вызывается по нарастающему фронту сигнала INT0 Таблица 3.2. Выбор способа активизации прерывания по входу INT1 Разряд Разряд Описание О состоянии прерывания сигнализирует соответствующий флаг, который устанавливается или сбрасывается в регистре флагов. Даже если в регистре маски прерываний установлен соответствующий отдельный разряд разрешения прерывания, то прерывания могут активизироваться только тогда, когда в регистре состояния SREG установлен разряд общего разрешения прерываний I (разряд 7). Если это имеет место, и наступает прерывание, то выполнение программы ответвляется по соответствующему адресу (см. табл. 1.4) и разряд общего разрешения прерываний I в регистре SREG сбрасывается в состояние лог. 0, блокируя тем самым последующие прерывания. Если требуется прервать подпрограмму другим прерыванием, то после входа в подпрограмму обработки прерывания программа пользователя должна установить флаг I в лог. 1. Вместе с входом в подпрограмму обработки прерывания аппаратно сбрасывается также и соответствующий флаг, вызвавший прерывание. Некоторые флаги прерываний могут быть сброшены самим пользователем посредством установки соответствующего флага в лог. 1. Регистр GIMSK Регистр GIMSK (рис. 3.1), расположенный в области ввода/вывода по адресу 0x003В (адрес в SRAM – 0x005В), используется для разрешения внешних прерываний. 7 6 5 4 3 2 1 0 INT1 INT0 – – – – – – Рис. 3.1. Структура регистра GIMSK микроконтроллеров AVR Если разряд INT1/INT0 установлен в лог. 1, то внешнее прерывание по входу INT1/INT0 будет разрешено до тех пор, пока установлен в лог. 1 разряд I в регистре состояния SREG. Регистр GIFR Состояние внешнего прерывания определяется по регистру GIFR (рис. 3.2), который расположен в области ввода/вывода по адресу 0х003А (адрес SRAM – 0х005А).+ 7 6 5 4 3 2 1 0 INTF1 INTF0 – – – – – – Рис. 3.2. Структура регистра GIFR микроконтроллеров AVR Флаг INTF1/INTF0 устанавливается в лог. 1, если возникает внешнее прерывание по сигналу на выводе INT1/INT0. При входе в подпрограмму обработки прерывания этот разряд переводится аппаратно в исходное состояние лог. 0. Регистры TIMSK и TIFR Регистр TIMSK (рис. 3.3), расположенный в области ввода/вывода по адресу 0x0039 (адрес в SRAM – 0x0059), используется для разрешения прерываний от таймеров/счетчиков. 7 6 5 4 3 2 1 0 TOIE1 OCIE1A OCIE1B – TICIE1 – TOIE0 – Рис. 3.3. Структура регистра TIMSK микроконтроллеров AVR Состояние прерываний, имеющих отношение к таймерам/счетчикам микроконтроллеров AVR, определяется по регистру TIFR (рис. 3.4), который расположен в области ввода/вывода по адресу 0x0038 (адрес SRAM – 0x0058). 7 6 5 4 3 2 1 0 TOV1 OCF1A OCF1B – ICF1 – TOV0 – Рис. 3.4. Структура регистра TIFR микроконтроллеров AVR Когда разряд TOIE1 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешено прерывание при переполнении Т/С1. В случае переполнения в регистре TIFR устанавливается флаг TOV1. Если разряд OCIE1A и разряд I в регистре состояния SREG установлены в лог. 1, то разрешено прерывание при совпадении содержимого регистра сравнения А с текущим состоянием Т/С1. В случае совпадения, в регистре TIFR устанавливается флаг OCF1 А. Если разряд OCIE1B и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при совпадении содержимого регистра сравнения В с текущим состоянием Т/С1. В случае совпадения, в регистре TIFR устанавливается флаг OCF1B. Если разряд TICIE1 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при выполнении условия захвата. Когда возникает срабатывание по захвату, в регистре TIFR устанавливается флаг ICF1. Если разряд TOIE0 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при переполнении таймера/счетчика Т/ СО. В таком случае, в регистре TIFR устанавливается флаг TOV0. Установка в лог. 1 одного из флагов в регистре TIFR приводит к переходу по соответствующему вектору прерывания. При входе в подпрограмму обработки прерывания, флаг в регистре TIFR аппаратно сбрасывается в лог. 0. Для микроконтроллеров AVR может быть выбран один из двух "спящих" режимов: • В ждущем режиме (Idle Mode) работа процессора приостанавливается, но таймер/счетчик, сторожевой таймер, система прерываний и тактирования остаются активными. Благодаря этому, центральный процессор может быть возвращен в обычный режим работы с помощью сторожевого таймера, таймера/счетчика или внешнего прерывания. • В режиме пониженного энергопотребления (Power Down Mode) системный осциллятор (а значит и весь микроконтроллер) находится в отключенном состоянии. В таком режиме с помощью внутреннего RC- генератора колебаний может включаться лишь сторожевой таймер со своим собственным обеспечением тактовой частотой. Активный сторожевой таймер по истечении времени задержки опять переводит микроконтроллер в нормальное состояние. Если сторожевой таймер также отключен, то в нормальное состояние его может перевести только внешний сигнал сброса или внешнее прерывание. Выбор одного из "спящих" режимов в микроконтроллерах AVR осуществляется с помощью разряда SM (разряд 4) регистра управления MCUCR. Если разряд SM установлен в лог. 1, то микроконтроллер переводится в режим пониженного энергопотребления последующей командой sleep, если же разряд SM сброшен в лог. 0, то последующей микроконтроллер переводится в ждущий режим в том случае, если ранее в регистре MCUCR был установлен разряд SE. Таймеры/счетчики Таймеры/счетчики – это, наиболее часто используемые модули микроконтроллеров. С их помощью можно измерять промежутки времени и частоту, определять ширину импульсов, вычислять скорость и т.д. Хотя они и используются для измерения времени, на самом деле речь идет об обычных двоичных счетчиках. В микроконтроллерах AVR и PIC используются как 8-ми, так и 16-ти разрядные таймеры/счетчики. Разрядность определяет момент переполнения счетчика (возврат в нулевое состояние). Так, для 8-разрядного счетчика переполнение наступает, когда счет достигает 255, а для 16-разрядного – 65535. Количество таймеров/счетчиков и их разрядность в микроконтроллерах отличается в зависимости от модели, и потому в данном разделе будут рассмотрены только общие вопросы, имеющие отношение к использованию таймеров/счетчиков. Если таймер/счетчик функционирует в качестве счетчика, то он подсчитывает число импульсов, поступающих на определенный вход микроконтроллера. В этом случае соответствующий вывод должен быть сконфигурирован в инициализационной части программы как вход. В случае использования в качестве таймера, частота тактирования таймера/счетчика является производной величиной от такта системной синхронизации внутреннего кварцевого осциллятора. При этом таймеры/ счетчики используют в качестве тактового сигнала разделенный такт системной синхронизации. Коэффициент деления предварительного делителя частоты может настраиваться индивидуально для каждого из таймеров с помощью мультиплексора, управляемого разрядами из регистра управления таймера/счетчика. Таймеры/счетчики микроконтроллеров AVR В микроконтроллерах AVR могут использоваться следующие таймеры/ счетчики: • 8-ти или 16-ти разрядный Т/С0; • 16-разрядный Т/С1; • 8-ми или 16-ти разрядный Т/С2. Регистры управления в этом случае называются TCCR0, TCCR1 и TCCR2 (расположены в области ввода/вывода), а режим работы и коэффициент деления частоты осциллятора определяется с помощью разрядов CSx2, CSxl и CSx0 этих регистров. К примеру, для таймеров/ счетчиков Т/С0 и Т/С1 выбор режима и входного такта можно определить с помощью комбинаций разрядов, представленных в табл. 4.1. Таблица 4.1. Выбор режима и входного такта для Т/С0 и Т/С1 CSx2 CSx1 CSxO Описание 0 0 0 Останов 0 0 1 Режим "Таймер", такт = такт системной синхронизации 0 1 0 Режим "Таймер", такт = такт системной синхронизации / 8 0 1 1 Режим "Таймер", такт = такт системной синхронизации / 64 1 0 0 Режим "Таймер", такт = такт системной синхронизации / 256 1 0 1 Режим "Таймер", такт = такт системной синхронизации /1024 1 1 0 Режим "Счетчик", такт – внешний на входе Т0 (Т1), активный фронт сигнала – ниспадающий 1 1 1 Режим "Счетчик", такт – внешний на входе Т0 (Т1), активный фронт сигнала – нарастающий Для Т/С2 комбинации разрядов CS22, CS21 и CS20 могут иметь разное значение для различных моделей микроконтроллеров. Т/С0 Схема работы таймера/счетчика Т/С0, представлена на рис. 4.1. Как только с помощью разрядов CS00, CS01 и CS02 регистра TCCR0 (адрес 0x33 в области ввода/вывода, адрес 0x53 в SRAM) для делителя частоты будет установлена комбинация, отличная от 000, таймер/счетчик Т/ С0 по каждому импульсу, поступающему на тактовый вход, начинает увеличивать на единицу содержимое регистра TCNT0 (адрес 0x32 в области ввода/вывода, адрес 0x52 в SRAM). Когда состояние счетчика в регистре TCNT0 изменяется с 0xFF на 0x00, в регистре TIFR (адрес 0x38 в области ввода/вывода) устанавливается флаг переполнения TOV0. Таблица 4.2. Возможные варианты для работы в режиме сравнения СОМ1х1 СОМ1Х0 Действия в случае совпадения 0 0 Выходное значение отсутствует 0 1 При совпадении ОС1х переключается в другое состояние 1 0 При совпадении на выходе ОС1х устанавливает лог. 0 1 1 При совпадении на выходе ОС1х устанавливает лог. 1 В случае активизации режима ШИМ, разряды 4…7 в регистре TCCR1А имеют значения, отличные от указанных в табл. 1.6. Когда регистр управления TCCR1A определяет работу в конфигурации широтно- импульсного модулятора, то Т/С1 работает как суммирующий и вычитающий счетчик, осуществляя циклические переходы от 0x0000 к максимальному значению ТОР, и затем снова возвращаясь к 0x0000. При запрограммированной разрешающей способности ШИМ в N разрядов значение ТОР рассчитывается как: Частота fШИМ, с которой повторяются циклы ШИМ, вычисляется по формуле: причем частота таймера/счетчика fT/ci выбирается с помощью разрядов CSIO–CS 12 регистра TCCR1B, а разрешающая способность N – с помощью разрядов PWM10 и PWM11 регистра TCCR1A. Соответствующие взаимосвязи показаны в табл. 4.3. Таблица 4.3. Выбор режима ШИМ (PWM11 и PWM10) PWM11 PWWI10 Разрешающая способность Значение ТОР Частота ШИМ 0 0 Режим ШИМ не активен 0 1 8 разрядов 0x00FF (255) fT/С1 /510 1 0 9 разрядов 0x01FF (511) fT/С1 /1022 1 1 10 разрядов 0x03FF(1023) fT/С1 /2046 Когда состояние счетчика в регистре TCNT1 совпадает со значением 10 младших разрядов регистра OCR1A/OCR1B, то, в зависимости от состояния разрядов СОМ1А1/СОМ1А0 или СОМ1В1/СОМ1В0 регистра TCCR1A, вывод ОС1А/ОС1В последующим тактовым импульсом устанавливается или сбрасывается. Соответствующие взаимосвязи показаны в табл. 4.4. Таблица 4.4. Возможности выбора для режима сравнения СОМ1х1 СОМ1х0 Действие в случае совпадения 0 0 На выводе ОС1х нет никакого сигнала 0 1 На выводе ОС1х нет никакого сигнала 1 0 Неинвертирующий широтно-импульсный модулятор. В случае соответствия, при суммирующем подсчете на выводе ОС1х устанавливается лог. 0, а при подсчете с вычитанием – лог. 1 1 1 Инвертирующий широтно-импульсный модулятор. В случае соответствия, при суммирующем подсчете на выводе ОС1х устанавливается лог. 1, а при подсчете с вычитанием –лог. 0 В случае неинвертирующего широтно-импульсного модулятора, коэффициент заполнения g прямоугольного сигнала на выводе с ШИМ соответствует значению n / (2N - 1), где n – значение в соответствующем регистре OCR, a N – разрешающая способность ШИМ в разрядах (рис. 4.4). Рис. 4.4. Определение периода Т, коэффициента заполнения g и среднего арифметического UAV прямоугольных импульсов напряжения U Если регистр сравнения OCR1A/OCR1B содержит значение ТОР или 0, то на соответствующем выводе, в соответствии с правилами, представленными в табл. 4.5, постоянно поддерживаются уровень лог. 0 или лог. 1. На рис. 4.5. на примере фиктивной трехразрядной ШИМ показано формирование неинвертированного и инвертированного выходного ШИМ – сигнала на выходе ОС1В. На диаграмме А показан примерный вид ступенчатого сигнала, соответствующий состоянию счетчика TCNT1, на диаграмме В – неинвертированный, а на диаграмме С – инвертированный выходной сигнал. Продолжительность периода TPWM в этом случае вычисляется в соответствии с рассмотренным выше уравнением TPWM = TT/C1 * (2N+1 - 2). Таким образом, при N=3 период ШИМ-сигнала состоит из 14 периодов тактового сигнала fT/C1 на входе TCNT1. Таблица 4.5. Вывод ШИМ для особых случаев СОМ1х1 СОМ1хО OCR1X Вывод ОС1х 1 0 0 0 1 0 ТОР 1 1 1 0 1 1 1 ТОР 0 импульсов он может использовать генератор, независимый от системного. Для управления Т/С2 используются два регистра: ASSR (рис. 4.7) и TCCR2 (рис. 4.8). 7 6 5 4 3 2 1 0 – – – – AS2 TCN2UB OCR2UB TCR2UB Рис. 4.7. Регистр ASSR таймера/счетчика Т/С2 Если установить в лог. 1 разряд AS2, то в качестве источника тактовых импульсов можно использовать внешний осциллятор. Оставшиеся три разряда (0-2) используются в программах для проверки того, что данные не записываются в регистры Т/С2 в тот момент, когда они обновляются аппаратно. Такая проверка необходима по той причине, что осциллятор Т/С2 работает асинхронно по отношению к системному осциллятору. 7 6 5 4 3 2 1 0 – PWM2 COM21 COM20 CTC2 CS22 CS21 CS20 Рис. 4.8. Регистр TCCR2 таймера/счетчика Т/С2 Установка в лог. 1 разряда PWM2 переводит Т/С2 в режим ШИМ. Назначение разрядов COM21 и СОМ20 идентично назначению разрядов COM lxl и СОМ 1x0 таймера/счетчика Т/С1 – выбор режима сравнения на выходе. Разряд СТС2 определяет, должен ли счетчик сбрасываться в нуль при совпадении его содержимого с регистром сравнения. Разряды 0 – 2 определяют частоту тактового сигнала, полученного с помощью предварительного делителя частоты такта системной синхронизации. Таймеры/счетчики микроконтроллеров PIC Описанное выше применение таймеров/счетчиков микроконтроллеров AVR справедливо также и для таймеров микроконтроллеров PIC. Здесь используются аналогичные принципы измерения ширины и частоты импульсов, а также широтно-импульсной модуляции, режимов сравнения и захвата. В микроконтроллерах PIC могут использоваться три таймера: TMR0, TMR1 и TMR2. TMR0 TMR0 (рис. 4.9) – это 8-разрядный таймер/счетчик. Таким образом, счет для него ограничен диапазоном 0-255. Его тактирование реализуется от внешнего источника или на основании такта системной синхронизации. Рис. 4.9. Схема таймера/счетчика TMR0 Для управления работой таймера TMR0 используются следующие разряды регистра OPTION_REG: • разряд 5 – T0CS – определяет выбор источника синхроимпульсов (0 – внутренний; 1 – внешний на входе TOCKI); • разряд 4 – T0SE – определяет выбор фронта, по которому происходит увеличение содержимого счетного регистра TMR0 (0 – по нарастающему; 1 – по ниспадающему фронту тактового сигнала); • разряд 3 – PSA – использование предварительного делителя частоты (0 – делитель используется для управления таймером TMR0; 1 – для управления сторожевым таймером); • разряды 0-2 – PS0, PS1, PS2 – выбор коэффициента деления частоты входного тактового сигнала (табл. 4.6). Таблица 4.6. Назначение разрядов PSO - PS2 регистра OPTIONJREG PS2 PS1 PSO Коэффициент деления частоты входного тактового сигнала 0 0 0 2 0 0 1 4 0 1 0 8 0 1 1 16 1 0 0 32 1 0 1 64 1 1 0 128 1 1 1 256 Для управления прерываниями от таймера TMR0 используются следующие разряды регистра INTCON: • разряд 2 – TOIF – флаг прерывания при переполнении TMR0; • разряд 5 – TOIE – флаг разрешения прерывания при переполнении TMR0; • разряд 7 – GIE – флаг общего разрешения прерываний. TMR1 Регистр PIE1: • разряд 0 – TMR1IE – флаг разрешения прерывания при переполнении TMR1; • разряд 2 – ССР НЕ – флаг разрешения прерывания при возникновении захвата по" входу. TMR2 Назначение таймера TMR2 (рис. 4.13) – измерение временных интервалов для реализации ШИМ, обеспечения определенной скорости обмена по последовательному порту и т.п. В этом смысле он подобен таймеру TMR0. Таймер TMR2 тактируется импульсами, следующими с частотой такта системной синхронизации, деленной на четыре. Каждый раз, когда содержимое счетного регистра TMR2 совпадает с содержимым регистра PR2, таймер автоматически сбрасывается в исходное (нулевое) состояние. Рис. 4.13. Схема таймера/счетчика TMR2 При каждом совпадении TMR2 и PR2 генерируется запрос на прерывание, частоту возникновения которого можно также масштабировать с помощью выходного делителя частоты. Для управления таймером TMR2 используется регистр T2CON (рис. 4.14). 7 6 5 4 3 2 1 0 – TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 Рис. 4.14. Регистр T2CON микроконтроллеров PIC Назначение отдельных разрядов регистра T2CON: • T2CKPS0-T2CKPS1 –управление предварительным делителем частоты (табл. 4.8); • TMR20N – подключение таймера (0 – отключен, 1 – включен); • TOUTPS0-TOUTPS3 – выбор коэффициента деления частоты запросов на прерывание при TMR2::=:PR2 (табл. 4.9). Таблица 4.8. Назначение разрядов T2CKPS0 - T2CKPS1 регистра T2CON T1CKPS1 T1CKPS0 Коэффициент деления частоты тактового сигнала 0 0 1 0 1 4 1 X 16 Таблица 4.9. Назначение разрядов TOUTPS0 - TOUTPS3 регистра T2CON TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 Коэффициент деления частоты запросов 0 0 0 0 1 0 0 0 1 2 0 0 1 0 3 0 0 1 1 4 0 1 0 0 5 о 1 0 1 6 0 1 1 0 7 0 1 1 1 8 0 0 0 9 0 0 1 10 0 1 0 11 0 1 1 12 1 0 0 13 1 0 1 14 1 1 0 15 1 1 1 16 Для организации прерываний используются разряды TMR2JE (флаг разрешения) и TMR2IF (флаг прерывания) регистров PIE1 и PIR1 соответственно. Для того чтобы эффективно использовать таймер TMR2, используются следующие формулы: где Т – требуемая временная задержка, К1 – коэффициент деления предварительного делителя частоты; К2 – коэффициент деления делителя частоты запросов на прерывание; PR2 – содержимое регистра PR2; F – частота системной синхронизации. Модуль ССР Таймеры TMR1 и TMR2 микроконтроллеров PIC применяются в составе модуля сравнения/захвата/ШИМ – ССР (Compare-Capture-PWM). Таких модулей может быть два: ССР1 и ССР2, – управление которыми реализовано с помощью регистров CCPxCON (рис. 4.15), 7 6 5 4 3 2 1 0 – – DC1BX1 DC1BX0 CCP1M3 CCP1M2 CCP1M1 CCP1M0 Рис. 4.15. Регистр CCPxCON микроконтроллеров PIC Назначение отдельных разрядов регистра CCPxCON: ССР1М0 – ССР1МЗ – выбор режима захвата/сравнения (табл. 4.9) DC1ВХ0 – DC1ВХ1 – два младших разряда 10-разрядной ШИМ. Таблица 4.9. Назначение разрядов ССР1М1 -ССР1МЗ регистра CCPxCON ССР1МЗ ССР1М2 ССР1М1 ССР1М0 Значение 0 0 X X Модуль ССР отключен 0 1 0 0 Захват по каждому ниспадающему фронту 0 1 0 1 Захват по каждому нарастающему фронту 0 1 1 0 Захват по каждому 4-му нарастающему фронту 0 1 1 1 Захват по каждому 16-му нарастающему фронту 1 0 0 0 В случае совпадения на выходе – высокий уровень 1 0 0 1 В случае совпадения на выходе – низкий уровень 1 0 1 0 В случае совпадения – запрос на прерывание 1 0 1 1 Особый случай режима сравнения 1 0 1 32 512 мс 1,5с 1 1 0 64 1 с Зс 1 1 1 128 2,1 с 6с В системе команд AVR сторожевой таймер сбрасывается в исходное состояние по команде wdr. В микроконтроллерах PIC для управления сторожевым таймером предназначен рассмотренный выше регистр OPTION. Для этого разряд PSA должен быть установлен в лог. 1, чтобы предварительный делитель частоты был переключен на использование совместно со сторожевым таймером, а не с TMR0. Коэффициент деления выбирается с помощью разрядов PS2-PS0 (табл. 5.2). В отличие от микроконтроллеров AVR, в микроконтроллерах PIC отсутствует возможность включать/отключать сторожевой таймер с помощью регистра управления. Единственный способ предотвратить сброс от сторожевого таймера – периодически выполнять ассемблерную команду clrwdt. Таблица 5.2. Выбор коэффициента деления частоты следования сигналов сброса от сторожевого таймера в микроконтроллерах PIC PS2 PS1 PS0 Коэффициент деления Период до сброса 0 0 0 1 18 мс 0 0 1 2 36 мс 0 1 0 4 72 мс 0 1 1 8 144 мс 1 0 0 16 288 мс 1 0 1 32 576 мс 1 1 0 64 1,2 с 1 1 1 128 2,3 с 2. Параллельные порты ввода/вывода Параллельные порты – это особые устройства ввода/вывода, позволяющие передавать во внешний мир или принимать одновременно восемь разрядов данных. Для обозначения портов используются латинские буквы А, В, С и т.д. Количество портов ввода/вывода варьируется в зависимости от модели микроконтроллера. В микроконтроллерах AVR каждому параллельному порту ввода/ вывода поставлены в соответствие три регистра (букве х соответствует имя порта А, В и т.д.): • DDRx – регистр направления передачи данных – определяет, является тот или иной вывод порта входом или выходом; если некоторый разряд регистра DDRx содержит лог. 0, то соответствующий вывод порта сконфигурирован как вход, в противном случае – как выход; • PORTx – регистр порта – если вывод выполняет роль выхода, то в соответствующий разряд записывается значение, предназначенное для вывода; если вывод выполняет роль входа, то лог. 0 в некотором разряде регистра PORTx соответствует высокоомный вход, а лог. 1 – вход, нагруженный подтягивающим сопротивлением; • PINx – регистр выводов порта – в отличие от регистров DDRx и PORTx доступен только для чтения и позволяет считать входные данные порта на внутреннюю шину микроконтроллера. Выводы портов зачастую выполняют различные альтернативные функции при работе с внутренними и периферийными модулями микроконтроллеров AVR. Так, к примеру, в некоторых моделях в качестве внешних тактовых входов таймеров/счетчиков Т/С0 и Т/С1 используются разряды 0 и 1 порта В или 4 и 5 порта D. Точное назначение выводов портов следует сверять по спецификации микроконтроллера. В микроконтроллерах PIC каждому параллельному порту ввода/вывода поставлены в соответствие два регистра: • PORTx – регистр данных порта; • TRISx – регистр направления передачи данных через выводы порта (лог. 1 в некотором разряде этого регистра соответствует режим ввода, а лог. 0 – режим вывода). В микроконтроллерах PIC серии 18Сх порт D может работать в режиме управляемого параллельного порта PSP (Parallel Slave Port). Это означает, что он действует как регистр, который может быть подключен к шине другого микроконтроллера, обмениваясь с ним данными. В режиме PSP, как и в случае обмена данными с любым периферийным устройством, используются сигналы RD (чтение), WR (запись) и CS (выбор кристалла) – разряды 0-2 порта Е (пример – рис. 6.1). Рис. 6.1. Пример подключения внешнего микроконтроллера PIC в режиме PSP Для управления режимом PSP используется регистр TRISE (рис. 6.2). 7 6 5 4 3 2 1 0 IBF OBF IBOV PSPMODE – TRISE2 TRISE1 TRISE0 Рис. 6.2. Регистр TRISE микроконтроллеров PIC Режим PSP активизируется путем установки в лог. 1 разряда PSPMODE. Прерывания разрешаются установкой в лог. 1 разряда PSPIE (разряд 7) регистра PIE1, а запросы формируются в разряде PSPIF (разряд 7) регистра PIR1. С помощью разрядов 0-2 регистра TRISE осуществляется выбор режима для соответствующих разрядов порта Е. Когда на линиях CS и RD (выводы RE2 и RE0) одновременно появляется низкий уровень сигнала, содержимое регистра OUTREG выводится через порт D. При записи в регистр OUTREG устанавливается в лог, 1 разряд OBF регистра TRISE – это означает, что выходной буфер заполнен данными. После передачи данных разряд OBF автоматически сбрасывается в лог. 0. Когда на линиях CS и WR (выводы RE2 и RE1) одновременно появляется низкий уровень сигнала, осуществляется прием данных через порт D. Принятая величина сохраняется в регистре INREG, при этом автоматически устанавливается в лог. 1 разряд IBF регистра TRISE. После программного считывания содержимого регистра INREG этот разряд по завершению приема через UART. Если разряд TXCIE и разряд общего разрешения прерываний I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание по завершению передачи через UART. Если разряд UDRIE и разряд общего разрешения прерываний I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание по опустошению регистра данных UART. Если разряд RXEN установлен в лог. 1, то происходит разблокирование приемника, и вывод 0 порта D становится входом UART. Если разряд RXEN содержит лог. 0, то принимающий элемент приемопередатчика UART блокируется, и вывод 0 порта D может использоваться в качестве обычного входа/выхода. Если разряд RXEN содержит лог. 0, то флаги OR и FE регистра состояния USR не могут быть установлены. Если эти флаги все же установлены, то они с помощью RXEN не сбрасываются. Если разряд TXEN установлен в лог. 1, то происходит разблокирование передатчика, а вывод 1 порта D становится выходом UART. Если разряд TXEN содержит лог. 0, то передающий элемент UART блокируется, и вывод 1 порта D может использоваться в качестве обычного входа/выхода. Если разряд TXEN во время процесса передачи устанавливается в лог. 0, то передатчик не блокируется до тех пор, пока текущий символ в сдвиговом регистре, а также символ, возможно, ожидающий на передачу в регистре UDR не будут полностью переданы. Если разряд CHR9 установлен в лог. 1, то слова данных, подлежащие передаче/считыванию имеют длину 11 бит (9 разрядов данных плюс стартовый и стоп-бит). Девятый бит из разряда ТХВ8 при передаче попадает в UCR, а при приеме – в разряд RXB8 регистра UCR. Девятый бит может быть использован для размещения дополнительных информационных данных, например, в качестве бита четности или второго стоп-бита. Если разряд CHR9 установлен в лог. 0, то слова данных, подлежащие передаче/ считыванию имеют длину 10 бит (8 разрядов данных плюс стартовый и стоп- бит). 7 6 5 4 3 2 1 0 RXC TXC UDRE FE OR – – – Рис. 7.3. Регистр состояния USR микроконтроллеров AVR Регистр состояния USR информирует программу пользователя о состоянии приемопередатчика UART. Флаг RXC устанавливается в лог. 1, если принятое слово данных было перенесено из сдвигового регистра в регистр UDR (без учета возможных ошибок кадрирования, которые могли возникнуть во время передачи данных). После чтения регистра UDR флаг RXC автоматически сбрасывается в лог. 0. Флаг ТХС будет установлен в лог. 1, если символ в сдвиговом регистре был передан полностью (то есть, включая стоп-бит), и из регистра UDR не ожидается новый байт данных. Флаг очень полезен в полудуплексном режиме работы, когда непосредственно после передачи необходимо переключиться в режим приема. При входе в подпрограмму обработки прерывания флаг завершения передачи ТХС аппаратно сбрасывается в лог. 0. Флаг UDRE устанавливается в лог. 1, если содержимое регистра UDR было перенесено в сдвиговой регистр. С его помощью пользователь получает уведомление о том, что приемопередатчик готов к передаче нового байта. Соответствующая подпрограмма обработки прерывания выполняется до тех пор, пока установлен флаг UDRE. Флаг UDRE сбрасывается при записи байта данных в регистр UDR. В случае сброса при включении питания флаг UDRE устанавливается в лог. 1, чтобы показать, что приемопередатчик готов к передаче нового байта данных. Флаг FE устанавливается в лог. 1 при обнаружении ошибки кадрирования. Это происходит, если при трех сканированиях стоп-бита был более одного раза обнаружен лог. 0, и тем самым стоп-бит был распознан как сигнал низкого уровня. Флаг FE сбрасывается, когда стоп-биту соответствует сигнал высокого уровня. Пользовательская программа должна постоянно проверять флаг FE перед чтением регистра UDR, чтобы можно было распознать потенциально некорректный символ в регистре приема. 7 6 5 4 3 2 1 0 CSRC TX9 TXEN SYNC – BRGH TRMT TX9D Рис. 7.4. Регистр TXSTA микроконтроллеров PIC В отличие от приемопередатчика UART микроконтроллеров AVR, устройство USART может обмениваться данными не только в асинхронном, но и в синхронном режиме. В этом случае поразрядный сдвиг данных из сдвигового регистра в линию передачи (или наоборот) осуществляется по синхроимпульсам самого приемопередатчика USART или внешнего устройства. Выбор режима работы USART осуществляется с помощью разряда SYNC регистра TXSTA (1 – синхронный режим; 0 – асинхронный режим), а выбор источника тактовых импульсов в синхронном режиме – с помощью разряда CSRC (1 – внутренний источник; 0 – внешний источник). Назначение остальных разрядов регистра TXSTA: • TX9D – девятый бит передаваемых данных, если ТХ9 = 1; • TRMT – флаг, сигнализирующий о завершении передачи байта; • TXEN – флаг разрешения передачи данных; • ТХ9 – разрешение (лог. 1) передачи данных в девятиразрядном формате. 7 6 5 4 3 2 1 0 SREN RX9 SREN CREN ADDEN FERR OERR RX9D Рис. 7.5. Регистр RCSTA микроконтроллеров PIC Назначение разрядов регистра RCSTA: • RX9D – девятый бит принимаемых данных, если RX9 = 1; • OERR – флаг, указывающий на переполнение буфера приема; • FERR – флаг, указывающий на обнаружение ошибки в формате принимаемых данных; • ADDEN – разрешение обнаружения адреса в асинхронном режиме передачи девяти бит данных– в некоторых микроконтроллерах PIC приемник USART может использоваться для приема сразу двух байтов в формате "данные:адрес", где адрес предназначен для идентификации устройства, связанного с шиной данных (в таком случае подпрограмма обработки прерывания вначале проверит адрес запрошенного устройства и только потом обработает байт данных); • CREN – разрешение режима непрерывного приема; • SREN – флаг разрешения однократного приема в синхронном режиме (после приема данных автоматически сбрасывается в лог. 0); • RX9 – флаг разрешения приема девяти бит данных; • SREN – флаг активизации USART (для передачи битов данных используется вывод 6 порта С, а для приема – вывод 7 того же порта). Флаги запросов (TXIF и RCIF) и разрешения (TXIE и RCIE) прерываний от USART находятся в регистрах PIR и PIE. Синхронная передача данных по интерфейсу SPI Интерфейс SPI (Serial Peripheral Interface) служит для обмена данными с периферийными устройствами. В качестве таких устройств могут выступать простые сдвиговые регистры или буквенно-цифровые модули индикации, а также сложные микропроцессорные системы или системы регистрации данных. Многие компании-изготовители предлагают большой выбор устройств с интерфейсом SPI. В случае обмена данными по интерфейсу SPI микроконтроллер работает в режиме ведущего устройства (Master), взаимодействуя с одним или несколькими ведомыми блоками (Slave). Схема передачи данных по интерфейсу SPI микроконтроллеров AVR/PIC показана на рис. 7.6 (MSB – старший разряд, a LSB – младший разряд передаваемого байта). интерфейса SPI). Этот флаг указывает на завершение передачи, и приводит к запросу на прерывание как только в регистре управления SPCR будет установлен разряд SPIE, а в регистре состояния SREG – флаг общего разрешения прерываний I. Разряд SPE активизирует интерфейс SPI (лог. 1) или отключает его (лог. 0). После поступления сигнала сброса этот разряд принимает значение лог. 0, и тем самым система SPI отключается. Если разряд DORD содержит лог. 0, то сначала будет передан старший разряд байта данных. При DORD = 1 первым передается младший разряд. Когда разряд MSTR содержит лог. 0, то система SPI определяется как ведомая (Slave), а при MSTR = 1 она будет определена как ведущая (Master). Когда линия /SS в режиме Master сконфигурирована как вход, то разряд MSTR при низком уровне сигнала на выводе /SS сбрасывается в лог. 0, и тем самым интерфейс SPI определяется как Slave. В этом случае в регистре состояния устанавливается флаг SPIF. Когда разряд CPOL содержит лог. 0, то на выходе SCK в неактивном состоянии находится сигнал низкого уровня. Если CPOL = 1, то на SCK в неактивном состоянии находится сигнал высокого уровня. С помощью этого разряда, а также разряда СРНА (выбор фазы синхронизации) устанавливается один из четырех режимов передачи данных по интерфейсу SPI (табл. 7.3). Разряды SPR1 и SPR0 при работе интерфейса SPI в режиме Master служат для выбора тактовой частоты для линии SCK. Если система SPI сконфигурирована как Slave, то эти разряды не имеют никакого значения. Взаимосвязь между разрядами SPR1, SPR0 и частотой импульсов в линии SCK показана в табл. 7.4. Таблица 7.3. Режимы передачи данных по интерфейсу SPI в МК AVR CPOL СРНА Описание режима 0 0 Master переводит линию /SS в состояние лог. 0. Для соответствующего ведомого блока передача начинается по ниспадающему фронту этого сигнала. Его выход MISO переходит из высокоомного в активное состояние, и старший разряд байта, находящегося в его регистре данных SPDR, появляется на выходе MISO. Собственно передачу данных Master начинает записью подлежащего передаче байта данных в свой регистр SPDR. Вслед за этим на выходе MOSI ведущего блока появляется старший разряд. На протяжении первой половины первого тактового импульса тактовая линия еще остается в состоянии покоя для того, чтобы обеспечить стабильную установку на соответствующем входе бита данных. По нарастающему фронту первого и каждого последующего тактового импульса принимаются биты, расположенные на входах Master и Slave, а по ниспадающему фронту следующий бит сдвигается дальше. После восьмого тактового импульса передача данных завершена, флаги SPIF в регистрах состояния ведущего и ведомого блоков установлены, а содержимое сдвиговых регистров будут перенесено в соответствующие приемные буферы. Выход MOSI ведущего блока возвращается в состояние покоя (лог. 1), а на выходе MISO ведомого блока, как правило, находится старший разряд байта, только что принятого ведущим блоком. Одновременно со сбросом линии /SS в исходное состояние (лог. 1) Master завершает передачу, Slave становится неактивным, а его выход MISO переходит в высокоомное состояние 0 1 Аналогично описанному выше случаю с той разницей, что состояние покоя тактовой линии здесь устанавливается при лог. 1, биты данных принимаются по первому и каждому последующему тактовому импульсу, а сдвиг осуществляется по нарастающему фронту сигнала 1 0 Для того чтобы при этом режиме начать передачу данных, Master, как и в первом случае, переводит линию /SS в состояние лог. 0. Блок Slave разблокирован, и его выход MISO переходит из высокоомного в активное состояние. Логический уровень на MISO для этого случая не определен, но, как правило, на MISO находится младший разряд байта, переданного во время предыдущей передачи от Slave к Master. Собственно передачу данных Master в этом режиме начинает посредством записи байта данных, подлежащего передаче, в регистр SPDR. Для ведомого блока передача начинается по нарастающему фронту тактового сигнала. Старшие разряды подлежащих передаче байтов в ведущем и ведомом блоках с помощью нарастающего фронта первого тактового импульса устанавливаются на выходе MOSI ведущего блока (выходе MISO ведомого блока). По ниспадающему фронту первого и каждого последующего тактового импульса они переносятся на входы Master и Slave, а по нарастающему фронту следующий разряд сдвигается. После восьмого тактового импульса передача данных завершается, устанавливаются флаги SPIF в регистрах состояния интерфейсов Master и Slave, а содержимое их сдвиговых регистров переносится в соответствующие буферы приема. Выход MOSI ведущего блока возвращается в состояние покоя (лог. 1), на выходе MISO ведомого блока остается младший разряд байта, только что переданного ведущему блоку. Одновременно с возвратом в исходное состояние линии /SS (лог. 1) Master завершает передачу в целом, Slave становится неактивным, а его выход MISO переходит в высокоомное состояние. 1 1 Аналогично описанному выше случаю стой разницей, что состоянием покоя тактовой линии здесь является лог. 1, а биты данных сдвигаются по ниспадающему фронту первого и каждого последующего тактового импульса, а принимаются по нарастающему фронту Таблица 7.4. Частота импульсов в линии SCK в зависимости от разрядов SPR1, SPR0 SPR1 SPR0 Частота импульсов в линии SCK 0 0 Частота системной синхронизации / 4 0 1 Частота системной синхронизации /16 1 0 Частота системной синхронизации / 64 1 1 Частота системной синхронизации /128 Регистр состояния SPSR интерфейса SPI в микроконтроллерах AVR расположен в области ввода/вывода по адресу 0х0Е (0x2E в SRAM). В этом регистре используются только разряды 6 и 7: • разряд 6 – флаг WCOL – устанавливается в том случае, когда во время передачи данных через интерфейс SPI предпринимается попытка записи в регистр данных SPI, что приводит к разрушению только что переданного байта данных. По этой причине текущая передача данных доводится до завершения, а новый байт не записывается в сдвиговый регистр интерфейса SPI. Флаг WCOL должен быть сброшен пользователем вручную посредством считывания регистра состояния и последующего обращения к регистру данных интерфейса SPI; • разряд 7 – флаг SPIF – указывает на завершение передачи и вызывает запрос на прерывание, как только в регистре управления SPCR будет установлен разряд SPIE, а в регистре состояния SREG – разряд I. Когда линия /SS в режиме Master сконфигурирована как вход, то при низком уровне сигнала на выводе линии /SS также будет установлен флаг SPIF. Флаг SPIF сбрасывается автоматически аппаратной частью при выполнении Рис. 7.11. Подключение устройств к шине I2C Характеристики шины I2С: • работа только с двумя линиями, благодаря чему требуется меньше мест соединения и минимизируются затраты на проводку; • зона действия – до 3 м; • возможность работать в режиме с одним ведущим блоком (Single- Master) или с несколькими ведущими блоками (Multi-Master). Линия SCL используется для передачи синхроимпульсов. Если данные не передаются, она содержит высокий уровень сигнала. Линия SDA используется для побитной передачи данных. Если данные не передаются, то она имеет высокий потенциал. Передаваемые данные действительны в фазе высокого уровня такта и могут менять свое состояние только в фазе низкого уровня. Каждый блок, подсоединенный к шине, во время передачи данных может быть или приемником или передатчиком, а также ведущим (Master) или ведомым (Slave). Ведущее устройство инициирует передачу данных. В частности, Master занимает шину тем, что генерирует стартовый сигнал на линии SCL и начинает обмен с ведомым устройством. До тех пор, пока на шине работает ведущее устройство, не может быть активным никакой другой Master-блок. Ведомым является устройство, по адресу которого обращается ведущее устройство с требованием передачи данных. Теоретически Master может одновременно снабжать одними и теми же данными несколько ведомых устройств. В роли ведущего устройства в большинстве случаев выступает микропроцессор, оборудованный или специальной аппаратной частью с шиной типа I2С, или контроллером шины, работающим под управлением специального программного обеспечения. Протокол шины I2С Для того чтобы несколько блоков могли обмениваться данными, необходим некоторый протокол, который описывает процесс передачи данных по шине и в любой момент времени не допускает ошибочной интерпретации состояния шины. В случае шины с несколькими ведущими устройствами (что относится и к I2С) необходимо также установить, когда и какое ведущее устройство имеет право занимать шину. Эти условия регулируются протоколом шины (рис. 7.12). Рис. 7.12. Протокол передачи байта данных через шину I2C Работа шины и ее занятость, определяется условием начала передачи – изменение ведущим устройством состояние линии SDA с высокого уровня на низкий. После наступления условия начала передачи шина будет занята ведущим устройством, создавшим это условие, вследствие чего все другие ведущие устройства будут заблокированы. Условие начала является однозначным состоянием на шине, потому что смена уровня сигнала на линии SDA, как правило, допускается только тогда, когда тактовая линия SCL находится в состоянии низкого уровня. Все устройства, подключенные к шине, должны распознать условие начала передачи и переключаются на прием (ведомое устройство/приемник). Условие начала передачи также учитывается и другим ведущим устройством, которое со своей стороны имело намерение занять шину. В результате оно немедленно отзывает свое требование. Устройство, создавшее условие начала передачи, в данный момент времени является для шины ведущим (Master), а все остальные устройства – потенциальными ведомыми (Slave). Ведущее устройство теперь отвечает за тактовый сигнал и становится передатчиком. После создания условия начала ведущее устройство начинает передачу данных. Оно переводит тактовую шину в состояние низкого уровня и теперь может занять линию передачи данных затребованным информационным разрядом (высокий или низкий уровень в линии SDA). Затем тактовая шина опять переводится в состояние высокого уровня. Изменение в линии SDA может происходить только в фазе низкого уровня сигнала в линии SCL Во время фазы высокого уровня в линии SCL линия SDA должна быть стабильной. Передача данных, как правило, выполняется побайтно, при этом первым передается старший разряд. После передачи полного байта данных, состоящей из восьми тактовых циклов, следует бит подтверждения от приемника. Бит подтверждения (квитирования) – это реакция приемника на принятый байт данных. Он является для передатчика признаком того, что приемник физически присутствует и "прослушивает" линию. Одновременно с этим бит подтверждения можно рассматривать как сигнал синхронизации. Бит подтверждения, как правило, генерируется приемником. Если ведущее устройство принимает от ведомого устройства несколько байтов данных, то оно квитирует каждый отдельный байт битом подтверждения, за исключением последнего. Такое отрицательное квитирование сообщает ведомому устройству, что передача данных завершена, и далее последует условие завершения или новое условие начала передачи. Для передачи бита подтверждения ведущее устройство генерирует на линии SCL дополнительный тактовый импульс (рис. 7.13). Приемник выдает сигнал положительного квитирования, переводя линию SDA в состояние низкого уровня, или отрицательного квитирования, переводя линию SDA в состояние высокого уровня. Рис. 7.13. Выработка бита квитирования приемником, работающим в режиме ведомого устройства Таким образом, для передачи одного байта данных, как правило, требуется девять тактовых циклов. После передачи одного байта данных и приема бита подтверждения передача данных может быть сразу же продолжена. Если приемник реагирует на передачу байта данных невозможно установить связь (например, оно занято обработкой заданий, критическими с точки зрения времени). Работа с интерфейсом I2С в микроконтроллерах PIC Интерфейс I2C аппаратно реализован не во всех микроконтроллерах AVR, однако, благодаря высокому допустимому значению тактовой частоты, возможна его организация с помощью программного обеспечения. В микроконтроллерах PIC обмену данными по интерфейсу 12С соответствует особый режим работы порта MSSP. Линии SCL соответствует вывод 3 порта С, а линии SDA – вывод 4 того же порта. Для управления передачей в режиме I2С используются три регистра: уже рассмотренные выше SSPSTAT (рис. 7.8) и SSPCON1 (рис. 7.9), а также SSPCON2 (рис. 7.10). Назначение разрядов регистра SSPSTAT, имеющих отношение к 12С: • BF – флаг заполнения буфера данных; • UA – устанавливается в лог. 1 в том случае, если необходимо модифицировать адрес устройства (содержимое регистра SSPADD); • R/W – указывает на тип операции: 0 – запись, 1 – чтение; • S – устанавливается в лог. 1 при обнаружении условия начала передачи; • Р – устанавливается в лог. 1 при обнаружении условия завершения передачи; • D/A – признак переданного байта: 0 – байт адреса, 1 – байт данных. Назначение разрядов регистра SSPCON1, имеющих отношение к I2С: • SSPM0-SSPM3 – выбор режима работы порта MSSP (значения для интерфейса I С представлены в табл. 7.6); • СКР – установка этого разряда в лог. 1 разрешает тактирование; • SSPEN – флаг разрешения работы интерфейса; • SSPOV – флаг переполнения приемного буфера; • WCOL – флаг коллизий при записи (1 – запись новых данных в буферный регистр была произведена в момент передачи). Таблица 7.6. Выбор режима работы порта MSSP для интерфейса l2C SSPM3 SSPM2 SSPM1 SSPMO Режим 0 1 1 0 Режим Slave, используется 7-разрядный адрес 0 1 1 1 Режим Slave, используется 10-разрядный адрес 1 0 0 0 Режим Master, частота = F0sc / (4 (SSPADD + 1)) 1 0 1 1 Режим Master с программным управлением 1 1 1 0 Режим Slave, используется 7-разрядный адрес 1 1 1 1 Режим Slave, используется 10-разрядный адрес 7 6 5 4 3 2 1 0 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN Рис. 7.15. Регистр SSPCON2 микроконтроллеров PIC Назначение разрядов регистра SSPCON2: • SEN – устанавливается в лог. 1 для создания условия начала передачи; • RSEN – устанавливается в лог. 1 для создания повторных условий начала передачи; • PEN – сбрасывается в лог. О для создания условия окончания передачи; • RCEN – устанавливается в лог. 1 для разрешения режима приема; • ACKEN – инициирует последовательность битов квитирования; • ACKDT – устанавливается в лог. 1 для отправки подтверждения при приеме байта; • ACKSTAT – устанавливается в лог. 1 при получении подтверждения приема от ведомого устройства. Модуль шины CAN Когда осуществляется обмен данными между несколькими устройствами по одной общей шине, существует вероятность возникновения самых разнообразных ошибок. Кроме того, возникают сложности с адресацией. В системе, состоящей из двух устройств, все очень просто: одно устройство передает данные, а другое опрашивает шину и принимает данные. В случае же с несколькими устройствами, требуется определить, какое именно из них передает данные и какому из устройств, подключенных к общей шине. Все это обусловливает необходимость в некотором протоколе обмена данными. Протокол определяет метод адресации, проверку ошибок и общий формат данных для всех устройств, использующих шину. Один из таких протоколов – протокол CAN (Controller Area Network), поддерживаемый рядом микроконтроллеров семейства PIC18 и некоторыми последними разработками компании Atmel. 3. Аналого-цифровое преобразование Число в цифровой форме определяется на основании отношения входного напряжения к полному номиналу напряжения аналого-цифрового преобразователя (АЦП). Например, если на вход АЦП с номинальным напряжением 5 В подать напряжение 1 В„ то на цифровом выходе появится число, соответствующее 1/5=0,2 разрешающей способности преобразователя. Так, если используется АЦП с разрешением 8 бит, то максимальное возможное значение на его выходе 2 - 1 = 255. Таким образом, напряжению 1 В на аналоговом входе соответствует 0,2 - 255 = 51 на цифровом выходе. Встроенные АЦП микроконтроллеров AVR и PIC имеют разрешение 10 бит и позволяют считывать напряжение на одном из восьми (в некоторых моделях – пяти) аналоговых входов (обычно – порт А). В микроконтроллерах AVR для управления режимом АЦП используются два регистра: регистр управления ADCSR (рис. 8.1) и регистр мультиплексирования ADMUX (определяет, какие из восьми входов порта А ADCS1 ADCS0 Частота 0 0 Частота системной синхронизации / 2 0 1 Частота системной синхронизации / 8 1 0 Частота системной синхронизации / 32 1 1 Тактирование от встроенного RC-осциллятора АЦП (250 кГц) Максимальная допустимая рабочая частота АЦП микроконтроллеров PIC – 625 кГц. Это следует учитывать при выборе коэффициента деления частоты системной синхронизации. Использование внутреннего RC-осциллятора АЦП не рекомендуется для микроконтроллеров с частотой системной синхронизации выше 1 МГц. 7 6 5 4 3 2 1 0 ADFM – – – PCFG3 PCFG2 PCFG1 PCFG0 Рис. 8.3. Регистр ADC0N1 микроконтроллеров PIC Назначение разрядов регистра ADCON1; • PCFG0-PCFG3 – разряды конфигурации – определяют, какие выводы порта АЦП являются аналоговыми входами, а какие используются для подачи опорных напряжений Vref+ и Vref–; наиболее распространенная конфигурация: 0000, которая определяет все 8 выводов аналоговыми входами, а в качестве опорных напряжений – напряжения VDD и Vss; другие значения разрядов PCFG0-PCFG3 варьируются в зависимости от типа микроконтроллера; • ADFM – выбор разрешения преобразования: 1 – 10 бит; 0 – 8 бит. Результат преобразования сохраняется в регистровой паре ADRESL, ADRESH, причем в регистре ADRESH используются только младшие два разряда в случае преобразования с разрешением 10 бит. Таким образом, в общем случае процесс аналого-цифрового преобразования в микроконтроллерах PIC протекает следующим образом: • определить с помощью разрядов регистра ADCON1 конфигурацию преобразования; • установить разряды 6-7 регистра ADCON0 для выбора рабочей частоты АЦП; • установить разряды 3-5 регистра ADCON0 для выбора аналогового канала; • установить в лог. 1 разряды ADON и GO регистра ADCON0, чтобы начать преобразование; • дождаться окончания преобразования (лог. 0 в разряде DONE регистра ADCON0) и считать результат из регистровой пары ADRESLL, ADRESH. Встроенный аналоговый компаратор В ряде моделей микроконтроллеров AVR и PIC используется встроенный аналоговый компаратор напряжения, сравнивающий входное напряжение на двух входах. Как только напряжение на неинвентирующем входе станет больше, чем на инвентирующем, на выходе компаратора устанавливается лог. 1. Часто аналоговый компаратор используют для сравнения некоторого входного напряжения с опорным (рис. 8.4). Для активизации компаратора требуется предварительно перевести соответствующие выводы микроконтроллера в режим входов. Время срабатывания компараторов небольшое, поэтому с их помощью можно быстро формировать ответные реакции на изменение соотношений входных напряжений. В микроконтроллерах AVR входам компаратора AIN0 и AIN1 обычно соответствуют разряды 0/1 или 2/3 порта В. В микроконтроллерах PIC конфигурация входов компаратора (вывода порта А) настраивается с помощью разрядов регистра CMCON, о чем речь пойдет чуть позже. В микроконтроллерах AVR для управления работой аналогового компаратора используется регистр ACSR (рис. 8.5), расположенный в области ввода/вывода по адресу 0x08 (адрес 0x28 в SRAM). • режим программирования через интерфейс JTAG. Под “высоким” напряжением здесь понимается управляющее напряжение (12 В), подаваемое на вывод RESET микроконтроллера для перевода последнего в режим программирования. Режимы программирования для конкретного микроконтроллера представлены в табл. 9.1. Таблица 14.1. Режимы программирования микроконтроллеров семейства Mega Режим программирования ATm ega 8515 x/853 5x ATm ega 8x ATm ega 16x/3 2x ATm ega 64x/1 28x ATm ega 48x/8 8x/16 8x ATm ega 162x ATm ega 164x/ 324x ATm ega 644x ATm ega 165x ATmeg a 325x/3 250x, ATmeg a 645x/6 450x ATmega 640x, ATmega 1280x/128 1x, ATmega 2560x256 1x 1.Последовательное, по интерфейсу SPI + + + + + + + + + + 2. Параллельное, при высоком напряжении + + + + + + + + + + 3. По интерфейсу JTAG + + + + + + + Кроме того, микроконтроллеры семейства Mega имеют возможность самопрограммирования. Под этим термином понимается изменение содержимого памяти программ, управляемое самим микроконтроллером. В процессе программирования могут выполняться следующие операции: • стирание кристалла (chip erase); • чтение/запись FLASH-памяти программ; • чтение/запись EEPROM-памяти данных; • чтение/запись конфигурационных ячеек; • чтение/запись ячеек защиты; • чтение ячеек идентификатора; • чтение калибровочного байта. Все модели микроконтроллеров поставляются со стертой памятью программ и памятью данных (во всех ячейках находится число $FF) и пригодны к немедленному программированию. Защита кода и данных Содержимое FLASH-памяти программ, а также содержимое EEPROM- памяти данных может быть защищено от записи и/или чтения посредством программирования ячеек защиты (Lock Bits) LB1 и LB2. Возможные режимы защиты, соответствующие различным состояниям этих ячеек, приведены в табл. 8.2. Таблица 8.2. Режимы защиты № режима Ячейки защиты Описание LB1 LB2 1 1 1 Защита кода и данных отключена 2 0 1 Запись FLASH и EEPROM запрещена 3 0 0 Запрещены запись и чтение FLASH и EEPROM В режимах 2 и 3 запрещается также изменение конфигурационных ячеек. Поэтому включение защиты следует выполнять в самую последнюю очередь, после программирования остальных областей памяти микроконтроллера. Во всех микроконтроллерах семейства, кроме ATmega48x, имеется четыре дополнительные ячейки защиты — BLB02, BLB01, BLB12 и BLB11. Ячейки BLB02:BLB01 определяют уровень доступа из секции загрузчика к коду, расположенному в секции прикладной программы, а ячейки BLB12:BLB11, наоборот, определяют уровень доступа из секции прикладной программы к коду, расположенному в секции загрузчика. Отсутствие указанных ячеек в модели ATmega48x обусловлено отсутствием у последней выделенной секции загрузчика. Возможные режимы защиты, соответствующие различным состояниям этих ячеек, приведены в табл. 9.3 и табл. 9.4 соответственно. Таблица 9.3. Режимы защиты секции прикладной программы № режима Ячейки защиты Описание BLB02 BLB01 1 1 1 Нет никаких ограничений по доступу к коду, расположенному в секции прикладной программы 2 1 0 Команда SPM не может осуществлять запись по адресам, находящимся в пределах секции прикладной программы 3 0 0 Команда SPM не может осуществлять запись по адресам, находящимся в пределах секции прикладной программы, и команда LPM (ELPM), вызываемая из секции загрузчика, не может осуществлять чтение из секции прикладной программы. Если таблица векторов прерываний расположена в секции загрузчика, то при выполнении кода из секции прикладной программы прерывания запрещены 4 0 1 Команда lpm (elpm), вызываемая из секции загрузчика, не может осуществлять чтение из секции прикладной программы. Если таблица векторов прерываний расположена в секции загрузчика, то при выполнении кода из секции прикладной программы прерывания запрещены Таблица 9.4. Режимы защиты секции загрузчика № режима Ячейки защиты Описание BLB12 BLB11 1 1 1 Нет никаких ограничений по доступу к коду, расположенному в секции загрузчика 2 1 0 Команда SPM не может осуществлять запись по адресам, находящимся в пределах секции загрузчика 3 0 0 Команда SPM не может осуществлять запись по адресам, находящимся в пределах секции загрузчика, и команда LPM (ELPM), вызываемая из секции прикладной программы, не может осуществлять чтение из секции загрузчика. Если таблица векторов прерываний расположена в секции прикладной программы, то при выполнении кода из секции загрузчика прерывания запрещены 5 — 1 — 4 — 1 — 3 — 1 — 2 — 1 — 1 M103C 0 — 0 WDTON 1 SELFPRGE N * Значение бита. Таблица 9.6. Назначение конфигурационных ячеек Название Назначение RSTDISBL Определяет функционирование 1 вывода микроконтроллера, совмещенного с выводом аппаратного сброса (0 — контакт порта ввода/вывода, 1 — вывод сброса) CKSEL Определяет режим работы тактового генератора, а также длительность задержки сброса tTout BODLEVEL Определяет порог срабатывания схемы BOR BODEN Разрешает/запрещает функционирование схемы BOR (0 — разрешено, 1 — запрещено) SPIEN11) Разрешает/запрещает программирование по интерфейсу SPI (0 — разрешено, 1 — запрещено) SUT Определяет длительность задержки сброса tTout WDTON Определяет режим работы сторожевого таймера (0 — всегда включен, 1 — может быть выключен программно) СКОРТ Определяет функционирование тактового генератора, действие зависит от установок ячеек CKSEL EESAVE2) Определяет влияние команды “Стирание кристалла” на EEPROM-память 0 — не стирает, 1 — стирает) BOOTSZ Определяет размер секции загрузчика BOOTRST Определяет положение вектора сброса DWEN Разрешает/запрещает работу отладочного интерфейса debugWire (0 — разрешена, 1 — запрещена) OCDEN Разрешает/запрещает внутрисхемную отладку (0 — разрешена, 1 — запрещена) JTAGEN Разрешает/запрещает использование интерфейса JTAG (0 — разрешен, 1 — запрещен) CKDIV8 Определяет начальное состояние делителя системного тактового сигнала CKOUT Определяет состояние выходного буфера системного тактового сигнала (0 — подключен к выводу микроконтроллера, 1 — отключен) SELFPRGEN 3)) Разрешение самопрограммирования (0 — разрешено) S8515C Включает/выключает режим совместимости с микроконтроллерами AT90S4414/8515 семейства Classic (0 — включен, 1 — выключен) S8535C Включает/выключает режим совместимости с микроконтроллерами AT90S8535 семейства Classic (0 — включен, 1 — выключен) М161С Включает/выключает режим совместимости с микроконтроллерами ATmega 161х семейства Mega (0 — включен, 1 — выключен) М103С Включает/выключает режим совместимости с микроконтроллерами ATmega 103x семейства Mega (0 - включен, 1 - выключен) 1) Недоступна при программировании по последовательному каналу 2) Изменение состояния этой ячейки вступает в силу сразу же после ее программирования. 3)Только в ATmega48x. Идентификатор Все микроконтроллеры фирмы Atmel имеют три 8-битные ячейки, содержимое которых позволяет идентифицировать устройство. В первой ячейке содержится код производителя $00, во второй — код объема FLASH- памяти $01, а в третьей — код устройства $02. Как и конфигурационные ячейки, ячейки идентификатора расположены в отдельном адресном пространстве, доступ к которому возможен только в режиме программирования. Однако в отличие от конфигурационных ячеек ячейки идентификатора, по понятным причинам, доступны только для чтения. Значение кода устройства у разных моделей может совпадать. Поэтому устройство следует идентифицировать только по совокупности значений ячеек $01 и $02, так как именно эта пара чисел является уникальной для каждого микроконтроллера. Калибровочные ячейки В калибровочные ячейки при изготовлении микроконтроллера заносятся калибровочные константы, предназначенные для подстройки на номинальную частоту внутреннего RС-генератора. Количество этих ячеек зависит от того, на скольких частотах может работать внутренний RC- генератор. В моделях ATmega8515x/8535x и ATmega8x/16x/32x/64x/128x имеется четыре 8-битных ячейки, а в остальных моделях — одна ячейка. Располагаются они в старших байтах адресного пространства ячеек идентификатора. Загрузка калибровочной константы в регистр OSCCAL осуществляется аппаратно при нахождении микроконтроллера в состоянии сброса. Однако в моделях ATmega8515x/8535x и ATmega8x/16x/32x/64x/128x генератор автоматически калибруется только на частоту 1 МГц. Поэтому при использовании другой частоты RС-генератора его калибровку необходимо осуществлять вручную. Для этого программатор во время программирования должен прочитать содержимое калибровочной ячейки и занести его по какому-либо адресу FLASH-памяти программ. А программа должна после старта считать это значение из памяти программ и занести его в регистр OSCCAL. Организация памяти программ и данных В микроконтроллерах семейства Mega используется страничная организация памяти программ. При программировании весь объем FLASH- памяти разбивается на 16-битные страницы, размер которых, а также их количество зависят от объема памяти программ микроконтроллера. Соответственно, при программировании памяти программ микроконтроллеров семейства Mega данные сначала загружаются в буфер страницы и только затем заносятся непосредственно в память программ. Прошивка всех ячеек страницы при этом осуществляется одновременно. Аналогичным образом организована и EEPROM-память. Размер 8- Управление процессом программирования FLASH-памяти Программирование памяти программ микроконтроллеров семейства Mega осуществляется постранично. Сначала содержимое страницы побайтно заносится в буфер по командам “Загрузка страницы FLASH-памяти”. В каждой команде передаются младшие биты адреса изменяемой ячейки (положение ячейки внутри страницы) и записываемое значение. Содержимое каждой ячейки должно загружаться в следующей последовательности: сначала младший байт, потом старший. Фактическое программирование страницы FLASH-памяти осуществляется после загрузки буфера страницы по команде “Запись страницы FLASH-памяти”. Следует помнить, что дальнейшее программирование памяти можно будет выполнять только после завершения записи страницы. Определить момент окончания записи можно тремя способами. Первый и наиболее простой способ — выдерживать между посылкой команд паузу. Второй способ заключается в контролировании содержимого любой из записываемых ячеек после посылки команды записи, а третий способ — опрос флага готовности RDY c помощью соответствующей команды. Управление процессом программирования EEPROM-памяти Во всех старых моделях программирование EEPROM-памяти осуществляется обычным способом – побайтно. А в новых моделях появился альтернативный способ записи EEPROM-памяти – постраничный. Содержимое страницы побайтно заносится в буфер по командам “Загрузка страницы EEPROM-памяти”, а затем осуществляется фактическое программирование страницы EEPROM-памяти по команде “Запись страницы EEPROM-памяти”. Значения адресов, передаваемые в этих командах, определяются так же, как и при программировании FLASH-памяти. Для определения момента окончания записи можно использовать любой из описанных выше способов. Параллельное программирование В режиме параллельного программирования от программатора к микроконтроллеру передаются одновременно все биты кода команды или байта данных. Этот режим задействует большое число выводов микроконтроллера и требует использования дополнительного источника повышенного напряжения. Поэтому программирование в параллельном режиме осуществляется специализированными программаторами. Основное применение этого режима — “прошивка” микроконтроллеров перед установкой их на плату в условиях массового производства. Схема включения микросхем в режиме параллельного программирования приведена на рис. 9.3. Рис. 9.3. Включение микроконтроллеров в режиме параллельного программирования Таблица 9.7. Обозначение и функции выводов, используемых при программировании в параллельном режиме Сигнал Вывод Вход/Выход Назначение RDY/BSY PD1 Выход Состояние устройства: 0 – занято (выполняется предыдущая команда); 1 – готово к приему следующей команды. ОЕ PD2 Вход Управление режимом работы шины данных РВ7...РВ0: 0 — выход, 1 — вход WR PD3 Вход Сигнал записи (активный уровень — лог. 0) BS1 PD4 Вход Выбор байта (см. Табл. 14.14) ХАО PD5 Вход Определяют действие, выполняемое по положительному импульсу на выводе XTAL1 ХА1 PD6 Вход PAGEL PD7 Вход Сигнал загрузки страницы памяти BS2 РАО Вход Выбор байта (см. Табл. 14.14) DATA РВ7...Р В0 Вход/Выход Двунаправленная шина данных В общих чертах процесс программирования в этом режиме состоит из многократного выполнения следующих операций: • загрузка команды; • загрузка адреса; • загрузка данных; • выполнение команды. Последовательность подачи сигналов на выводы микроконтроллера при выполнении различных базовых операций приведена в табл. 9.8. Таблица 14.7. Базовые операции программирования в параллельном режиме № Название операции Действия 1 Загрузка команды 1.Установить выводы ХА1, ХАО в состояние 10. 2.Подать на вывод BS1 напряжение лог. 0. 3.Выставить на шину DATA код команды. 4.Подать на вывод XTAL1 положительный импульс. 2 Загрузка адреса 1.Установить выводы ХА1, ХАО в состояние 00 (загрузка адреса). 2.Установить выводы BS2:BS1 в состояние 00 (загрузка младшего байта), 01 (загрузка старшего байта) или 10 (загрузка дополнительного байта). 3.Выставить на шину DATA байт адреса. 4.Подать на вывод XTAL1 положительный импульс. 3 Загрузка данных 1.Установить выводы ХА1, ХАО в состояние 01 (загрузка данных). 2.Подать на вывод BS1 напряжение лог. 0 (загрузка младшего байта) или лог. 1 (загрузка старшего байта). 3.Выставить на шину DATA содержимое байта данных. 4.Подать на вывод XTAL1 положительный импульс. • загрузить команду “Стирание кристалла”; • подать на вывод WR сигнал НИЗКОГО уровня; • ждать появления на выводе RDY/BSY сигнала ВЫСОКОГО уровня. Программирование FLASH-памяти Запись FLASH-памяти производится в следующей последовательности: • загрузить команду “Запись FLASH-памяти”; 1) загрузить младший байт адреса (положение ячейки внутри страницы); 2) загрузить младший байт данных; 3) загрузить старший байт данных; 4) запомнить данные в буфере; 5) повторить пп. 2...5 до полного заполнения буфера страницы; 6) загрузить старший байт адреса (номер страницы); 7) записать страницу. 8) повторить все пункты для записи остальных страниц памяти программ; 9) завершить программирование, загрузив команду “Нет операции”. Необходимо отметить, что если для адресации ячейки памяти внутри страницы требуется меньше 8 битов (при размере страницы менее 256 слов), то оставшиеся старшие биты младшего байта адреса используются для адресации страницы при выполнении команды “Запись страницы”. Для чтения FLASH-памяти необходимо выполнить следующие действия: 1) загрузить команду “Чтение FLASH-памяти”; 2) загрузить старший байт адреса; 3) загрузить младший байт адреса; 4) установить ОЕ и BS1 в 0, после этого с шины данных DATA можно будет считать значение младшего байта содержимого ячейки памяти; 5) установить BS1 в 1, после этого с шины данных DATA можно будет считать значение старшего байта содержимого ячейки памяти; 6) установить ОЕ в 1. Программирование EEPROM-памяти Запись EEPROM-памяти производится в следующей последовательности: 1) загрузить команду “Запись EEPROM-памяти”; 2) загрузить старший байт адреса; 3) загрузить младший байт адреса; 4) загрузить байт данных; 5) запомнить данные в буфере; 6) повторить пп. 3...5 до полного заполнения буфера; 7) записать страницу. Для чтения содержимого EEPROM-памяти необходимо выполнить следующие действия: 1) загрузить команду “Чтение EEPROM-памяти”; 2) загрузить старший байт адреса; 3) загрузить младший байт адреса; 4) установить ОЕ и BS1 в 0, после этого с шины данных DATA можно будет считать содержимое ячейки памяти; 5) установить ОЕ в 1. Программирование конфигурационных ячеек Программирование байтов конфигурации микроконтроллеров семейства Mega осуществляется следующим образом. Младший конфигурационный байт: 1) загрузить команду “Запись конфигурационных ячеек”; 2) загрузить младший байт данных. Если бит сброшен в 0, выполняется программирование соответствующей ячейки, если установлен в 1 – ее сброс; 3) записать младший байт конфигурации. Старший конфигурационный байт: 1) Загрузить команду “Запись конфигурационных ячеек” (код 0100 0000). 2) Загрузить младший байт данных. Если бит сброшен в 0, выполняется программирование соответствующей ячейки, если установлен в 1 — ее сброс. 3) Записать старший байт конфигурации. Программирование ячеек защиты Программирование ячеек защиты выполняется аналогично программированию конфигурационных ячеек: 1) Загрузить команду “Запись ячеек защиты”; 2) Загрузить младший байт данных. Для программирования ячейки соответствующий бит должен быть сброшен в 0. Неиспользуемые биты должны быть всегда установлены в 1; 3) Записать младший байт конфигурации. Программирование по интерфейсу JTAG
Docsity logo