Программы
Книги
Статьи

Програмирование микроконтроллеров на СИ
Скачать книгу  

ОГЛАВЛЕНИЕ

Введение
Однокристальные микроконтроллеры находят широкое применение в самых разнообразных сферах: от измерительных приборов, фотоаппаратов и видеокамер, принтеров, сканеров и копировальных аппаратов до изделий электронных развле¬чений и всевозможной домашней техники.
Со времени появления первых микропроцессоров в 1970-х годах их слож¬ность постоянно возрастала за счет появления новых аппаратных решений и до¬бавления новых команд, предназначенных для решения новых задач. Так посте¬пенно сложилась архитектура, получившая впоследствии название CISC (Complex Instruction Set Computers — компьютеры со сложным набором команд). В даль¬нейшем обозначилось и нашло активное развитие еще одно направление: архитек¬тура RISC (Reduced Instruction Set Computers — компьютеры с сокращенным на¬бором команд). Именно к этой архитектуре относятся микроконтроллеры AVR от компании Atmel и PIC от компании Microchip, которым посвящена эта книга.
Основное преимущество RISC-процессоров заключается в том, что они про¬сты, выполняют ограниченный набор команд, и, как следствие, очень быстродей¬ствующие. Это позволяет снизить стоимость и сложность их программирования.
Обратной стороной RISC-архитектуры стала необходимость создания допол¬нительных команд на ассемблере, которые у CISC-устройств реализованы в аппа¬ратной части. Например, вместо того, чтобы просто вызвать команду деления, ко¬торая характерна для устройств CISC, разработчику, имеющему дело с RISC-процессором, приходится применять несколько последовательных команд вычи¬тания. Однако подобный недостаток с лихвой компенсируется ценой и скоростью работы RISC-устройств. Кроме того, если создавать программы на языке С, то по¬добные проблемы вообще перестают иметь какое-либо значение для разработчи¬ка, поскольку они решаются компилятором, который автоматически генерирует весь недостающий ассемблерный код.
На заре возникновения микропроцессоров разработка программного обеспе¬чения происходила исключительно на том или ином языке ассемблера, ориенти¬рованном на конкретное устройство. По сути, такие языки представляли собой символьные мнемоники соответствующих машинных кодов, а перевод мнемоники в машинный код выполнялся транслятором. Однако главный недостаток ассемб¬лерных языков заключается в том, что каждый из них привязан к конкретному ти¬пу устройств и логике его работы. Кроме того, ассемблер сложен в освоении, что требует достаточно больших усилий для его изучения, которые, к тому же, оказы¬ваются потраченными впустую, если впоследствии потребуется перейти на ис¬пользование микроконтроллеров других производителей.
Язык С, являясь языком высокого уровня, лишен подобных недостатков и может использоваться для программирования любого микропроцессора, для кото¬рого есть компилятор с языка С. В языке С все низкоуровневые операции, выпол¬няемые компьютерами, представлены в виде абстрактных конструкций, позво¬ляющих разработчикам сосредоточиться на программировании одной лишь логи¬ки, не заботясь о машинном коде. Изучив язык С, можно легко переходить от од¬ного семейства микроконтроллеров к другому, тратя гораздо меньше времени на разработку.

Введение 21
В этой книге рассмотрены основы программирования на языке С микрокон¬троллеров AVR с использованием компилятора WinAVR, а также микроконтрол¬леров PIC с использованием компилятора CCS-PICC. Здесь нет "сверхсложных" программных проектов. Скорее, эта книга — полезное справочное пособие с про¬стыми примерами, призванное помочь читателю быстро и легко освоить азы про¬граммирование микроконтроллеров для конкретных областей применения.
Не все из представленных в главах 4 и 5 программных примеров были протестированы в аппаратной реализации, а только в режиме эмуляции. По этой причине, будем благодар¬ны читателям, приславшим свои замечания или дополнения. И еще... Приглашаются к со¬трудничеству все любители программирования микроконтроллеров на языке С, желающие опубликовать "жемчужины" своего творчества для широкого круга читателей.
Желаем успехов в освоении вселенной под названием "Программирование микроконтроллеров". Надеемся, эта книга станет хорошим подспорьем в преодо¬лении нелегкого пути проб и ошибок.
Через тернии к звездам...

ГЛАВА 1

Архитектура микроконтроллеров AVR и PIC

В принципе, все микроконтроллеры построены по одной схеме. Система управления, состоящая из счетчика команд и схемы декодирования, выполняет считывание и декодирование команд из памяти программ, а операционное устрой¬ство отвечает за выполнение арифметических и логических операций; интерфейс ввода/вывода позволяет обмениваться данными с периферийными устройствами; и, наконец, необходимо иметь запоминающее устройство для хранения программ и данных (рис. 1.1).
Центральный процессор



j Устройство
Операционное j устройство :
i управления



i 1 1



Память программ
















Память данных


















Ввод/вывод
'


Г '



1

1



< 1 i
Периферия
Адресная Шина Шина шина данных управления

Рис. 1.1. Обобщенная структура микроконтроллера
В этой книге автор не привязывается к какому-либо конкретному типу микро¬контроллеров AVR или PIC, поэтому ниже будут рассмотрены только общие для большинства микроконтроллеров особенности архитектуры памяти, вопросы вво¬да/вывода, обработки прерываний, сброса и др.
Память
В микроконтроллерах AVR и PIC память реализована по Гарвардской архи¬тектуре, что подразумевает разделение памяти команд и данных. Это означает, что обращение к командам осуществляется независимо от доступа к данным. Пре¬имуществом такой организации является повышение скорости доступа к памяти.

Память 23
К тому же, в микроконтроллерах PIC к памяти данных и к памяти команд можно обращаться фактически одновременно, что еще больше повышает скорость обра¬ботки программ. Рассмотрим, какие типы памяти могут использоваться в микро¬контроллерах AVR и PIC.
Память данных
Память данных предназначена для записи/чтения данных, используемых про¬граммами. Является энергозависимой, то есть, при отключении питания микро¬контроллера все хранимые в ней данные, будут потеряны. В микроконтроллерах AVR память данных имеет более развитую структуру по сравнению с микрокон¬троллерами PIC, что показано на рис. 1.2.
Здесь и далее шестнадцатеричные числа будут представлены в форме, принятой в языке С: с префиксом Ох.

Адрес
Макс. OxFFFF

i

Внешняя память SRAM

Область статической памяти SRAM



0x060 0x05F
0x020 0x01 F
0x000

Внутренняя память SRAM

l/O- Регистр 63

i/O - Регистр 0
R31

R0

Область ввода/вывода (64 регистра)
Область регистров общего назначения (64 регистра)

Область регистров специальных функций
Область регистров общего назначения

AVR PIC
Рис. 1.2. Структура памяти данных в микроконтроллерах AVR и PIC
Область статической памяти SRAM (Static Random Access Memory) обозначе¬на на рис. 1.2 пунктиром, поскольку используется не всеми микроконтроллерами AVR (это относится как к внутренней, так и к внешней SRAM). Ее начальный ад¬рес — 0x060, а верхний адрес — разный в различных устройствах.
В некоторых микроконтроллерах AVR можно увеличивать пространство па¬мяти SRAM посредством подключения внешних блоков памяти вплоть до 64 Кбайт, однако для этого приходится пожертвовать портами А и С, которые в этом случае применяются для передачи данных и адресов.
Регистры общего назначения
Область регистров общего назначения (рабочих регистров) предназначена для временного хранения переменных и указателей, используемых процессором для выполнения программ. В микроконтроллерах AVR она состоит из 32 восьмираз¬рядных регистров (диапазон адресов 0x000 - 0x0IF). В микроконтроллерах PIC

24 Глава 1. Архитектура микроконтроллеров AVR и PIC
регистры общего назначения также восьмиразрядные, однако их количество и диапазон адресов зависят от конкретного типа устройства.
В программах, написанных на языке С, непосредственное обращение к реги¬страм общего назначения обычно не требуется, если только не используются фрагменты на языке ассемблера.
Регистры специальных функций микроконтроллеров PIC
Регистры специальных функций используются в микроконтроллерах PIC для управления различными операциями. Как и в случае с регистрами общего назна¬чения, их количество и адресация отличаются от устройства к устройству. В про¬граммах, написанных на языке С, непосредственное обращение к регистрам спе¬циальных функций обычно не требуется, если только не используются фрагменты на языке ассемблера.
Область ввода/вывода микроконтроллеров AVR
Область ввода/вывода микроконтроллеров AVR содержит 64 регистра, ис¬пользуемых для управления или хранения данных периферийных устройств. К каждому из этих регистров можно обращаться по адресу ввода/вывода (начиная с 0x000) или по адресу SRAM (в этом случае к адресу ввода/вывода следует при¬бавить 0x020). В программах на языке С обычно используются условные имена регистров ввода/вывода, а адреса имеют значение только для программ на языке ассемблера.
Имена, адреса ввода/вывода и SRAM, а также краткое описание регистров из области ввода/вывода микроконтроллеров AVR представлены в табл. 1.1. При этом следует отметить, что в различных моделях микроконтроллеров некоторые из перечисленных регистров не используются, а адреса, не указанные в табл. 1.1, зарезервированы компанией Atmel для использования в будущем.
Таблица 1.1. Описание регистров из области ввода/вывода микроконтроллеров AVR

Имя регистра Адрес ввода/ вывода Адрес SRAM Описание
ACSR 0x08 0x28 Регистр управления и состояния аналогового компаратора
UBRR 0x09 0x29 Регистр скорости передачи данных через UART
UCR ОхОА 0х2А Регистр управления приемопередатчиком UART
USR 0x0В 0x2В Регистр состояния приемопередатчика UART
UDR ОхОС 0х2С Регистр данных приемопередатчика UART
SPCR OxOD 0x2D Регистр управления интерфейсом SPI
SPSR ОхОЕ 0х2Е Регистр состояния интерфейса SPI
SPDR OxOF 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 Выводы порта А

Память 25
Таблица 1.1. Окончание

Имя регистра Адрес ввода/ вывода Адрес SRAM Описание
DDRA 0x1 А ОхЗА Регистр направления передачи данных порта А
PORTA 0x1 В ОхЗВ Регистр данных порта А
EECR 0x1 С ОхЗС Регистр управления памяти EEPROM
EEDR 0x1 D 0x3 D Регистр данных памяти EEPROM
EEARL 0x1 Е 0x3 Е Регистр адреса памяти EEPROM (младший байт)
EEARH 0x1 F 0x3 F Регистр адреса памяти 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 0x2 D 0x4D Счетный регистр таймера/счетчика Т/С1 (старший байт)
TCCR1B 0x2 Е 0х4Е Регистр управления В таймера/счетчика Т/С1
TCCR1A 0x2 F 0x4F Регистр управления А таймера/счетчика Т/С1
TCNT0 0x32 0x52 Счетный регистр таймера/счетчика Т/СО
TCCR0 0x33 0x53 Регистр управления таймера/счетчика Т/СО
MCUCR 0x35 0x55 Регистр управления микроконтроллером
TIFR 0x38 0x58 Регистр флагов прерываний от таймеров/счетчиков
TIMSK 0x39 0x59 Регистр маскирования прерываний от таймеров
GIFR ОхЗА 0х5А Общий регистр флагов прерываний
GIMSK ОхЗВ 0x5В Общий регистр маскирования прерываний
SPL 0x3D 0x5 D Указатель стека (младший байт)
SPH 0x3 Е 0х5Е Указатель стека (старший байт)
SREG 0x3 F 0x5F Регистр состояния
Большинство из перечисленных регистров будут рассмотрены позже в ходе изложения материала книги, сейчас же обратим внимание только на регистр со¬стояния SREG (аналог в микроконтроллерах PIC — регистр STATUS).
Регистр состояния SREG микроконтроллеров AVR
Регистр состояния содержит флаги условий микроконтроллеров AVR и рас¬полагается в области ввода/вывода по адресу $3F (адрес SRAM — $5F). После по¬дачи сигнала сброса он инициализируется нулями.
В микроконтроллерах AVR для обозначения результата выполнения операций используются восемь различных флагов:
разряд 0 (С) — флаг переноса (Carry); указывает на переполнение (пере¬нос) после выполнения арифметической или логической операции; разряд 1 (Z) — нулевой флаг (Zero); всегда устанавливается, если резуль¬тат арифметической или логической операции равен нулю; сбрасывается, если результат операции не равен нулю;
разряд 2 (N) — флаг отрицательного результата (Negative); указывает на отрицательный результат после выполнения арифметической или логиче¬ской операции;

26 Глава 1. Архитектура микроконтроллеров AVR и PIC
разряд 3 (V) — флаг переполнения при вычислениях в дополнительных ко¬дах (Two's complement Overflow); поддерживает арифметику дополни¬тельных кодов (арифметика кодов с дополнением до двух); устанавливает¬ся, если при выполнении соответствующей операции происходит перепол¬нение, в противном случае — сбрасывается;
разряд 4 (S) — флаг знака (Sign); S = NOV — связь флагов N и V с помощью операции "Исключающее ИЛИ"; флаг знака может применять¬ся для определения фактического результата арифметической операции;
разряд 5 (Н) — флаг половинного переноса (Half Carry); указывает на пе¬реполнение в младшем полубайте (разряды 0...3 байта данных); устанавли¬вается, когда происходит перенос из младшего полубайта в старший, в противном случае — сбрасывается;
разряд 6 (Т) — флаг копирования (Transfer or Сору); предназначен для сво¬бодного применения программистом (например, в качестве буфера);
разряд 7 (I) — общее разрешение прерываний (Global Interrupt); если пре¬рывания, как таковые, должны быть разрешены, то должен быть установ¬лен разряд 7 регистра состояния (в лог. 1).
Внутренняя и внешняя память SRAM микроконтроллеров AVR
Память SRAM микроконтроллеров AVR предназначена для хранения тех дан¬ных, которые не помещаются в рабочих регистрах, а также для организации про¬граммного стека (см. следующий подраздел). Данные обычно сохраняют в SRAM, начиная с первых адресов, а стеку соответствуют верхние адреса.
Если объема внутренней памяти SRAM недостаточно, то в некоторых микро¬контроллерах AVR его можно увеличить до 64 Кбайт посредством подключения внешних блоков памяти. Для этого в регистре MCUCR (адрес в области вво¬да/вывода — $35, адрес в SRAM— $55) следует установить в лог. 1 разряд SRE (разряд 7). После установки этого разряда порты А и С будут выступать в качестве шины адреса и шины данных, а выводы 7 и 6 порта D — в качестве управляющих сигналов чтения /RD и, соответственно, записи /WR для внешней памяти SRAM), независимо от того, какие направления передачи данных установлены для этих портов в соответствующих регистрах направления передачи данных.
Стек
Стек — это особая область памяти данных, используемая процессором для временного хранения адресов возврата из подпрограмм, промежуточных резуль¬татов вычислений и др. В микроконтроллерах PIC и некоторых микроконтролле¬рах AVR стек реализован аппаратно — для этого выделено отдельное запоми¬нающее устройство фиксированного объема в несколько (или несколько десятков) байт. Для микроконтроллеров AVR компиляторы языка С (например, при обра¬щении к подпрограммам) могут также создавать один или более стеков программ¬но, начиная с верхних адресов области SRAM.
Стек действует по принципу LIFO — "Last In, First Out", что означает "по¬следним вошел, первым вышел". Это означает, что новые данные вначале поме¬щаются на вершину (первый уровень) стека, а затем, с поступлением следующих данных, "проталкиваются" на его нижние уровни. Извлечение из стека происхо¬дит в обратном порядке: вначале считываются данные, помещенные последними

Память 27
на вершину, после чего данные, размещенные на нижних уровнях, как бы "вытал¬киваются" на один уровень вверх. Ячейка памяти, которая является в данный мо¬мент вершиной стека, адресуется указателем стека (для AVR — регистровой па¬рой SPL, SPH).
Поскольку область памяти данных, отводимая для программного стека, огра¬ничивается только объемом памяти SRAM, при написании программ следует сле¬дить за тем, чтобы стек не становился слишком большим, затирая полезные дан¬ные.
Память программ
Память программ как в микроконтроллерах AVR, так и в микроконтроллерах PIC реализована по технологии Flash-EPROM, которая подразумевает программи¬рование пользователем и вытирание электрическим способом. Размер этой памяти варьируется в зависимости от микроконтроллера и обычно составляет несколько Кбайт командных слов.
Флэш-память является энергонезависимой, то есть, сохраняет записанную в нее информацию даже после отключения питания микроконтроллера. Несмотря на то, что память этого типа — программируемая, для записи в нее используются только внешние аппаратные средства, поэтому с точки зрения программиста мож¬но сказать, что память программ доступна только для чтения.
Адресация команд в памяти программ реализуется с помощью специального регистра — счетчика команд, разрядность которого определяет допустимый раз¬мер этой памяти. Разрядность ячеек памяти программ, в зависимости от типа мик¬роконтроллера, может составлять 14-16 бит.
Кроме того, следует отметить, что в микроконтроллерах PIC в первых ячейках памяти программ (начиная с адреса 0x0000) содержатся векторы (адреса перехо¬да) сброса и прерываний.
Память EEPROMмикроконтроллеров Л VR
Многие микроконтроллеры AVR оборудованы встроенной памятью EEPROM — электрически перезаписываемой энергонезависимой памятью. Хотя эта память и допускает запись, она редко используется для хранения программных переменных, поскольку, во-первых, медленнодействующая, и, во-вторых, имеет ограниченный (хотя и довольно большой) цикл перезаписи.
Учитывая вышесказанное, память EEPROM используют, преимущественно, для хранения данных, которые не должны быть потеряны даже при потере пита¬ния. Это очень удобно, к примеру, при калибровке измерительных приборов, ра¬ботающих под управлением микроконтроллеров, у которых в памяти EEPROM в процессе настройки сохраняются параметры корректировки. Благодаря этому, в большинстве случаев полностью отпадает необходимость в настроечных потен¬циометрах и триммерах.
В отличие от флэш-памяти, для записи/чтения памяти EEPROM нет необхо¬димости в специальном программаторе — эти операции доступны программно и допускают побайтную передачу данных с помощью регистра управления EECR, регистра данных EEDR и регистровой пары EEARL, EEARH, определяющей адрес ячейки памяти (см. табл. 1.1).

28 Глава 1. Архитектура микроконтроллеров AVR и PIC
Запись в память EEPROM
Запись байта данных в память EEPROM осуществляется по следующей схеме:
1. Удостовериться, что в разряде EEWE (разряд 1) регистра EECR находится лог. О (разрешение записи).
2. Записать адрес ячейки EEPROM в регистр EEAR.
3. Записать байт данных в регистр EEDR.
4. Установить в лог. 1 разряд EEMWE (разряд 2) регистра EECR.
5. Установить в лог. 1 разряд ЕЕ WE (разряд 1) регистра EECR, чтобы активизи¬ровать процесс записи.
По окончанию цикла программирования разряд EEWE аппаратно автоматиче¬ски сбрасывается в лог. 0. Программа пользователя должна непрерывно опраши¬вать этот разряд, ожидая появления лог. 0, прежде чем приступить к программи¬рованию следующего байта.
Чтение из памяти EEPROM
Чтение байта данных из памяти EEPROM осуществляется по такой схеме:
1. Записать адрес ячейки EEPROM в регистр EEAR.
2. Установить в лог. 1 разряд EERE (разряд 0) регистра EECR, чтобы активизи¬ровать процесс чтения.
3. По окончанию считывания разряда EERE аппаратное обеспечение считывает требуемый байт в регистр EEDR, после чего уже нет необходимости вновь оп¬рашивать разряд EERE, поскольку считывание длится только один цикл такта системной синхронизации.
Перед началом операции чтения программа пользователя должна постоянно опрашивать разряд EEWE и ждать появления лог. 0. Если во время программиро¬вания памяти EEPROM в соответствующий регистр будет записан новый адрес или данные, то еще продолжающийся процесс программирования будет прерван, и результат будет неопределенным!
Обработка прерываний
Прерывания — это вызовы определенных функций, генерируемые, главным образом, аппаратной частью микроконтроллера. В результате прерывания выпол¬нение программы останавливается, и происходит переход к соответствующей подпрограмме обработки прерывания.
Прерывания бывают внутренними и внешними. Источниками внутреннего прерывания являются встроенные модули микроконтроллера (например, тай¬мер/счетчик или сторожевой таймер). Внешние прерывания вызываются сбросом (сигнал на выводе RESET) или сигналами предустановленного уровня на выводах INT. К примеру, в микроконтроллерах AVR за характер сигналов на выводах INT0/INT1, вызывающих прерывание, определяется с помощью разрядов регистра управления MCUCR: ISC00 (разряд 0), ISC01 (разряд 1) — для входа INTO; ISC 10 (разряд 2), ISC11 (разряд 3) — для входа INT1 (табл. 1.2 и табл. 1.3).

Обработка прерываний 29
Таблица 1.2. Выбор способа активизации прерывания по входу INTO

Разряд ISC01 Разряд ISC00 Описание
0 0 Прерывание вызывается по уровню лог. 0 на входе INTO
1 0 Прерывание вызывается по ниспадающему фронту сигнала INTO
1 1 Прерывание вызывается по нарастающему фронту сигнала INTO
Таблица 1.3. Выбор способа активизации прерывания по входу INT1

Разряд ISC11 Разряд ISC10 Описание
0 0 Прерывание вызывается по уровню лог. 0 на входе INT1
1 0 Прерывание вызывается по нарастающему фронту сигнала INT1
1 1 Прерывание вызывается по ниспадающему фронту сигнала INT1
В ряде микроконтроллеров PIC выбор фронта для активизации прерывания по входу INT определяется состоянием разряда 6 регистра OPTION: лог. 1 в этом раз¬ряде соответствует прерывание по нарастающему, а лог. О — по ниспадающему фронту сигнала. Для установки этого разряда в языке С обычно используют спе¬циальные функции.
В микроконтроллерах AVR всем прерываниям, включая сброс, поставлен в соответствие собственный вектор прерывания — адрес в начальной области памяти программ, по которому компилятор размещает команду перехода к под¬программе обработки прерывания. Перечень векторов прерывания в некоторых моделях микроконтроллеров AVR может выглядеть следующим образом (табл. 1.4).
Таблица 1.4. Векторы прерываний в некоторых микроконтроллерах AVR

Адрес в
памяти
программ Источник прерывания Описание
0x0000 RESET Сигнал сброса
0x0001 INTO Внешний запрос на прерывание по входу INTO
0x0002 INT1 Внешний запрос на прерывание по входу INT1
0x0003 Т/С1 Захват по таймеру/счетчику Т/С1
0x0004 Т/С1 Совпадение с регистром сравнения А таймера Т/С1
0x0005 Т/С1 Совпадение с регистром сравнения В таймера Т/С1
0x0006 Т/С1 Переполнение таймера/счетчика Т/С1
0x0007 Т/СО Переполнение таймера/счетчика Т/СО '
0x0008 SPI Завершение передачи данных по интерфейсу SPI
0x0009 UART Прием байта приемопередатчиком UART завершен
ОхОООА UART Регистр данных приемопередатчика UART пуст
0x000В UART Передача данных приемопередатчиком UART завершена
ОхОООС ANA СОМР Прерывание от аналогового компаратора
В микроконтроллерах PIC источники прерывания, кроме RESET, не рассмат¬риваются в отдельности, им обычно соответствует один вектор, а в некоторых мо¬делях — два вектора для прерываний с различной приоритетностью (в микрокон¬троллерах AVR все прерывания имеют одинаковый приоритет, и в случае одно¬временного возникновения двух прерываний первым обрабатывается прерывание с меньшим номером вектора). Определять, какое именно прерывание требует об¬служивания, — задача программиста, и многие компиляторы с языка С предос-

30 Глава 1. Архитектура микроконтроллеров AVR и PIC
тавляют для этой цели готовые функции, освобождающие от необходимости са¬мому "вычислять" источник прерывания.
В момент возникновения прерывания в стек помещается адрес возврата — адрес команды, которая должна быть выполнена первой после выхода из подпро¬граммы обработки прерывания. В результате выполнения последней ассемблер¬ной команды подпрограммы обработки прерывания (для микроконтроллеров AVR— это команда reti, а для микроконтроллеров PIC — ret fie) адрес воз¬врата извлекается из стека в счетчик команд, и выполнение программы продолжа¬ется.
Управление прерываниями в микроконтроллерах AVR
В микроконтроллерах AVR за управление прерываниями отвечают, главным образом, четыре регистра:
GIMSK (General Interrupt Mask Register) — разрешает или запрещает внешние прерывания по входу INT0/INT1;
GIFR (General interrupt Flag Register) — регистр флагов внешних прерыва¬ний;
TIMSK (Timer/Counter Interrupt Mask Register) — регистр маскирования прерываний от таймера/счетчика Т/СО и Т/С1;
TIFR (Timer/Counter Interrupt Flag Register) — регистр флагов прерываний от таймеров/счетчиков.
О состоянии прерывания сигнализирует соответствующий флаг, который ус¬танавливается или сбрасывается в регистре флагов. Даже если в регистре маски прерываний установлен соответствующий отдельный разряд разрешения преры¬вания, то прерывания могут активизироваться только тогда, когда в регистре со¬стояния SREG установлен разряд общего разрешения прерываний I (разряд 7). Ес¬ли это имеет место, и наступает прерывание, то выполнение программы ответвля¬ется по соответствующему адресу (см. табл. 1.4) и разряд общего разрешения пре¬рываний I в регистре SREG сбрасывается в состояние лог. 0, блокируя тем самым последующие прерывания. Если требуется прервать подпрограмму другим преры¬ванием, то после входа в подпрограмму обработки прерывания программа пользо¬вателя должна установить флаг I в лог. 1.
Вместе с входом в подпрограмму обработки прерывания аппаратно сбрасыва¬ется также и соответствующий флаг, вызвавший прерывание. Некоторые флаги прерываний могут быть сброшены самим пользователем посредством установки соответствующего флага в лог. 1.
Регистр GIMSK
Регистр GIMSK (рис. 1.3), расположенный в области ввода/вывода по адресу 0x003В (адрес в SRAM — 0x005В), используется для разрешения внешних пре¬рываний.
7 6 5 4 3 2 10
INT1 INTO — — — — — —
Рис. 1.3. Структура регистра GIMSK микроконтроллеров AVR

Обработка прерываний 31
Если разряд INT1/INT0 установлен в лог. 1, то внешнее прерывание по входу INT1/INT0 будет разрешено до тех пор, пока установлен в лог. 1 разряд I в регистре состояния SREG.
Регистр GIFR
Состояние внешнего прерывания определяется по регистру GIFR (рис. 1.4), который расположен в области ввода/вывода по адресу ОхООЗА (адрес SRAM —
0х005А).
7 6 5 4 3 2 10
INTF1 INTF0 — — — — — —
Рис. 1.4. Структура регистра GIFR микроконтроллеров AVR
Флаг INTF1/INTF0 устанавливается в лог. 1, если возникает внешнее преры¬вание по сигналу на выводе INT1/INT0. При входе в подпрограмму обработки прерывания этот разряд переводится аппаратно в исходное состояние лог. 0.
Регистры TIMSK и TIFR
Регистр TIMSK (рис. 1.5), расположенный в области ввода/вывода по адресу 0x0039 (адрес в SRAM — 0x0059), используется для разрешения прерываний от таймеров/счетчиков (рассматриваются ниже в этой же главе).
7 6 5 4 3 2 10
TOIE1 OCIE1A OCIE1B — TICIE1 — TOIE0 —
Рис. 1.5. Структура регистра TIMSK микроконтроллеров AVR
Состояние прерываний, имеющих отношение к таймерам/счетчикам микро¬контроллеров AVR, определяется по регистру TIFR (рис. 1.6), который располо¬жен в области ввода/вывода по адресу 0x0038 (адрес SRAM — 0x0058).
7 6 5 4 3 2 1 0
TOV1 OCF1A OCF1B — ICF1 — TOV0 —
Рис. 1.6. Структура регистра 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.

32 Глава 1. Архитектура микроконтроллеров AVR и PIC
Если разряд TOIE0 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при переполнении таймера/счетчика Т/СО. В таком случае, в регистре TIFR устанавливается флаг TOV0.
Установка в лог. 1 одного из флагов в регистре TIFR приводит к переходу по соответствующему вектору прерывания. При входе в подпрограмму обработки прерывания, флаг в регистре TIFR аппаратно сбрасывается в лог. 0.
Управление прерываниями в микроконтроллерах PIC
В микроконтроллерах PIC управление прерываниями реализовано с помощью регистров специальных функций, и отличается от устройства к устройству. К при¬меру, в микроконтроллерах PIC12C6x, PIC14000, Р1С16х для этой цели использу¬ются регистры INTCON (рис. 1.7), PIE и PIR, а программы обработки прерываний всегда начинают исполняться с адреса 0x004.
7 6 5 4 3 2 1 0
GIE PEIE TOIE INTE RBIE TOIF INTF RBIF
Рис. 1.7. Регистр INTCON микроконтроллеров PIC12C6x, PIC14000, Р1С16х
Разряд GIE — это флаг общего разрешения прерываний. Если он установлен в лог. 1, то все немаскированные прерывания разрешены, если же он сброшен в лог. 0, то все прерывания запрещены.
Разряд PEIE регистра INTCON может использоваться в качестве флага разре¬шения всех прерываний от периферии, определяемых с помощью регистров PIE и PIR.
Флаг TOIE разрешает (лог. 1) или запрещает (лог. 0) прерывания при пере¬полнении таймера TMR0), а флаг TOIF определяет запрос на соответствующее прерывание.
Разряд INTE — флаг разрешения внешнего прерывания по входу INT, а раз¬ряд INTF — флаг запроса на прерывания по этому входу. Аналогичное значение, но для порта В имеют разряды RBIE и RBIF.
Регистр PIE содержит флаги разрешения прерываний от периферийных уст¬ройств, а регистр PIR — соответствующие флаги запросов на прерывание. Пози¬ции разрядов в этих регистрах для различных микроконтроллеров отличаются.
Микроконтроллеры серии Р1С17Сх
В микроконтроллерах серии Р1С17Сх используется четыре вектора прерыва¬ний:
0x00008 — внешнее прерывание по входу INT (приоритет — высокий);
0x00010 — прерывание от таймера TMR0 (приоритет — высокий);
0x00018 — внешнее прерывание по входу ТОСК1 (приоритет — высо¬кий);
0x00020 — прерывание от периферийных устройств ((приоритет — низ¬кий).
Для управления прерываниями в этой серии микроконтроллеров используется регистр INTSTA (рис. 1.8).

Обработка прерываний 33

7 6 5 4 3 2 1 0
PE!F TOCKIF TOIF INTF PEIE TOCKIE TOIE INTE
Рис. 1.8. Регистр INTSTA микроконтроллеров PIC17Cx Рассмотрим назначение разрядов этого регистра:
PEIF — устанавливается в лог. 1 в случае задержки прерывания, иниции¬рованного периферийным устройством;
TOCKIF — флаг разрешения внешнего прерывания по входу TOCKI (при переходе к вектору 0x00018 аппаратно сбрасывается в лог. 0);
TOIF — флаг переполнения счетчика TMR0 (при переходе к вектору 0x00 010 аппаратно сбрасывается в лог. 0);
INTF — флаг разрешения внешнего прерывания по входу INT (при пере¬ходе к вектору 0x00008 аппаратно сбрасывается в лог. 0);
PEIE — флаг разрешения прерываний от периферийных устройств;
TOCKIE — флаг разрешения внешних прерываний по входу TOCKI;
TOIE — флаг разрешения прерываний от таймера TMR0;
INTE — флаг разрешения прерываний по входу INT.
Флаги разрешений и запросов на прерывания от внешних устройств находятся в регистрах PIE и PIR. При этом их разряды имеют следующую взаимосвязь с пе¬риферией микроконтроллера:
0 (RCIE/RCIF) — прием данных приемопередатчиком UASRT;
1 (TXIE/TXIF) — передача данных приемопередатчиком UASRT;
2 (CA1IE/CA1IF) — модуль ССР1;
3 (CA2IE/CA2IF) — модуль ССР2;
4 (TMR1IE/TMR1 IF) — таймер TMR1;
5 (TMR2IE/TMR2IF) — таймер TMR2;
6 (TMR3IE/TMR3IF) — таймер TMR3;
7 (RBIE/RBIF) — порт В.
Микроконтроллеры серии Р1С18Сх
В этой серии микроконтроллеров PIC применяется схема управления преры¬ваниями, немного напоминающая задействованную в сериях Р1С12С6х, PIC14000, Р1С16х. Однако есть четыре важных отличия:
каждому источнику прерываний задается собственный уровень приорите¬та;
вместо одного регистра INTCON используется три (INTCON, INTCON2, INTCON3);
вместо одного регистра PIE и PIR используется по два (PIE1/PIE2; PIR1/PIR2);
присутствует регистры IPR1 и IPR2, задающие приоритеты прерываний от периферийных устройств.
3 — 6-767

34 Глава 1. Архитектура микроконтроллеров AVR и PIC
Рассмотрим вначале регистры INTCON (рис. 1.9).

7 6 5 4 3 2 1 0
INTCON GIE PEIE TMROIE INTOIE RBIE TMROIF INTOIF RBIF
7 6 5 4 3 2 1 0
INTCON2 _RBPU INTEDGO INTEDG1 INTEDG2 — TMROIP — RBIP
7 6 5 4 3 2 1 0
INTCON3 INT2IP INT1IP — INT21E INT1IE — INT2IF INT1IF

Рис. 1.9. Регистры INTCON микроконтроллеров PIC18Cx Назначение разрядов регистров INTCON:
INTCON:
• GIE — флаг общего разрешения прерываний;
• PEIE — флаг разрешения всех запросов на прерывание с низким при¬оритетом;
• TMROIE — флаг разрешения прерываний от таймера TMR0;
• INTOIE — флаг разрешения прерываний по входу INTO;
• RBIE — флаг разрешения прерывания по изменению состояния порта В;
• TMROIF — запрос на прерывание от таймера TMR0;
• INTOIF — запрос на прерывание по входу INTO;
• RBIF — запрос на прерывание по изменению состояния порта В;
INTCON2:
• INTEDGO — выбор фронта для внешнего прерывания по входу INTO (лог. 1 — по нарастающему фронту);
• INTEDG1 — выбор фронта для внешнего прерывания по входу INT1 (лог. 1 — по нарастающему фронту);
• INTEDG2 — выбор фронта для внешнего прерывания по входу INT2 (лог. 1 — по нарастающему фронту);
• TMROIP — задает высокий приоритет для прерывания от таймера TMR0;
• RBIP — задает высокий приоритет для прерывания по изменению со¬стояния порта В;
задает высокий приоритет для внешних прерываний по входу задает высокий приоритет для внешних прерываний по входу
INTCON3: . INT2IP
INT2; . INT1IP
INT1;
• INT2IE — флаг разрешения внешних прерываний по входу INT2;
• INT1 IE — флаг разрешения внешних прерываний по входу INT1;
• INT2IF — запрос на прерывание по входу INT2;
• INT1IF — запрос на прерывание по входу INT1.
Структура регистров PIE показана на рис. 1.10.

сброс 35

7 6 5 4 3 2 1 0
PIE1 PSPIE ADIE RCIE TXIE SSPiE CCP1IE TMR2IE TMR1IE
7 6 5 4 3 2 10
PIE2 — — — — BCLIE LVD IE TMR3IE CCP2IE
Рис. 1.10. Регистры PIE микроконтроллеров PIC18Cx Назначение разрядов регистров PIE:
PSPIE — флаг разрешения прерывания от PSP при выполнении операций чтения/записи;
ADIE — флаг разрешения прерывания по завершению АЦП;
RCIE — флаг разрешения прерывания от USART при приеме данных;
TXIE — флаг разрешения прерывания от USART при передаче данных;
SSPIE — флаг разрешения прерывания от MSSP;
ССР 1 IE — флаг разрешения прерывания от модуля ССР1;
TMR2IE — флаг разрешения прерывания при совпадении содержимого таймера TMR2 и регистра PR2;
TMR1TE — флаг разрешения прерывания при переполнении таймера TMR1;
BCLIE — флаг разрешения прерывания при конфликте на шине;
LVDIE — флаг разрешения прерывания при обнаружении низкого уровня питающего напряжения;
TMR3IE — флаг разрешения прерывания при переполнении таймера TMR3;
CCP2IE — флаг разрешения прерывания от модуля ССР2.
Регистры PIR и IPR имеют сходную структуру и взаимосвязь разрядов с раз¬личными устройствами и модулями.
Сброс
Сброс — это, по сути, одна из форм прерываний, вызывающая перезапуск микроконтроллера (аппаратная инициализация всех регистров управления и пе¬риферийных устройств и выполнение программы, начиная с адреса 0x0000). Век¬тор сброса всегда расположен самым первым.
Возможны следующие варианты сброса:
сброс при включении питания;
внешний сброс — сигнал сброса подается на соответствующий вывод мик¬роконтроллера;
сброс от сторожевого таймера — микроконтроллер сбрасывается по исте¬чению времени, заданного сторожевым таймером, если этот таймер был разрешен.
з*

36 Глава 1. Архитектура микроконтроллеров AVR и PIC
В этой книге будет рассмотрен подробнее только третий вид сброса в разделе, посвященном сторожевому таймеру.
"Спящие" режимы процессора
Микроконтроллеры AVR и PIC допускают переход в "спящий" режим, когда происходит временное отключение генератора тактовых импульсов. В таком ре¬жиме потребление энергии сведено к минимуму, а выход из него осуществляется при получении запроса на прерывание.
Переход в "спящий" режим реализуется по ассемблерной команде sleep. В случае микроконтроллеров AVR, при этом должен быть предварительно уста¬новлен в лог. 1 разряд SE (разряд 5) регистра управления MCUCR.
Когда во время режима пониженного энергопотребления происходит преры¬вание, центральный процессор выходит из "спящего" режима, выполняет подпро¬грамму обработки прерывания и продолжает выполнение программы с команды, следующей после команды sleep. Если во время режима пониженного энергопо¬требления поступает сигнал сброса, то центральный процессор выходит из "спя¬щего" режима и продолжает выполнение программы с команды, расположенной по адресу $000 в области команд.
Для микроконтроллеров AVR может быть выбран один из двух "спящих" ре¬жимов:
В ждущем режиме (Idle Mode) работа процессора приостанавливается, но таймер/счетчик, сторожевой таймер, система прерываний и тактирования остаются активными. Благодаря этому, центральный процессор может быть возвращен в обычный режим работы с помощью сторожевого тайме¬ра, таймера/счетчика или внешнего прерывания.
В режиме пониженного энергопотребления (Power Down Mode) систем¬ный осциллятор (а значит и весь микроконтроллер) находится в отключен¬ном состоянии. В таком режиме с помощью внутреннего RC-генератора колебаний может включаться лишь сторожевой таймер со своим собствен¬ным обеспечением тактовой частотой. Активный сторожевой таймер по истечении времени задержки опять переводит микроконтроллер в нор¬мальное состояние. Если сторожевой таймер также отключен, то в нор¬мальное состояние его может перевести только внешний сигнал сброса или внешнее прерывание.
Выбор одного из "спящих" режимов в микроконтроллерах AVR осуществля¬ется с помощью разряда SM (разряд 4) регистра управления MCUCR. Если разряд SM установлен в лог. 1, то микроконтроллер переводится в режим пониженного энергопотребления последующей командой sleep, если же разряд SM сброшен в лог. 0, то последующей микроконтроллер переводится в ждущий режим в том случае, если ранее в регистре MCUCR был установлен разряд SE.
Таймеры/счетчики
Таймеры/счетчики — это, наверное, наиболее часто используемые модули микроконтроллеров. С их помощью можно измерять промежутки времени и час¬тоту, определять ширину импульсов, вычислять скорость и т.д. Хотя они и ис~

Таймеры/счетчики 37
пользуются для измерения времени, на самом деле речь идет об обычных двоич¬ных счетчиках.
В микроконтроллерах AVR и PIC используются как 8-, так и 16-разрядные таймеры/счетчики. Разрядность определяет момент переполнения счетчика (воз¬врат в нулевое состояние). Так, для 8-разрядного счетчика переполнение наступа¬ет, когда счет достигает 255, а для 16-разрядного — 65535.
Количество таймеров/счетчиков и их разрядность в микроконтроллерах отли¬чается в зависимости от модели, и потому в данном разделе будут рассмотрены только общие вопросы, имеющие отношение к использованию тайме¬ров/счетчиков.
Если таймер/счетчик функционирует в качестве счетчика, то он подсчитывает число импульсов, поступающих на определенный вход микроконтроллера. В этом случае соответствующий вывод должен быть сконфигурирован в инициализаци-онной части программы как вход.
В случае использования в качестве таймера, частота тактирования тайме¬ра/счетчика является производной величиной от такта системной синхронизации внутреннего кварцевого осциллятора. При этом таймеры/счетчики используют в качестве тактового сигнала разделенный такт системной синхронизации. Коэф¬фициент деления предварительного делителя частоты может настраиваться инди¬видуально для каждого из таймеров с помощью мультиплексора, управляемого разрядами из регистра управления таймера/счетчика.
Таймеры/счетчики микроконтроллеров A VR
В микроконтроллерах AVR могут использоваться следующие тайме¬ры/счетчики:
8- или 16-разрядный Т/СО;
16-разрядный Т/С1;
8- или 16-разрядный Т/С2.
Регистры управления в этом случае называются TCCRO, TCCR1 и TCCR2 (расположены в области ввода/вывода), а режим работы и коэффициент деления частоты осциллятора определяется с помощью разрядов CSx2, CSxl и CSxO этих регистров. К примеру, для таймеров/счетчиков Т/СО и Т/С1 выбор режима и вход¬ного такта можно определить с помощью комбинаций разрядов, представленных в табл. 1.5.
Таблица 1.5. Выбор режима и входного такта для Т/СО и Т/С1 микроконтроллеров AVR

CSx2 CSxl CSxO Описание
6 0 j 0 Останов
0 0 1 Режим "Таймер", такт = такт системной синхронизации
0 1 0 Режим "Таймер", такт = такт системной синхронизации / 8
0 1 1 Режим "Таймер", такт = такт системной синхронизации / 64
1 0 0 Режим "Таймер", такт = такт системной синхронизации / 256
1 0 1 Режим "Таймер", такт = такт системной синхронизации /1024
1 1 0 Режим "Счетчик", такт — внешний на входе ТО (Т1), активный фронт сигнала — ниспадающий
1 1 1 Режим "Счетчик", такт — внешний на входе ТО (Т1), активный фронт сигнала — нарастающий

38 Глава 1. Архитектура микроконтроллеров AVR и PIC
Для Т/С2 комбинации разрядов CS22, CS21 и CS20 могут иметь разное значе¬ние для различных моделей микроконтроллеров.
Т/СО
Схема работы таймера/счетчика Т/СО, представлена на рис. 1.11.
Запрос на прерывание при переполнении Т/СО
Внутренняя 8-разрядная шина данных

Регистр TIMSK

Регистр TIFR

Регистр TCCR0



Т

тт

tit

Регистр TCNT0<'

Схема управления

Ф

Переполнение
Рис. 1.11. Схема таймера/счетчика Т/СО
Как только с помощью разрядов CSOO, CS01 и CS02 регистра TCCR0 (адрес 0x33 в области ввода/вывода, адрес 0x53 в SRAM) для делителя частоты будет установлена комбинация, отличная от 000, таймер/счетчик Т/СО по каждому им¬пульсу, поступающему на тактовый вход, начинает увеличивать на единицу со¬держимое регистра TCNT0 (адрес 0x32 в области ввода/вывода, адрес 0x52 в SRAM). Когда состояние счетчика в регистре TCNT0 изменяется с OxFF на 0x00, в регистре TIFR (адрес 0x38 в области ввода/вывода) устанавливается флаг переполнения TOV0.
ПРИМЕЧАНИЕ
Кроме разрядов CS00, CS01 и CS02 регистра TCCR0 (разряды 0-2), никакие другие разря¬ды этого регистра не используются.
Таймер/счетчик Т/СО хорошо подходит для оценки временных интервалов. Для этого в ходе выполнения программы в регистр TCNT0 записывается исходное значение. Затем может быть запущен Т/СО с требуемым входным тактом. Про¬грамма ожидает появления в регистре TIFR флага переполнения TOV0, указы¬вающего на то, что требуемое время истекло.
Предположим частота системной синхронизации составляет 4 МГц, а некото¬рое действие должно выполняться программой каждые 0,5 с. В этом случае можно воспользоваться делением частоты на 8, что соответствует частоте тактирования 500 кГц или 2 мкс. Таким образом, на подсчет 256 тактовых импульсов счетчику потребуется 512 мкс. Это значение должно быть кратно 500 мкс, чтобы с помо¬щью множителя 1000 в программе можно было реализовать требуемое действие в точности с периодом 500 мс. Для этого в счетчик перед началом каждого счета

Таймеры/счетчики 39
должно быть загружено значение 6, чтобы до переполнения выполнялся подсчет не 256, а только 250 тактовых импульсов.
Т/С1
16-разрядный таймер/счетчик Т/С1 гораздо сложнее Т/СО (рис. 1.12).
Запрос на Запрос на Запрос на Запрос на
прерывание при прерывание при прерывание при прерывание при
переполнении Т/С1 совпадении с А совпадении с В захвате входа
Внутренняя 8-разрядная шина данных

I I I

j_=|



Регистр TIMSK

Регистр TIFR

Регистр TCCR1А

Регистр TCCR1В



I к 1 I i I II



тт



15

8 7

ИИ

!_'

1_1

till



Регистр ICR1 <-*

Схема управления



16

ir~f



15

Регистр TCNT1 <

Сброс Т/С1
ТактТ/С1
Прямой / Обратный счет.

Ф

Переполнение Т/С1

15

16
l7

15





lb-разрядныи компаратор

16-разрядный компаратор



16

¦16



15

15



выходной регистр сравнения А

Выходной регистр сравнения В

Рис. 1.12. Схема таймера/счетчика Т/С1
В дополнение к счетному регистру и регистру управления, он содержит ре¬гистр захвата по входу (ICR1) и два 16-разрядных регистра сравнения на выходе (в некоторых моделях микроконтроллеров регистр сравнения В отсутствует).

40 Глава 1. Архитектура микроконтроллеров AVR и PIC
Рассмотрим назначение отдельных регистров:
TCNT1 — счетный регистр (содержимое счетчика);
TCCR1А — регистр управления для определения реакции выводов ОС 1 А/ОС 1В в случае совпадения состояния счетчика в регистре TCNT1 с регистрами сравнения OCR1A/OCR1B, а также для выбора режима ши-ротно-импульсной модуляции;
TCCR1B — регистр управления для настройки делителя частоты, для раз¬решения подачи сигнала сброса для регистра TCNT1 и для управления за¬хватом;
ICR1 — регистр захвата по входу (при появлении на выводе ICP фронта входного сигнала, определенного как активный, текущее состояние счет¬чика будет перенесено в этот регистр);
OCR1 A, OCR 1В — регистры сравнения; их содержимое постоянно сравни¬вается с состоянием счетчика. В случае совпадения выполняются действия, определенные регистром TCCR1A.
Регистр управления TCCR1A (рис. 1.13) находится в области ввода/вывода по адресу 0x2F (адрес 0x4F в SRAM).
7 6 5 4 3 2 1 0
СОМ1А1 СОМ1А0ЮОМ1В1 СОМ1В0 — — PWM11 PWM10
Рис. 1.13. Регистр TCCR1А таймера/счетчика Т/С1
Разряды СОМ1А1/СОМ1А0 и СОМ1В1/СОМ1В0 определяют состояние вы¬вода ОС! А/ОС 1В при совпадении содержимого регистра сравнения А/В с содер¬жимым счетчика. Возможные настройки для режима сравнения показаны в табл. 1.6.
Таблица 1.6. Возможные варианты для работы в режиме сравнения

СОМ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 раз¬рядов значение ТОР рассчитывается как
TOP = 2N-l.
Частота тшим, с которой повторяются циклы ШИМ, вычисляется по формуле:

>N+1
IPWM

1T/C1

/(2"+1-2),

причем частота таймера/счетчика fT/cl выбирается с помощью разрядов CSIO¬CS 12 регистра TCCR1B, а разрешающая способность N — с помощью разрядов

Таймеры/счетчики 41
PWM10 и PWM11 регистра TCCRIA. Соответствующие взаимосвязи показаны в табл. 1.7.
Таблица 1.7. Выбор режима ШИМ с помощью разрядов PWM11 и PWM10

pwMijii PWWI10 Разрешающая способность Значение ТОР Частота ШИМ
0 0 Режим ШИМ не активен
0 1 8 разрядов OxOOFF (255) fr/ci /510
1 0 9 разрядов 0x01 FF (511) fr/ci /1022
1 1 10 разрядов 0x03FF(1023) fr/a / 2046
Когда состояние счетчика в регистре TCNT1 совпадает со значением 10 млад¬ших разрядов регистра OCR1A/OCR1B, то, в зависимости от состояния разрядов СОМ1А1/СОМ1А0 или СОМ1В1/СОМ1В0 регистра TCCRIA, вывод ОС1А/ОС1В последующим тактовым импульсом устанавливается или сбрасывается. Соответ¬ствующие взаимосвязи показаны в табл. 1.8.
Таблица 1.8. Возможности выбора для режима сравнения при работе ШИМ

СОМ1х1 СОМ1х0 Действие в случае совпадения
0 0 На выводе ОС1х нет никакого сигнала
0 1 На выводе ОС1х нет никакого сигнала
1 0 Неинвертирующий широтно-импульсный модулятор. В случае соответствия, при суммирующем подсчете на выводе ОС1х устанавливается лог. 0, а при подсчете с вычитанием — лог. 1
1 1 Инвертирующий широтно-импульсный модулятор. В случае соответствия, при суммирующем подсчете на выводе ОС1х устанавливается лог. 1, а при подсчете с вычитанием —лог. 0
В случае неинвертирующего широтно-импульсного модулятора, коэффициент заполнения g прямоугольного сигнала на выводе с ШИМ соответствует значению n / (2N - 1), где п — значение в соответствующем регистре OCR, а N — разре¬шающая способность ШИМ в разрядах (рис. 1.14).

и

и t



UAV UL

— t

Период Т = tH+ ti_ Коэффициент заполнения д = tH / Т Среднее UAV = (UH *tH + UL*tL)/ T
Рис. 1.14. Определение периода T, коэффициента заполнения д и среднего арифметического UAV пря¬моугольных импульсов напряжения U
Если регистр сравнения OCR1A/OCR1B содержит значение ТОР или 0, то на соответствующем выводе, в соответствии с правилами, представленными в табл. 1.9, постоянно поддерживаются уровень лог. 0 или лог. 1.
На рис. 1.15. на примере фиктивной трехразрядной ШИМ показано формиро¬вание неинвертированного и инвертированного выходного ШИМ-сигнала на вы¬ходе ОС 1В. На диаграмме А показан примерный вид ступенчатого сигнала, соот¬ветствующий состоянию счетчика TCNT1, на диаграмме В — неинвертирован-ный, а на диаграмме С — инвертированный выходной сигнал. Продолжительность

42 Глава 1. Архитектура микроконтроллеров AVR и PIC
периода TPWM в этом случае вычисляется в соответствии с рассмотренным выше уравнением TPWM = TT/Ci • (2N+I - 2). Таким образом, при N=3 период ШИМ-сигнала состоит из 14 периодов тактового сигнала fy/ci на входе TCNT1.
Таблица 1.9. Вывод ШИМ для особых случаев OCR1x = ТОР или OCR1x = О

СОМ1х1 СОМ1хО OCR1x Вывод ОС1х
1 и 0 0
1 0 ТОР 1
1 1 0 1
1 1 ТОР 0

t х f т/С1
t * fT/ci
20 25 t х fT/c1
Рис. 1.15. Способ формирования неинвертированных и инвертированных выходных ШИМ-сигналов
В данном примере регистр сравнения OCR1B содержит значение 5. В регист¬ре TCNT1, учитывая тот факт, что его исходное значение равно 0, значение 5 по¬является после пяти тактовых импульсов. На следующем тактовом импульсе, по¬сле распознания совпадения на выводе ОС 1В устанавливается уровень лог. 0 (рис. 1.15, В).
Регистр TCNT1 инкрементируется далее до тех пор, пока не будет достигнуто значение ТОР, которое при трехразрядной ШИМ составляет 7. Как только достиг¬нуто значение ТОР, направление счета меняется на обратное, и регистр выполняет вычитание. После девятого тактового импульса, начиная от стартового значения 0, содержимое регистра TCNT1 опять совпадает с содержимым регистра OCR1B. На следующем тактовом импульсе на выходе ОС 1В устанавливается уровень лог. 1.

Таймеры/счетчики 43
Регистр TCNT1 декрементируется далее до тех пор, пока опять не будет дос¬тигнуто значение 0. Это происходит после в общей сложности четырнадцати так¬товых импульсов, считая от начального значения 0. Таким образом завершается период ШИМ-сигнала, направление счета вновь меняется на обратное и регистр TCNT1 опять выполняет сложение. Как видно на рис. 1.15 (В), "высокая" состав¬ляющая выходного сигнала составляет 6 тактовых периодов, а "низкая" — 4. Та¬ким образом, коэффициент заполнения g = 6/10 или g = 3/5. Аналогично, диаграм¬ма С на рис. 1.15 показывает соотношения для инвертированного выходного ШИМ-сигнала.
В режиме ШИМ устанавливается флаг переполнения TOV1, если счетчик при достижении состояния 0 меняет направление счета на обратное. Это прерывание по Т/С1 при переполнении, как и при нормальной работе в режиме счетчика, вы¬зывается в том случае, если установлен флаг общего разрешения прерываний I в регистре состояния SREG, а также флаг TOIE1 в регистре TIMSK. В соответст¬вии с этим, прерывания при совпадении регистров TCNT1 и OCR 1 A/OCR IB вы¬зываются тогда, когда в регистре TIMSK установлен флаг общего разрешения прерываний и флаг OCIE1A/OCIE1B.
В отношении таймера/счетчика Т/С1 осталось рассмотреть еще регистр управ¬ления TCCR1B (адресу 0х2Е в области ввода/вывода, адрес 0х4Е в SRAM). Струк¬тура регистра TCCR1B показана на рис. 1.16.
7 6 5 4 3 2 1 0
ICNC1 ICES1 —- — СТС1 CS12 CS11 CS10
Рис. 1.16. Регистр TCCR1В таймера/счетчика Т/С1
Как уже было сказано ранее, разряды 0-2 используются для выбора частоты тактирования Т/С1 (см. табл. 1.5). Если разряд СТС1 установлен в лог. 1, то Т/С1 возвращается в состояние 0x0000 по импульсу такта системной синхронизации, следующего после совпадения содержимого счетчика и регистра сравнения А. При работе в режиме ШИМ этот разряд на процесс работы никак не влияет.
Разряд ICES1 определяет, каким образом должна осуществляться передача состояния счетчика в регистр захвата ICR1: по нарастающему (ICES 1 = 1) или по ниспадающему фронту (ICES 1=0).
Разряд ICNC1 определяет, должно ли быть активизировано подавление помех (если ICNC1 = 0, то подавление помех отключено). Для подавления кратковремен¬ных импульсов помех, которые могут привести к ошибочному запуску, входной сигнал зондируется на протяжении четырех периодов такта системной синхрониза¬ции. Только после того как будут распознаны четыре последовательных низких или высоких уровня входного сигнала, что определяется разрядом ICES1, при активном подавлении помех будет выполнена запись текущего состояния счетчика в регистр ICR1.
Т/С2
Таймер/счетчик Т/С2 обычно имеет разрядность 8 бит и реализует функции сравнения на выходе и ШИМ, аналогичные Т/С1. Основная особенность Т/С2 за¬ключается в том, что в качестве источника тактовых импульсов он может исполь¬зовать генератор, независимый от системного. Для управления Т/С2 используются два регистра: ASSR (рис. 1.17) и TCCR2 (рис. 1.18).

44 Глава 1. Архитектура микроконтроллеров AVR и PIC

7 6 5 4 3 2 1 0
_ __ __ — AS2 TCN2UBOCR2UB TCR2UB
Рис. 1.17. Регистр ASSR таймера/счетчика Т/С2
Если установить в лог. 1 разряд AS2, то в качестве источника тактовых им¬пульсов можно использовать внешний осциллятор. Оставшиеся три разряда (0-2) используются в программах для проверки того, что данные не записываются в ре¬гистры Т/С2 в тот момент, когда они обновляются аппаратно. Такая проверка не¬обходима по той причине, что осциллятор Т/С2 работает асинхронно по отноше¬нию к системному осциллятору.
7 6 5 4 3 2 1 0

PWM2

СОМ21 СОМ20

СТС2

CS22

CS21

CS20

Рис. 1.18. Регистр TCCR2 таймера/счетчика Т/С2
Установка в лог. I разряда PWM2 переводит Т/С2 в режим ШИМ. Назначение разрядов COM2! и СОМ20 идентично назначению разрядов COMlxl и СОМ 1x0 таймера/счетчика Т/С1 -— выбор режима сравнения на выходе.
Разряд СТС2 определяет, должен ли счетчик сбрасываться в нуль при совпа¬дении его содержимого с регистром сравнения. Разряды 0-2 определяют частоту тактового сигнала, полученного с помощью предварительного делителя частоты такта системной синхронизации.
Таймеры/счетчики микроконтроллеров PIC
Описанное выше применение таймеров/счетчиков микроконтроллеров AVR справедливо также и для таймеров микроконтроллеров PIC. Здесь используются аналогичные принципы измерения ширины и частоты импульсов, а также широт-но-импульсной модуляции, режимов сравнения и захвата.
В микроконтроллерах PIC могут использоваться три таймера: TMRO, TMR1 и TMR2.
TMR0
TMR0 (рис. 1.19) — это 8-разрядный таймер/счетчик. Таким образом, счет для него ограничен диапазоном 0-255. Его тактирование реализуется от внешнего ис¬точника или на основании такта системной синхронизации.
Регистр OPTION_REG
А

Внешние тактовые
импульсы

T0CS

V V v >г

rTOSE



Такт системной синхронизации

Делитель частоты

*-> Регистр TMRO

Рис. 1.19. Схема таймера/счетчика TMR0

Таймеры/счетчики 45
Для управления работой таймера TMR0 используются следующие разряды регистра OPTIONREG:
разряд 5 — T0CS — определяет выбор источника синхроимпульсов (0 — внутренний; 1 — внешний на входе TOCK.I);
разряд 4 — T0SE — определяет выбор фронта, по которому происходит увеличение содержимого счетного регистра TMR0 (0 — по нарастающему; 1 — по ниспадающему фронту тактового сигнала);
разряд 3 — PSA — использование предварительного делителя частоты (О — делитель используется для управления таймером TMR0; 1 — для управления сторожевым таймером);
разряды 0-2 — PSO, PS1, PS2 — выбор коэффициента деления частоты входного тактового сигнала (табл. 1.10).
Таблица 1.10. Назначение разрядов PSO - PS2 регистра OPTION_REG

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 используются следующие разряды регистра 1NTCON:
разряд 2 — T0IF — флаг прерывания при переполнении TMR0;
разряд 5 — Т01Е — флаг разрешения прерывания при переполнении TMR0;
разряд 7 — GIE — флаг общего разрешения прерываний.
TMR1
TMR1 (рис. 1.20) — это 16-разрядный таймер/счетчик, который может ис¬пользоваться для формирования запросов на прерывание, подобно TMR0, или же работать в режимах захвата, сравнения и ШИМ.
Тактирование таймера TMR1 осуществляется от сигнала системной синхро¬низации или от специального генератора, предназначенного для работы с относи¬тельно медленными программными приложениями. Как правило, используется кварцевый резонатор частотой 32,768 кГц.
Для управления таймером TMR1 используется регистр T1CON (рис. 1.21). На¬значение отдельных разрядов регистра T1CON:
TMRION — подключение таймера (0 — отключен, 1 — включен);
TMR1CS — выбор источника тактирующих сигналов (0 — такт системной синхронизации; 1 — генератор 32,768 кГц);

46 Глава 1. Архитектура микроконтроллеров AVR и PIC
Tl SYNC — включение/отключение синхронизация специального генера¬тора с генератором импульсов системной синхронизации (0 — включена; 1 — отключена);
TIOSCEN — разрешение/запрет тактирования таймера TMR1 от специаль¬ного генератора (0 — генератор отключен; 1 — тактирование разрешено);
T1CKPS0, T1CKPS1 — выбор коэффициента деления частоты (табл. 1.11).
Регистр T1 CON

\ со
Q. о со
О.
о
Г 1 I





1 rTIOSCEN iv. XTMR1CS
г
Генератор ^\ н
T1SYNC

1 32,768 кГц 1
г f\)


Делитель частоты Синхро¬низатор
Такт системной




синхронизаи ИИ



^



TMR10N


7
О 7
TMR1L TMR1H
Перепол¬нение
TMR1IF-TMR1IE-



Запрос на прерывание от TMR1 Рис. 1.20. Схема таймера/счетчика TMR1
5 4 3 2 1

0



T1CKPS1 T1CKPS0

T10SCENT1SYNC

TMR1CSTMR10N

Рис. 1.21. Регистр T1CON микроконтроллеров PIC
Таблица 1.11. Назначение разрядов T1CKPS0 - T1CKPS1 регистра T1CON

T1CKPS1 T1CKPS0 Коэффициент деления частоты тактового сигнала
0 0 1
0 1 2
1 0 4
1 1 8
Счетный регистр таймера TMR1 представляет собой регистровую пару TMRIH, TMR1L, а управление прерываниями осуществляется с помощью разря¬дов регистров PIR1 иР1Е1:
регистр PIR1:
• разряд 0 — TMR1IF — флаг переполнения TMR1;
• разряд 2 — ССР 1 IF — флаг прерывания при возникновении захвата по
входу;
регистр PIE1:
• разряд 0 — TMR1IE — флаг разрешения прерывания при переполнении TMR1;
• разряд 2 — ССР НЕ — флаг разрешения прерывания при возникновении захвата по'входу.

Таймеры/счетчики 47
TMR2
Назначение таймера TMR2 (рис. 1.22) — измерение временных интервалов для реализации ШИМ, обеспечения определенной скорости обмена по последова¬тельному порту и т.п. В этом смысле он подобен таймеру TMR0.
Таймер TMR2 тактируется импульсами, следующими с частотой такта сис¬темной синхронизации, деленной на четыре. Каждый раз, когда содержимое счет¬ного регистра TMR2 совпадает с содержимым регистра PR2, таймер автоматиче¬ски сбрасывается в исходное (нулевое) состояние.
Регистр T2CON

TMR20N
Такт системной синхронизации/4

М If
Делитель частоты

TMR2
Компа¬ратор

Сброс
А = В

V и Н V
Делитель

TMR2IF

PR2
Рис. 1.22. Схема таймера/счетчика TMR2
При каждом совпадении TMR2 и PR2 генерируется запрос на прерывание, частоту возникновения которого можно также масштабировать с помощью вы¬ходного делителя частоты.
Для управления таймером TMR2 используется регистр T2CON (рис. 1.23).
7 6 5 4 3 2 1 О

T0UTPS3 T0UTPS2 T0UTPS1 TOUTPSO TMR20NT2CKPS1

T2CKPS0

Рис. 1.23. Регистр T2CON микроконтроллеров PIC Назначение отдельных разрядов регистра T2CON:
T2CKPS0-T2CKPS1 —управление предварительным делителем частоты (табл. 1.12);
TMR20N — подключение таймера (0 — отключен, 1 — включен);
TOUTPS0-TOUTPS3 — выбор коэффициента деления частоты запросов на прерывание при TMR2=PR2 (табл. 1.13).
Таблица 1.12. Назначение разрядов T2CKPS0 - T2CKPS1 регистра T2CON

T1CKPS1 T1CKPS0 Коэффициент деления частоты тактового сигнала
0 0 1
0 1 4
1 X 16

Последовательный ввод/вывод 67
в большинстве случаев определяется пользователем с помощью внешних схем (через дополнительные выводы).
С помощью разрядов 1-7 адреса ведомого устройства однозначно идентифи¬цируется требуемый ведомый блок. Разряд 0 задает направление передачи дан¬ных. Он определяет, должны ли быть приняты или переданы данные. Если разряд направления передачи данных содержит лог. 1 (чтение), то ведущее устройство находится в режиме приемника, а ведомое — в режиме передатчика. Если разряд направления передачи данных содержит лог. О (запись), то ведущее устройство будет работать как передатчик, а ведомое — как приемник.
Адрес ведомого устройства также подтверждается этим устройством с помощью бита квитирования. Если ведущее устройство после адресации полу¬чает отрицательное квитирование, то оно может заключить, что ведомое устрой¬ство или вообще отсутствует, или в настоящий момент с ним невозможно устано¬вить связь (например, оно занято обработкой заданий, критическими с точки зре¬ния времени).
Работа с интерфейсом 12С в микроконтроллерах PIC
Интерфейс ГС аппаратно реализован не во всех микроконтроллерах AVR, од¬нако, благодаря высокому допустимому значению тактовой частоты, возможна его организация с помощью программного обеспечения.
В микроконтроллерах PIC обмену данными по интерфейсу 12С соответствует особый режим работы порта MSSP. Линии SCL соответствует вывод 3 порта С, а линии SDA — вывод 4 того же порта.
Для управления передачей в режиме 12С используются три регистра: уже рас¬смотренные выше SSPSTAT (см. рис. 1.38) и SSPCON1 (см. рис. 1.39), а также SSPCON2(pnc. 1.43).
Назначение разрядов регистра SSPSTAT, имеющих отношение к 12С:
BF — флаг заполнения буфера данных;
UA — устанавливается в лог. 1 в том случае, если необходимо модифици¬ровать адрес устройства (содержимое регистра SSPADD);
R/W — указывает на тип операции: 0 — запись, 1 — чтение;
S — устанавливается в лог. 1 при обнаружении условия начала передачи;
Р — устанавливается в лог. 1 при обнаружении условия завершения пере¬дачи;
D/A — признак переданного байта: 0 — байт адреса, 1 — байт данных. Назначение разрядов регистра SSPCON1, имеющих отношение к ГС:
SSPM0-SSPM3 — выбор режима работы порта MSSP (значения для ин¬терфейса I С представлены в табл. 1.22);
СКР — установка этого разряда в лог. 1 разрешает тактирование;
SSPEN — флаг разрешения работы интерфейса;
SSPOV — флаг переполнения приемного буфера;
WCOL — флаг коллизий при записи (1 — запись новых данных в буфер¬ный регистр была произведена в момент передачи).
5*

Программирование целевого устройства 105
Программирование целевого устройства
Эмуляция эмуляцией, но любая программа, предназначенная для использова¬ния в микроконтроллерах, конечно же, должна быть каким-то образом записана в память программ целевого устройства. Какое бы средство программирования для этого ни использовалось, процесс всегда выглядит одинаково:
1. Подсоединить микроконтроллер к программатору, который в свою очередь соединен с компьютером.
2. Перевести микроконтроллер в режим программирования.
3. Записать данные в память (Flash или EEPROM) с помощью специальных про¬граммный средств.
4. Вывести микроконтроллер из режима программирования.
Программаторы могут использоваться самые разнообразные, поэтому в дан¬ной книге мы затронем только вопросы, имеющие отношение к третьему пункту описанного выше процесса. Вопросы, связанные с аппаратной частью процесса программирования, можно выяснить с помощью технических описаний микро¬контроллеров и программаторов.
Программирование устройства в среде AVR Studio 4
В среде AVR Studio 4 для записи программ в память микроконтроллера сле¬дует выполнить команду меню Tools > AVR Prog. В результате откроется диалого¬вое окно, представленное на рис. 2.44. В этом окне следует ввести имя объектного файла в поле Hex file (или найти его, нажав кнопку Browse), а затем нажать кнопку Program в разделе Flash или EEPROM — в зависимости от типа памяти, в которую выполняется запись. По завершению процесса будет выдано сообщение.
В том случае, если при попытке установить связь с программатором были об¬наружены какие-нибудь проблемы (например, программатор некорректно под¬ключен, нарушен кабель или порт занят другой программой), то на экране вместо окна AVRProg появится сообщение, представленное на рис. 2.45.
-=JDJ.*i






[Flash V«#y J
! Program 1
Read 1
j EEPROM ' Program Veify j Read
i Device ' . . i Ш1ЯВ|1111
I _i Advwccd...


ШШИИИР*84'' id'
•\ No supported board found!
» A AVRprog version 1.37
i 9* J
l'"»"'T""'""t



Рис. 2.44. Диалоговое окно для записи программ в память микроконтроллера

Рис. 2.45. Сообщение о том, что связь с программатором не установлена

Директивы препроцессора 143
#rom адрес = {список} где адрес — адрес в ROM, а список — список слов через запятую. Пример:
#rom 0х2100={1, 2, 3, 4, 5, 6, 7, 8}
Директива #type
Директива препроцессора #type позволяет переопределять типы, поддержи¬ваемые компилятором. Ее синтаксис:
#type стандартный_тип=размер, стандартный_тип=размер, ...
К примеру, по умолчанию, компилятор CCS-PICC отводит под переменную типа char 8 бит, а пот переменную типа int — 16 бит (см. табл. 3.2). Для того чтобы изменить эту ситуацию, в текст программы можно добавить следующую директиву:
#type char=16, int=32
Директива fuse delay
Директива fuse delay предназначена для задания рабочей частоты процес¬сора и разрешает использование в программе внутренних функций delay_ms() (задержка в миллисекундах) и delay_us () (задержка в микросекундах). Ее син¬таксис имеет две формы:
#use delay(частота)
#use delay(частота, restart_WDT)
Частота указывается в герцах. С помощью опции restartDWT можно ука¬зать компилятору перезагружать сторожевой таймер во время программных за¬держек.
Директивы #use xxxio
Директивы вида #use xxxio влияют на код, сгенерированный при реализа¬ции доступа к портам ввода/вывода, и имеют отношение к установке регистров TRIS. В случае стандартного доступа на ввод/вывод (выбор по умолчанию), ком¬пилятор генерирует код, переводящий некоторый вывод микроконтроллера в со¬стояние входа или выхода при каждом обращении к нему. Такой способ доступа активизируется директивой препроцессора fuse stand.ard._io:
#use standard__io (X)
где х — символ порта (A...G).
Если пользователь должен устанавливать разряды регистров TRIS вручную перед обращением к соответствующим выводам напрямую или с помощью встро¬енной функции settrisx (), то в программе должна быть указана директива препроцессора #use f ast_io:
#use fast_io(X)
где X — символ порта (A...G).
Подобная по смыслу директива #use fized_io принимает в качестве пара¬метров идентификаторы выводов, устанавливаемых в качестве входов/выходов:
#use f ixed_io (X_outputs=Bbmofl, вывод, вывод...)

180 Глава 4. Программные примеры для микроконтроллеров AVR
Проект "Часы реального времени"
В завершение этой главы рассмотрим проект, реализующий с помощью мик¬роконтроллера ATmegal69 часы реального времени, используя при этом обмен данными с ПК через приемопередатчик UART.
Функция калибрования генератора синхроимпульсов
Если попытаться измерять время с помощь некалиброванного генератора им¬пульсов, встроенного в микроконтроллер, то полученные таким образом часы бу¬дут в день спешить или отставать на пару часов. И дело даже не в самом генерато¬ре — он всегда создает очень точные импульсы, однако, поскольку в процессе производства нельзя получить двух абсолютно идентичных генераторов, частота этих импульсов у разных микроконтроллеров имеет допуск в некотором диапазо¬не, что и проявляется в несовпадении с "реальным" временем.
Часы реального времени устанавливаются национальными организациями по стандартизации с помощью атомных часов. Для калибровки встроенного генера¬тора импульсов в соответствии с точными показаниями времени необходимо ис¬пользовать какую-то внешнюю микросхему, частота импульсов которой точно синхронизирована с "атомными часами". Для калибровки генератора синхроим¬пульсов, работающего с частотой 8 МГц, можно, например, воспользоваться внешней тактирующей микросхемой с частотой 32768 кГц. Подобные микросхе¬мы "часов" характеризуются высокой точностью и дешевизной.
Техническое описание одной из таких микросхем: Е1217Х от компании ATMEL — можно найти на прилагаемом к книге компакт-диске в файле Projects\DataSheets\E1217X . pdf.
Итак, для точного замера длительности некоторого периода времени следует подсчитывать импульсы, генерируемые микросхемой "часов". Например, если ко¬личество импульсов достигнет значения 32768, то мы точно знаем, что прошла одна секунда. На практике для калибровки внутреннего генератора синхроим¬пульсов микроконтроллера используется период гораздо меньшей длительности.
Теоретически, в случае осциллятора микроконтроллера частотой 8 МГц, на восемь миллионов импульсов должно уйти столько же времени, сколько и на 32768 импульсов микросхемы "часов" (то есть, одна секунда), и для калибровки следует просто сопоставить эти два временных отрезка.
Однако на практике совсем не обязательно вести подсчет восьми миллионов импульсов, — в качестве эталона вполне можно использовать более короткий промежуток времени и, соответственно, значительно сократить количество опера¬ций подсчета. Если выбранное количество импульсов окажется недостаточным для достижения заданного периода времени, мы изменим значение в соответст¬вующем регистре, чтобы "догнать" часы, а если слишком велико — изменим это значение, чтобы "подождать" часы. Эту подстройку будем выполнять в цикле до тех пор, пока не добьемся максимально возможной точности измерения.
С целью калибровки (для микроконтроллера ATmegal69, содержащего для этого особые регистры) разработаем специальную функцию, код которой пред¬ставлен в листинге 4.13.

ПРИЛОЖЕНИЕ В

Система команд микроконтроллеров AVR

Ниже, в описании машинных команд микроконтроллеров AVR будут исполь¬зованы некоторые условные обозначения. Перечислим их:
С — флаг переноса (разряд 0 регистра SREG);
Z — нулевой флаг (разряд 1 регистра SREG);
N — флаг отрицательного результата (разряд 2 регистра SREG);
V — флаг переполнения при вычислениях в дополнительных кодах (разряд
3 регистра SREG);
S — флаг знака (разряд 4 регистра SREG); S = N © V;
Н — флаг половинного переноса (разряд 5 регистра SREG);
Т — флаг копирования (разряд 6 регистра SREG);
I — флаг общего разрешения прерываний (разряд 7 регистра SREG);
Rd — регистр назначения в регистровом файле;
Rr — передающий регистр;
R — результат выполнения некоторой команды;
Кп — n-битная константа (например, К8 = 1 байт);
к — адресная константа для работы со счетчиком команд (PC);
b — идентификатор некоторого разряда в рабочем регистре или в регистре ввода/вывода (3 бита);
s — указывает на некоторый разряд в регистре состояния SREG;
X, Y, Z — указатель при косвенной адресации (X = R27:R26, Y = R29:R28, Z = R31:R30);
RAMPZ, RAMPY, RAMPZ — регистры, связанные с указателями X, Y и Z для формирования косвенных адресов > 64 Кбайт;
Rdl — младший байт регистровой пары Rdh:Rdl;
Rdh — старший байт регистровой пары Rdh.Rdl;
Р — адрес некоторого порта ввода/вывода;
q — смещение при косвенной адресации;
Стек — область памяти для хранения адреса возврата или регистр проме¬жуточного хранения данных;
SP — указатель вершины стека.
 

Программирование
на языке С для AVR и PIC
микроконтроллеров

Краткое оглавление
ГЛАВА 1. АРХИТЕКТУРА МИКРОКОНТРОЛЛЕРОВ AVR и PIC 22
Память 22
Обработка прерываний 28
Сброс 35
"Спящие" режимы процессора 36
Таймеры/счетчики 36
Сторожевой таймер 49
Параллельные порты ввода/вывода 51
Последовательный ввод/вывод 53
Аналого-цифровое преобразование 69
ГЛАВА 2. КОМПИЛЯТОРЫ И СРЕДСТВА РАЗРАБОТКИ 74
Программное обеспечение для микроконтроллеров AVR 74
Программное обеспечение для микроконтроллеров Р1С 86
Программирование целевого устройства 105
ГЛАВА 3. Язык С и ДИРЕКТИВЫ ПРЕПРОЦЕССОРА 107
Вводные понятия 107
Структура программы на С 1 10
Типы данных, переменные, константы 111
Функции 117
Структуры 120
Указатели и адреса переменных 121
Массивы и строки 124
Операторы ветвления 126
Циклические конструкции 127
Стандартные функции ввода/вывода 130
Директивы препроцессора 134
Обработка прерываний 145
Исполнение ассемблерного кода 149
ГЛАВА 4. ПРОГРАММНЫЕ ПРИМЕРЫ ДЛЯ МИКРОКОНТРОЛЛЕРОВ AVR 156
Вывод некоторого числа по нажатию кнопки 156
Бегающие "глаза" 157
Индикатор, мигающий каждую секунду 158
Переключение индикаторов по нажатию кнопки 159
Прием символа от ПК через интерфейс RS-232 и передача в ответ
строки с помощью UAR.T 160
Светофор, управляемый напряжениями разного уровня на
аналоговом входе микроконтроллера 162
Обмен данными по интерфейсу SP1 163

4
Управление яркостью свечения светодиода с помощью
широтно-импульеной модуляции 164
Измерение ширины импульсов 168
Измерение скорости вращения двигателя с отображением результата
на ЖК-дисплее 169
Контроль скорости вращения вентилятора с учетом показаний
датчика температуры 174
Проект "Часы реального времени'1 180
ГЛАВА 5. ПРОГРАММНЫЕ ПРИМЕРЫ ДЛЯ МИКРОКОНТРОЛЛЕРОВ PIC 195
Отображение состояния выводов порта 195
Управление частотой мерцания светодиодов с помощью различных
таймеров 196
Управление светофорами на перекрестке 197
Секундомер 201
Обмен данными в режиме PSP 203
Контроль предельной Скорости вращения двигателя 204
Обмен данными по шине CAN 206
Обмен данными по интерфейсу ГС , 221
Индикация уровня напряжения на аналоговом входе 222
ПРИЛОЖЕНИЕ А. ТАБЛИЦА СИМВОЛОВ ASCII ., 224
ПРИЛОЖЕНИЕ Б. ПРЕОБРАЗОВАНИЕ ИЗ ОДНОЙ СИСТЕМЫ СЧИСЛЕНИЯ В ДРУГУЮ 225
ПРИЛОЖЕНИЕ В. СИСТЕМА КОМАНД МИКРОКОНТРОЛЛЕРОВ AVR 228
Алфавитный перечень команд 229
Команды по категориям 258
ПРИЛОЖЕНИЕ Г. СИСТЕМА КОМАНД МИКРОКОНТРОЛЛЕРОВ PIC 264
Алфавитный перечень команд 264
Команды по категориям 285
ПРИЛОЖЕНИЕ Д. БИБЛИОТЕЧНЫЕ ФУНКЦИИ И МАКРООПРЕДЕЛЕНИЯ 289
Стандартные функции 289
Функции и макроопределения компилятора WinAVR 306
Функции и макроопределения компилятора CCS-P1CC 340

Содержание 5
Содержание
ВВЕДЕНИЕ , 20
ГЛАВА 1. АРХИТЕКТУРА МИКРОКОНТРОЛЛЕРОВ AVR и PIC 22
ПАМЯТЬ 22
Память данных 23
Регистры общего назначения '. 23
Регистры специальных функций микроконтроллеров PIC 24
Область ввода/вывода микроконтроллеров AVR 24
Регистр состояния SREG микроконтроллеров AVR 25
Внутренняя и внешняя память SRAM микроконтроллеров AVR 26
Стек 26
Память программ 27
Память ЕЕР ROM микроконтроллеров AVR 27
Запись в память EEPROM 28
Чтение из памяти EEPROM 28
ОБРАБОТКА ПРЕРЫВАНИЙ 28
Управление прерываниями в микроконтроллерах AVR 30
Регистр GIMSK 30
Регистр GIFR 31
Регистры TIMSK и TIFR 31
Управление прерываниями в микроконтроллерах PIC 32
Микроконтроллеры серии Р1С17Сх 32
Микроконтроллеры серии Р1С18Сх 33
СБРОС 35
"СПЯЩИЕ" РЕЖИМЫ ПРОЦЕССОРА 36
ТАЙМЕРЫ/СЧЕТЧИКИ 36
Таймеры/счетчики микроконтроллеров AVR 37
Т/СО 38
T/C1 39
T/C2 43
Таътеры/счетчики микроконтроллеров Р1С 44
TMR0 44
TMR1 45
TMR2 : 47
Модуль ССР 48
СТОРОЖЕВОЙ ТАЙМЕР 49
ПАРАЛЛЕЛЬНЫЕ ПОРТЫ ВВОДА/ВЫВОДА 51
Режим PSP порта D микроконтроллеров Р1С 52
ПОСЛЕДОВАТЕЛЬНЫЙ ввод/вывод 53
Приемопередатчик UARTмикроконтроллеров A VR 53
Настройка скорости передачи данных через UART 55
Приемопередатчик USARTмикроконтроллеров PIC 56
Синхронная передача данных по интерфейсу SPI 57
Регистры управления и состояния SPI в микроконтроллерах AVR 59
Регистры управления и состояния SPI в микроконтроллерах PIC 62
Синхронная передача данных по интерфейсу 12С 63

Протокол шины ГС 64
Адресация ведомых устройств 66
Работа с интерфейсом Г'С в микроконтроллерах PIC 67
Модуль шины CAN 68
АНАЛОГО-ЦИФРОВОЕ ПРЕОБРАЗОВАНИЕ 69
Встроенный аналоговый компаратор 77
ГЛАВА 2. КОМПИЛЯТОРЫ И СРЕДСТВА РАЗРАБОТКИ 74
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ для МИКРОКОНТРОЛЛЕРОВ AVR 74
Разработка и компиляция программ в Programmers Notepad. 74
Эмуляция и отладка программ в среде AVR Studio 4 78
Окно Workspace 81
Окна Memory 82
Окно Register 83
Окно Watch 84
Отладка программы 84
Настройка параметров имитатора 85
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ДЛЯ МИКРОКОНТРОЛЛЕРОВ PIC 86
Разработки и компиляция программ в среде CCS-PJCC 86
Создание проектов CCS-PICC вручную 86
Создание проектов CCS-P1CC с помощью PIC Wizard 89
Открытие и добавление в проект файлов с исходным кодом 95
Компиляция проекта 95
Меню Tools 96
Эмуляция и отладка программ в среде Microchip MPLAB 7.31 97
Рабочая область и проект MPLAB 98
Компиляция под управлением MPLAB 100
Настройка режима отладки/эмуляции 100
Работа в режиме отладки/эмуляции 102
Окна отладчика 103
ПРОГРАММИРОВАНИЕ ЦЕЛЕВОГО УСТРОЙСТВА 105
Программирование устройства в среде AVR Studio 4 105
Программирование устройств в среде CCS-P1CC 106
Программирование устройств в среде MPLAB 106
ГЛАВА 3. Язык С и ДИРЕКТИВЫ ПРЕПРОЦЕССОРА 107
ВВОДНЫЕ понятия 107
СТРУКТУРА ПРОГРАММЫ НА С 110
Типы ДАННЫХ, ПЕРЕМЕННЫЕ, КОНСТАНТЫ 111
Правила преобразований из одной системы счисления в другую 112
Тип char 113
Пользовательские типы 113
Переменные /14
Область видимости переменных 114
Константы 115
Перечислимые типы 116
Приведение типов 116
Оператор sizeof 116

Содержание
ФУНКЦИИ 117
Возвращаемые значения 118
Прототипы функций 118
Классы памяти при объявлении локальных переменных 119
Рекурсия 119
СТРУКТУРЫ 120
УКАЗАТЕЛИ и АДРЕСА ПЕРЕМЕННЫХ 121
Передача в функции параметров по ссылке 122
Указатели на структуры 123
МАССИВЫ И СТРОКИ 124
Строки 125
Многомерные массивы 125
ОПЕРАТОРЫ ВЕТВЛЕНИЯ 126
Оператор if-else 126
Условные выражения 126
Оператор switch-case 127
ЦИКЛИЧЕСКИЕ КОНСТРУКЦИИ 127
Конструкция while 128
Конструкция for 128
Конструкция do~while 129
Организация бесконечных циклов 129
Операторы Ьге a к и con tinue J 29
СТАНДАРТНЫЕ ФУНКЦИИ ВВОДА/ВЫВОДА 130
Ввод/вывод символов с помощью функций getchar () и putchar () 130
Функции вывода строк puts () и print f () 131
Функции ввода строк gets () и scanf () 133
ДИРЕКТИВЫ ПРЕПРОЦЕССОРА 134
Директива #include 134
Директива #define 134
Директивы условной компиляции 136
Директива #error 138
Директивы, характерные для компилятора CCS-PICC 138
Директива #bit 138
Директива #byte 138
Директива #case 138
Директива #device 139
Директива #fuse 139
Директива #locate 141
Директива #org 141
Директива #opt 142
Директива #priority 142
Директива #reserve 142
Директива #rom 142
Директива #type 143
Директива #use delay 143
Директивы #use xxx_io 143
Директива #use i2c 144
Директива #use rs232 144

Директива #zero__ram 145
ОБРАБОТКА ПРЕРЫВАНИЙ 145
Обработка прерываний в среде WinAVR 145
Обработка прерываний в среде CCS-PJCC 148
ИСПОЛНЕНИЕ АССЕМБЛЕРНОГО КОДА 149
Использование ассемблера в компиляторе Win A VR 149
Ассемблерный код 150
Входные и выходные операнды 150
Резервирование регистров 152
Использование ассемблера в компиляторе CCS-PICC 154
ГЛАВА 4. ПРОГРАММНЫЕ ПРИМЕРЫ ДЛЯ МИКРОКОНТРОЛЛЕРОВ AVR 156
Вывод НЕКОТОРОГО ЧИСЛА ПО НАЖАТИЮ КНОПКИ 156
БЕГАЮЩИЕ "ГЛАЗА" 157
ИНДИКАТОР, МИГАЮЩИЙ КАЖДУЮ СЕКУНДУ 158
ПЕРЕКЛЮЧЕНИЕ ИНДИКАТОРОВ ПО НАЖАТИЮ КНОПКИ 159
ПРИЕМ СИМВОЛА ОТ ПК ЧЕРЕЗ ИНТЕРФЕЙС RS-232 и ПЕРЕДАЧА В ОТВЕТ СТРОКИ
с помощью U ART 160
СВЕТОФОР, УПРАВЛЯЕМЫЙ НАПРЯЖЕНИЯМИ РАЗНОГО УРОВНЯ НА АНАЛОГОВОМ
ВХОДЕ МИКРОКОНТРОЛЛЕРА 162
ОБМЕН ДАННЫМИ по ИНТЕРФЕЙСУ SPI 163
УПРАВЛЕНИЕ ЯРКОСТЬЮ СВЕЧЕНИЯ СВЕТОДИОДА С ПОМОЩЬЮ
ШИРОТНО-ИМПУЛЬСНОЙ МОДУЛЯЦИИ 164
ИЗМЕРЕНИЕ ШИРИНЫ ИМПУЛЬСОВ 168
ИЗМЕРЕНИЕ СКОРОСТИ ВРАЩЕНИЯ ДВИГАТЕЛЯ С ОТОБРАЖЕНИЕМ РЕЗУЛЬТАТА НА
ЖК-ДИСПЛЕЕ 169
КОНТРОЛЬ СКОРОСТИ ВРАЩЕНИЯ ВЕНТИЛЯТОРА С УЧЕТОМ ПОКАЗАНИЙ
ДАТЧИКА ТЕМПЕРАТУРЫ 174
ПРОЕКТ "ЧАСЫ РЕАЛЬНОГО ВРЕМЕНИ" 180
Функция калибрования генератора синхроимпульсов 180
Размещение строк во флэш-памяти 183
Преобразование времени, выраженного в секундах, в понятную форму
с помощью двоично-десятичной арифметики 184
Программная реализация часов реального времени 185
ГЛАВА 5. ПРОГРАММНЫЕ ПРИМЕРЫ ДЛЯ МИКРОКОНТРОЛЛЕРОВ PIC 195
ОТОБРАЖЕНИЕ состояния ВЫВОДОВ ПОРТА 195
УПРАВЛЕНИЕ ЧАСТОТОЙ МЕРЦАНИЯ СВЕТОДИОДОВ с помощью
РАЗЛИЧНЫХ ТАЙМЕРОВ 196
УПРАВЛЕНИЕ СВЕТОФОРАМИ НА ПЕРЕКРЕСТКЕ 197
СЕКУНДОМЕР 201
ОБМЕН ДАННЫМИ В РЕЖИМЕ PSP 203
КОНТРОЛЬ ПРЕДЕЛЬНОЙ СКОРОСТИ ВРАЩЕНИЯ ДВИГАТЕЛЯ 204
ОБМЕН ДАННЫМИ по ШИНЕ С AN 206
ОБМЕН ДАННЫМИ ПО ИНТЕРФЕЙСУ 12С 221
ИНДИКАЦИЯ УРОВНЯ НАПРЯЖЕНИЯ НА АНАЛОГОВОМ ВХОДЕ 222
ПРИЛОЖЕНИЕ Л. ТАБЛИЦА СИМВОЛОВ ASCII 224

Содержание 9
ПРИЛОЖЕНИЕ Б. ПРЕОБРАЮВАНИЕ ИЗ ОДНОЙ СИСТЕМЫ СЧИСЛЕНИЯ В ДРУГУЮ 225
ПРИЛОЖЕНИЕ В. СИСТЕМА КОМАНД МИКРОКОНТРОЛЛЕРОВ AVR 228
АЛФАВИТНЫЙ ПЕРЕЧЕНЬ КОМАНД 229
ADC 229
ADD 229
ADIW 229
AND 229
AND1 230
ASR 230
BCLR 230
BID 230
BRBC 231
BRBS. 231
BRCC 231
BROS 231
BREQ 232
BRGE 232
BRHC 232
BRHS 232
BR1D 233
BRIE 233
BRLO 233
BRLT 233
BRM1 234
BRNE 234
BRPL 234
BRSH 235
BRTC 235
BRTS 235
BRVC 235
BRVS. 236
BSET. 236
BST 236
CALL 236
CBI 237
CBR 237
CLC 23n
CLH 237
CLI 237
CLN 238
CLR 238
CLS 238
CLT. 238
CLV 239
CLZ 239
COM 239
CP 239

СРС
CPI 240
CPSE 240
DEC 240
ELPM 241
EOR 241
FMUl 241
FMULS 241
FMULSU 242
/CALL 242
UMP 242
IN 242
INC 243
JMP 243
LD(LDD) 243
Косвенная загрузка из SRAM в регистр с помощью указателя X 243
Косвенная загрузка из SRAM в регистр с помощью указателя Y 244
Косвенная загрузка из SRAM в регистр с помощью указателя Z 244
LDI 245
LDS 245
LPM 245
LSL 245
LSR 246
MOV 246
MOVW 246
MUL 246
MULS 247
MULSU. 247
NEG 247
NOP 247
OR 248
ORI 248
OUT 248
POP 248
PUSH. 249
RCALL 249
RET. 249
RET1 249
RJMP 250
ROL 250
ROR 250
SBC 250
SBCl 251
SBI 251
SBIC 251
SBIS 251
SBIW 252
SBR 252

Содержание 11
SBRC 252
SBRS 252
SEC 253
SEH 253
SEI 253
SEN 253
SER 253
SES 254
SET 254
SEV 254
SEZ 254
SLEEP 254
SPM 255
ST(STD) 255
Косвенное сохранение содержимого регистра в SRAM с помощью указателя X 255
Косвенное сохранение содержимого регистра в SRAM с помощью указателя Y 255
Косвенное сохранение содержимого регистра в SRAM с помощью указателя Z 256
STS 256
SUB 257
SUB! 257
SWAP 257
TST 257
WDR 257
КОМАНДЫ по КАТЕГОРИЯМ 258
ПРИЛОЖЕНИЕ Г. СИСТЕМА КОМАНД МИКРОКОНТРОЛЛЕРОВ PIC 264
АЛФАВИТНЫЙ ПЕРЕЧЕНЬ КОМАНД 264
ADDLW 264
ADDWF 265
ADDWFC 265
ANDLW 265
ANDWF 265
ВС 266
BCF 266
BN 266
BNC 266
BNN 266
BNOV 267
BNZ 267
BOV 267
BRA 267
BSF 267
BTFSC 268
BTFSS 268
BTG 268
BZ 268
CALL 269
CLRF 269

и

CLRW 269
CLRWDT 270
COMF. 270
CPFSEQ 270
CPFSGT 270
CPFSLT 2V
DAW 271
DCFSNZ 271
DECF 271
DECFSZ 272
GOTO 272
1NCF 272
INCFSZ. 272
INFSNZ 273
IORLW 273
10RWF 273
1С ALL 274
LFSR 274
MOVF 274
MOVFF 274
MOVFP 274
MOVLli 275
MOVLR 275
MOVLW , 275
MOVPF 275
MOVWF 275
MULLW 276
MULWF 276
NEGF 276
NEGW. 276
NOP 277
OPTION 277
POP 277
PUSH 277
RCALL 277
RESET 278
RETFJE 278
RETLW 278
RETURN 278
RLCF 279
RLE 279
RLNCF 279
RRCF 279
RRF 280
RRNCF 280
SETF 280
SLEEP 281
281
SUBFWB

Содержание 13
SUBLW 281
SVBWF 281
SUBWFB 282
SWAPF 282
TABLRD 282
TABLWT 283
TLRD 283
TLWT 283
TSTFSZ 284
TRIS 284
XORLW. 284
XORWF 284
КОМАНДЫ ПО КАТЕГОРИЯМ 285
ПРИЛОЖЕНИЕ Д. БИБЛИОТЕЧНЫЕ ФУНКЦИИ И МАКРООПРЕДЕЛЕНИЯ 289
СТАНДАРТНЫЕ ФУНКЦИИ 289
Математические 289
abs 289
acos 289
asin 289
atcm 289
atan2 290
ceil 290
cosh 290
div 290
exp 290
fabs 290
floor 291
fmod 291
frexp 291
labs 291
Idexp 291
Idiv 292
log 292
loglO 292
modf 292
pow 292
sin 292
sinh 293
sqrt 293
tan : 293
tanh 293
Для работы со строками 293
atoi 293
atol 294
sprintf 294
strcat 294
strchr 295

strcmp 295
strcpy 295
strlen 296
srrlwr 296
strncmp 296
strncpy 297
strrchr 297
strstr 297
strtod 298
strcol 298
strtoul 299
Для работы с символами 299
is allium 299
isalpha 299
iscntrl 300
isdigit 300
isgraph 300
is lower 301
i sprint 301
ispunct 302
is space 302
i supper 302
isxdigit 303
tolower 303
toupper 303
Для работы со случайными числами 303
rand 303
srand 304
Для работы с памятью 304
memchr 304
memcmp 304
merncpy 305
memmove 305
memset 306
ФУНКЦИИ И МАКРООПРЕДЕЛЕНИЯ КОМПИЛЯТОРА WINAVR 306
Математические макроопределения 306
М_Р1 306
M_SQRT2 306
RAND_МАХ 306
RANDOM__MAX 306
Математические функции 306
inverse 306
isinf 307
square 307
Функции для работы со строками 307
dtostre 307
dtostrf 308
itoa 308

Содержание 15
ltoa 308
snprintf 309
snprintf_P 309
sprint f_P 309
strcasecmp 310
scrlcat 310
strlcpy 311
strncasecmp 311
srrncat 311
strnlen 312
strrev 312
strsep 312
strtok_r 313
srrupr 314
ultoa 314
utoa 314
Макроопределения для работы со строками, хранимыми во флэш-памяти 315
PGM_P 315
pgm_read_byte 315
pgm_read_byte_far 315
pgm_read_byte__near 315
pgm_read_word 315
pgm_read_word_far 315
pgm_read__word__near 316
PGM_VOID__P 316
PSTR 316
Функции для работы со строками, хранимыми во флэш-памяти 316
memcpy_P 316
strcasecmp_P 317
strcat_P 317
strcmp_P 318
strcpy_P 318
strlcat_P 318
strlcpy_P 319
strlen_P 319
strncasecmp__P 320
strncat_P 320
strncmp_P 320
strncpy_P 321
Функции для работы с символами 32 J
isascii 321
isblank 322
toascii 322
Макроопределения для организации ввода/вывода 322
FILE 322
getc 323
get char 323
put с 323

put char 323
stcierr 323
st dm 323
stdout 323
Функции ввода/вывода 324
с lea re г г 324
f close 324
fdevopen 324
fecf 325
terror 325
fgete 325
tgets 326
fprintf 326
f print f_P 326
tputc 326
fputs 327
f puts_P 327
tread 327
fscant 327
fscanf_P 328
f write 328
gets 328
printf 328
printf_P 329
puts 329
puts^P 329
scant 329
scanf_P 330
sscanf 330
sscanfP 330
Функции управления микроконтроллером 331
abort 33 1
_delay_loop_l 33 1
_deiay_loop_2 331
exit 331
set_sleep_mode 33 1
si eep^mode 332
Функции для работы с таймерами микроконтроллера 332
timerO_source 332
timerO_stop 332
timer0_s cart 332
timer_enable___int 333
Макроопределения для работы со сторожевым таймером 333
wdt_di sable 333
wdt_enable 333
wdt_reset 334
wdt_write 334
Функции для работы со случайными числами 334

2 — 6-767

Содержание 17
random 334
s random 334
Функции для работы с памятью 335
calloc 335
free 335
malloc 335
memccpy 335
Макроопределения для обработки прерываний 336
cli 336
EMPTY_INTERRUPT 336
INTERRUPT 336
sei 336
SIGNAL 336
Макроопределения для работы с разрядами регистров 336
__BV , 336
bit_is_clear 337
bit_is_set 337
loop_until_bit_is_clear 337
loop_until_bit_is_set 337
Макроопределения для работы с памятью EEPROM 337
eeprom_busy_wait 337
eeprom_is_ready 337
Функции для работы с памятью EEPROM. 338
eeprom_read_block 338
eeprom_read_byte 338
eeprom_read__word 338
eeprom_write_block 339
eeprorn_write__byte 339
eeprom_write_word 339
ФУНКЦИИ И МАКРООПРЕДЕЛЕНИЯ КОМПИЛЯТОРА CCS-PICC 340
Математические макроопределения 340
LN2 340
LN10 340
PI 340
PI_DIV__BY_TWO 340
RAND_MAX 340
SQRT2 340
TWOBYPI 340
Функции для работы со строками 340
atof 340
atoi32 341
strcspn 341
stricmp 342
strpbrk 342
strspn 343
strtok 343
Функции ввода/вывода 344
assert 344

fgetc 344
fgets 345
fprintf 345
fputc 346
fputs 346
get с 347
gets 347
input 348
input__X 348
kbhit 349
output_bit 349
output_f loat 350
output_high 350
output_low 351
output_X 352
port_b_pullups 352
print f 352
put с 353
puts 353
set_tris_X 354
set__uart_speed 354
sprint f 355
Функции управления микроконтроллером 356
delay__cycles 356
delay_ms 356
delay_us 357
disable_interrupts 358
enable_interrupts 359
ext_int_edge 360
reset_cpu 361
restart_cause 361
sleep 362
Функции для работы с таймерами имодулем ССР 363
get_rtcc 363
get_timerX 363
restart_wdt 364
set_pwmX_duty 365
set_rtcc 365
set_timerX 366
setup_ccpX 366
setup_timer_X 367
setup_wdt 369
Функции для работы с разрядами и памятью 370
bit_clear 370
bit_set 370
bit_test 371
input 371
make 16 372

Содержание
make32 372
make 8 373
offsetof 373
offsetofbit 374
read__bank 374
rotate_left 375
rotate_right 375
shift_left 376
shift_right 376
swap 377
write_bank 377
Функции для работы с памятью EEPROM. 378
read_eeprom 378
write_eeprom 379
read_program_eeprom 379
write_program_eeprom 380
Функции для работы с интерфейсом SPI 381
setup_spi '381
spi_data_is_in 382
spi_read 382
spi_write 383
Функции для работы с интерфейсом PSP 384
psp_input_full 384
psp_output_full 384
psp_overflow 385
setup_psp 385
Функции для работы с интерфейсом 12С. 386
i2c_poll 386
i2c_read 386
i2c_start 387
 

 
Сайт управляется системой uCoz