Программная реализация SPI интерфейса, на примере подключения термопары K-типа, через адаптер MAX6675 к микроконтроллеру ATmega8
разделы: SPI , MAX6675 , AVR , дата: 23 октября 2015г
SPI? Легко!
В одном из предыдущих постов, я рассказывал про подключение термопары к Arduino. Теперь настало время рассмореть подключение к AVR микроконтроллерам на чистом Си, благо, как выяснилось, это совсем не сложно.
Напомню, что термопара подключается через адаптер MAX6675, который в свою очередь подключается к микроконтроллеру через SPI интерфейс.
После I2C, SPI интерфейс скорее всего покажется очень простым. Если расмотреть аппаратную реализацию SPI, то там есть регистр данных SPDR, записью или чтением с которого и осуществляется вся работа c SPI.
Программная реализация, как выяснилось, не намного сложнее, но сначала о том, что такое SPI. Фирменный аппнот к SPI можо найти на сайте Atmel: AVR151: Setup And Use of The SPI
рассмотрим схему подключения взятую оттуда:
-
Основные моменты:
- К интерфейсу возможно подключение нескольких устройств, но единовременно возможна работа только с одним из них.
- Используется концепция master-slave(дирижер
- В минимальном варианте, имеется две управляющие линии: SCK по которой генерируется синхронизирующие импульсы(она общая для всех), и линия выбора устройства SS(Slave Select). Другое ее обозначение: CS(Chip Select).
- Каждое добавленное SPI устройство увеличивает интерфейс на еще одну SS/CS линию.
- Интерфейс полнодуплексный, линия MISO (Master In Slave Out) отвечает за прием(относительно мастера), линия MOSI отвечает за предачу.
- Имеется четыре режима работы SPI. Фаза SCK изначально имеет низкий уровень в mode 0, и высокий в mode 3. Чтение осуществляется по нарастающему фронту.
- В режимах 1 и 3 чтение осуществляется по падающему фронту. Встречаются редко, если верить книге “Практическое программирование микроконтроллеров AVR” Юрия Ревича, глава 11.
- Упрощеный вариант SPI состоит из трех линий. В таком случае связь идет только на прием или только на передачу.
Вот именно такой упрощеный режим используется в MAX6675. Документация:MAX6676 datasheet
Предлагаю еще раз взглянуть на формат передачи:
Данные передаются пакетами по два байта. Под температуру отводится 12 бит. 15-й бит, бит знака. LSB – младший значащий бит, MSB – старший значащий бит. Оффициальная легенда:
Значение температуры передается в градусах Цельсия, в диапазоне от 0 до 1024. 1024 – это десять бит, в то время как данные передаются 12-битным форматом.
Значит, чтобы получить значение в градусах, нужно будет полученое число разделить на 4. Меня немного смутил второй бит, device ID. В смысле я не очень понимаю как может один бит служить идентификатором.
Его скорее можно назвать битом корректности.
Если припомнить, то в случае с Arduino я использовал библиотеку: MAX6675-library
На проверку, там оказался довольно простой код:
Я решил не изобретать велосипед, и переписать код на чистом Си. В качестве шаблона использовал проект из предыдущего поста. Я отбросил файлы относящиеся к TWI, после чего осталось переписать main.c в соответсвии со своими целями:
#include
#include
#include #define pSCLK PD6
#define pCS PD5
#define pMISO PD4
#define ddrPORT DDRD
#define csPORT PORTD
#define sclkPORT PORTD
#define misoPIN PIND static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
uint8_t spi_read(void); int main(void)
{ init_uart(); DDRB |= (1
Источник: http://www.count-zero.ru/2015/spi/
Читаем даташит на примере ATmega8
Как читать даташит на Atmega8?
Может быть кто не в курсе, даташит — это техническое описание на какую-либо радиодетальку.
Где его найти? Ну, конечно же, в интернете! Но так почти вся радиоэлектронная продукция выпускается «за бугром», то и описание на них, соответственно, «забугорское», а точнее, на английском языке.
Те, кто хорошо дружит с разговорным английским, не факт, что сможет прочитать технические термины в даташитах.
Давайте попробуем пролить свет истины на основные характеристики МК ATmegа8. Для этого качаем даташит. В нашей статье мы будем рассматривать только основные сведения нашего подопечного.
Вот что мы видим на первой странице даташита:
Итак, погнали!
Запоминаем правило: в фирменном описании нет ни одного лишнего слова! (иногда информации не хватает, но это уже другой случай)
Features. Переводится как «функции». В среде электронщиков просто «фичи».
— High Performance, Low Power AVR® 8-Bit Microcontroller
Высокопроизводительный, потребляющий мало энергии, 8-битный микроконтроллер.
Понимаем как рекламу, единственно полезное то, что данный микроконтроллер — 8 битный.
— Advanced RISC Architecture
Расширенная RISC архитектура.
RISC и CISC — технологии построения процессорных систем. Но нам это не важно, по крайней мере, пока.
— 130 Powerful Instructions – Most Single Clock Cycle Execution
130 команд, большинство из них выполняются за один цикл.
А вот это уже интереснее! Во-первых, такое большое количество команд (например, у микроконтроллеров PIC всего 35 команд) уже подразумевает ориентацию этого МК под языки высокого уровня.
Во-вторых, узнаем, что одна команда выполняется за один такт генератора. Т.е., при тактовой частоте 1 МГц одна команда будет выполняться 1 микросекунду (1 мкс, одну миллионную часть секунды — 10^-6).
А при 10 МГц — в десять раз быстрее, т.е., 0,1 мкс.
— 32 x 8 General Purpose Working Registers
32 восьмибитных регистра общего пользования.
Про регистры поговорим позднее, просто запомним, что большое количество регистров — весьма неплохо, ведь регистр — это ячейка памяти в самом МК. А чем больше такой памяти – тем «шустрее» работает МК!
Объединив эти данные с количеством поддерживаемых микроконтроллером команд, в очередной раз убеждаемся в изначальной ориентации данного МК под высокоуровневые языки вроде Си, Паскаля и других.
— Fully Static Operation
Полностью статическая структура.
Вспоминаем о типах памяти: динамической и статической. Этот пункт заверяет нас, что МК сохранит свою работоспособность при тактовой частоте ниже сотен герц и даже при отсутствии тактовой частоты на его специальных выводах.
(Также нелишним будет напомнить о том, что потребляемая мощность большинства типов МК напрямую зависит от тактовой частоты: чем выше тактовая частота, тем больше он потребляет)
— Up to 16 MIPS Throughput at 16 MHz
До 16 миллионов выполняемых команд при тактовой частоте 16 МГц.
За одну секунду при тактовой частоте 16 МГц может быть выполнено до 16 000 000 команд! Следовательно, одна однобайтовая команда может быть выполнена за 0,07 мкс. Весьма недурно для маленькой микросхемы.
С учетом предыдущего пункта понимаем, как работает на частотах от 0 Гц до 16 МГц.
— On-chip 2-cycle Multiplier
В данном МК имеется встроенный умножитель, который умножает числа за два такта.
Ну, это хорошо. Даже очень. Но мы пока не будет вгрызаться в эти нюансы…
— High Endurance Non-volatile Memory segments
Надежная энергонезависимая память, построенная в виде нескольких сегментов.
Вспоминаем типы памяти: EEPROM и FLASH.
— 8KBytes of In-System Self-programmable Flash program memory
— 8 Кбайт встроенной в МК памяти. Память выполнена по технологии Flash. В самом МК имеется встроенный программатор.
Этот объем весьма хорош! Для обучения (да и не только) — с запасом. А наличие встроенного программатора этой памяти, позволяет загружать данные в память, используя простой внешний программатор (в простейшем случае это пять проводков, которыми микроконтроллер подключают к LPT порту компьютера).
— 256 Bytes EEPROM
В МК имеется 256 байт энергонезависимой памяти EEPROM.
Следовательно, можно сохранить еще дополнительную информацию, которую можно изменять программой МК, без внешнего программатора.
— 1024 Bytes Internal SRAM
В МК имеется 1024 байт оперативной памяти (ОЗУ/RAM).
Также весьма приятный объем
— Write/Erase cyles: 10,000 Flash/100,000 EEPROM
Память Flash выдерживает 10 000 циклов записи/стирания, а память EEPROM — до 100 000
Проще говоря, программу в МК можно изменять до 10 000 раз, а свои данные в 10 раз больше.
— Data retention: 20 years at 85°C/100 years at 25°C
Сохранность данных в памяти МК — до 20 лет при температуре хранения 85°C, и 100 лет — при температуре 20°C.
Если ваши внуки и правнуки включат вашу «мигалку» или музыкальную шкатулку, то они смогут насладиться их работой ))
— Optional Boot Code Section with Independent Lock Bits
— Programming Lock for Software Security
МК имеет несколько областей памяти (не уточняем каких), которые можно защитить от прочтения установкой специальных бит защиты.
Ну, тут всё понятно: свои труды вы можете защитить от вычитывания программы из памяти МК.
Далее идет описание имеющейся в данном микроконтроллере периферии (т.е., встроенных в него аппаратных устройств типа таймеров, источников прерываний и интерфейсов связи)
— Two 8-bit Timer/Counters
— One 16-bit Timer/Counter
В МК имеется два таймера/счетчика: 8 и 16 бит.
— Three PWM Channels
Три канала ШИМ
– 8-channel ADC in TQFP and QFN/MLF package
Eight Channels 10-bit Accuracy
– 6-channel ADC in PDIP package
Six Channels 10-bit Accuracy
В составе МК есть несколько каналов АЦП: 6 – для корпуса PDIP и 8 – для корпуса QFN/MLF. Разрядность АЦП — 10 бит.
— Byte-oriented Two-wire Serial Interface
— Programmable Serial USART
В данном МК реализован аппаратный двухпроводный интерфейс связи USART, байт ориентированный и программируемый — имеется возможность настройки параметров интерфейса.
— Master/Slave SPI Serial Interface
Реализован SPI интерфейс связи, режимы Мастер/Подчиненный.
— Programmable Watchdog Timer with Separate On-chip Oscillator
Сторожевой таймер с собственным автономным генератором.
— On-chip Analog Comparator
Аналоговый компаратор.
— Power-on Reset and Programmable Brown-out Detection
Реализованы режимы контроля напряжения питания и защита работы МК при плохом питании (гарантирует увеличение надёжности работы всей системы).
— Internal Calibrated RC Oscillator
Встроенный калиброванный RC-генератор (можно запустить МК без внешних элементов).
— External and Internal Interrupt Sources
Реализовано несколько типов внешних и внутренних прерываний.
— Five Sleep Modes
Пять режимов «сна» (уменьшение энергопотребления МК за счет отключения некоторых внутренних узлов или специальных методов замедления их работы)
Понимаем как возможность выбора такого режима, при котором соотношение «потребляемая энергия/возможности» будут оптимальны для решения наших задач. Весьма полезная возможность при необходимости экономить энергию: питании от батарей, аккумуляторов и других источников.
— 28-pin PDIP, 32-lead TQFP, 28-pad QFN/MLF and 32-pad QFN/MLF
Указаны типы корпусов, в которых выпускается данный микроконтроллер. Видим «28 DIP» — это хорошо! Не надо покупать специализированные дорогостоящие панели и мучиться с тоненькими и часто расположенными выводами на корпусе МК.
Temperature Range:
-40°C to 85°C
Рабочая температура: -40°C … +85°C
Очень важный параметр! Бывают модели микроконтроллеров, которые работоспособны только при положительных температурах окружающего воздуха.
(Был у меня горький опыт, когда в устройстве был применен именно такой «теплолюбивый» микроконтроллер. А устройство поместили на улицу… И каждую зиму «благодарные» пользователи моего устройства «хвалили» меня за «замерзание» микроконтроллера, которое проявлялось в виде полного его зависания)
Напряжение питания и тактовая частота
– 2.7 — 5.5V for ATmega8L
– 4.5 — 5.5V for ATmega8
Имеется две модификации данного МК: одна работоспособна при широком диапазоне питающих напряжение, вторая — в узком.
— ATmega8L: 0 – 8 MHz @ 2.7 — 5.5V
— ATmega8: 0 – 16 MHz @ 4.5 — 5.5V
Максимальная тактовая частота:
— Atmega8L: 0 – 8 МГц при напряжении питания 2,7 – 5,5 вольт
— Atmega8: 0 – 16 МГц при напряжении питания 4,5 – 5,5 вольт.
И что мы видим? А то, что модификация МК, работоспособная в широком диапазоне питающих напряжений, не может быть тактируема частотами выше 8 МГц. Следовательно, и ее вычислительные возможности будут ниже.
Power Consumption at 4 Mhz, 3V, 25°C
— Active: 3.6 mA
— Idle Mode: 1.0 mA
— Power-down Mode: 0.5 µA
Потребляемая мощность:
— при работе на частоте 4 МГц и напряжении питания 3 вольта потребляемый ток: 3,6 миллиампер,
— в различных режимах энергосбережения потребляемый ток: от 1 миллиампер до 0,5 микроампера
На следующей странице публикуется расположение выводов данного микроконтроллера при использовании разных типов корпусов:
Советую этот листок из даташита распечатать и иметь под рукой. В процессе разработки и сборки схемы очень полезно иметь эти данные перед глазами.
Внимание!
Обратите внимание на такой факт: микросхема микроконтроллера может иметь (и имеет в данной модели) несколько выводов для подключения источника питания. Т.е., имеется несколько выводов для подключения «земли» — «общего провода», и несколько выводов для подачи положительного напряжения.
Изготовители микроконтроллеров рекомендуют подключать соответствующие выводы вместе, т.е., минус подавать на все выводы, помеченные как Gnd (Ground — Земля), плюс — на все выводы помеченные как Vcc.
При этом через одинаковые выводы МК не должны протекать токи, так как внутри корпуса МК они соединены тонкими проводниками! Т.е., при подключении нагрузки эти выводы не должны рассматриваться как «перемычки».
Листаем описание далее, видим главу «Overview» (Обзор).
В ней имеется раздел «Block Diagram» (Устройство). На рисунке показаны устройства, входящие в состав данного микроконтроллера.
Но самым важным для нас в настоящее время является блок «Oscillator Circuits/Clock Generation» (Схема генератора/Генератор тактовой частоты).
В программе часто возникает необходимость сделать временную задержку в ее выполнении — паузу. А точную паузу можно организовать только методом подсчета времени. Время считаем исходя из количества тактов генератора микроконтроллера.
Да и не лишним будет заранее просчитать: успеет ли МК выполнить тот или иной фрагмент программы за отведенное для этого время.
В даташите ищем соответствующую главу: «System Clock and Clock Options» (Тактовый генератор и его параметры). В ней видим раздел «Clock Sources» (Источники тактового сигнала), в котором имеется таблица с перечнем видов тактовых сигналов.
В этом разделе указано, что данный МК имеет встроенный тактовый RC-генератор. В разделе «Default Clock Source» имеется указание о том, что МК продается уже настроенным для использования встроенного RC-генератора.
При этом тактовая частота МК — 1 МГц.
Из раздела «Calibrated Internal RC Oscillator» (Калиброванный RC-генератор) узнаем, что встроенный RC-генератор имеет температурный дрейф в пределах 7,3 — 8,1 МГц.
Может возникнуть вопрос: если частота встроенного тактового генератора 7,3 — 8,1 МГц, то как была получена частота 1 МГц? Дело в том, что тактовый сигнал попадает в схемы микроконтроллера через программируемый делитель частоты (Об это рассказано в разделе «System Clock Prescaler»).
В данном микроконтроллере он имеет несколько коэффициентов деления: 1, 2, 4 и 8. При выборе первого мы получим частоту самого тактового генератора, при включении последнего — в 8 раз меньше, т.е., 8/8=1 МГц.
С учетом вышесказанного получаем, что тактовая частота данного МК при включенном делителе с коэффициентом 8 будет в пределах от 7,3/8 = 0,9125 МГц (9125 КГц) до 8,1/8 = 1,0125 МГц.
Обратите внимание на один ну очень важный факт: стабильность частоты дана при температуре МК 25 градусов по шкале Цельсия. Вспомним, что внутренний генератор выполнен по RC схеме. А емкость конденсатора очень зависит от температуры!
Перед тем, как подать на микроконтроллер питающее напряжение, выполним правило, которое обязательно для всех цифровых микросхем: в непосредственной близости от выводов питания микросхемы должен быть керамический конденсатор емкостью 0,06 — 0,22 мкф. Обычно устанавливают конденсатор 0,1 мкф. Его часто называют блокировочным конденсатором.
В схему необходимо установить и электролитический конденсатор емкостью 4-10 мкф. Он также является блокировочным фильтром, но на менее высоких частотах. Такой конденсатор можно устанавливать один для нескольких микросхем. Обычно на 2-3 корпуса микросхем.
Дело в том, что микроконтроллер (как и другие цифровые микросхемы) состоит из транзисторных ячеек, которые в процессе работы постоянно переключаются из открытого состояния в закрытое, и наоборот. При этом изменяется потребляемая транзисторными ячейками энергия. В линии питания возникают кратковременные «провалы» напряжения.
Этих ячеек в микроконтроллере сотни тысяч (думаю, что сейчас уже миллионы!), поэтому по питающим проводам начинают гулять импульсные помехи с частотами от единиц до десятков тысяч Герц. Для предотвращения распространения этих помех по цепям схемы, да и самой микросхемы микроконтроллера, параллельно его выводам питания устанавливают такой блокировочный конденсатор.
При этом на каждую микросхему необходимо устанавливать индивидуальный конденсатор.
https://www.youtube.com/watch?v=78LmEiGTbSE
Конденсатор для постоянного тока является изолятором. Но при установке конденсатора в цепи с непостоянным током он делается сопротивлением. Чем выше частота, тем меньшее сопротивление оказывает конденсатор.
Следовательно, блокировочный конденсатор с малой емкостью пропускает через себя (шунтирует) высокочастотные сигналы (десятки и сотни Герц), а конденсатор с бОльшей емкостью — низкочастотные.
Об этом я писал еще в статье Конденсатор в цепи постоянного и переменного тока
Выводы:
— микроконтроллер AVR ATmega-8 при поставке с завода работает на тактовой частоте 0,91—1,1 МГц;
— напряжение питания должно быть в пределах 4,5 — 5,5 Вольт. Мы будем использовать микросхемы с питающим напряжением 5 Вольт, поэтому и МК будет питаться этим же напряжением. (Хотя работоспособность сохранится при напряжении питания 2,7 Вольт для обычных, не низковольтных моделей МК)
Источник: https://www.ruselectronic.com/chitaem-datashit-na-primere-atmega8/
Подключение внешней памяти к микроконтроллеру ATmega128. Часть 1. Аппаратная реализация
» Схемы » Интерфейсы · Применение микроконтроллеров
23-12-2010
Микроконтроллер AVR ATmega128 производства компании Atmel имеет объем встроенной cтатической оперативной памяти с произвольным доступом 4 КБайт.
Однако, при разработке некоторых типов приложений, даже этого объема может быть недостаточно.
Например, если приложение имеет дело с большими объемами данных или управляет операционной системой реального времени, то данный объем SRAM очень быстро исчерпается.
Для решения этой проблемы можно использовать встроенный в микроконтроллер ATmega128 интерфейс внешней памяти, который позволяет расширить объем памяти SRAM до 64 КБайт.
Для экспериментов можно использовать любую отладочную плату на базе микроконтроллера ATmega128, желательно с установленным коннектором XRAM интерфейса. Кроме того, потребуется наличие на плате драйвера и порта RS-232 для наблюдения отладочной информации в терминальной программе на ПК, напрмер для этого можно применить микросхему MAX232 с соотвтетствующими внешними компонентами.
Для подключения дополнительной внешней памяти необходимо изготовить модуль расширения, который будет подключаться к отладочной плате. Модуль содержит установленную микросхему SRAM AS6C6264, производства компании Alliance Memory, микросхему для управления памятью 74HC573 (восьмиразрядный регистр-защелка) и коннектор интерфейса XRAM.
Подключение внешнего статического ОЗУ к AVR-микроконтроллеру
Характеристики интерфейса внешней памяти позволяюют использовать его не только для подключения к внешнему статическому ОЗУ или флэш-памяти, но и в качестве интерфейса с внешними периферийными устройствами, например, ЖК-дисплеями, АЦП и ЦАП. Его основными отличительными особенностями являются:
- Возможность задания четырех различных по длительности состояний ожидания, в т.ч. без состояния ожидания.
- Возможность установки различных состояний ожидания для разных секторов внешней памяти (размер сектора конфигурируется).
- Возможность выбора количества задействованных разрядов в старшем адресном байте.
- Устройство запоминания состояния шины для минимизации потребления тока (опционально).
Интерфейс XRAM характеризуется высоким быстродействием из-за чего фиксация адреса должна выполняться с осторожностью при частотах свыше 8 МГц при 4 В и 4 МГц при 2.7 В.
При использовании более высоких частот применение регистров устаревшей серии 74HC будет неадекватным. Интерфейс внешней памяти разработан для совместимости с регистрами серии 74AHC. Однако, большинство регистров может быть использовано, если они отвечают требованиям временной диаграммы. К основным параметрам, характеризующих фиксацию адреса, относятся:
- Длительность задержки на распространение сигнала с входа D на выход Q.
- Время установки данных перед тем как G станет равным 0.
- Время удержания данных (адреса) после установки низкого уровня на входе G.
Интерфейс XRAM микроконтроллера состоит из:
- AD[0..7] (выводы порта А) – мультиплексированная младшая шина адреса/шина данных.
- A[8..15] (выводы порта C) – cтаршая шина адреса (с конфигурируемым числом разрядов).
- ALE (Вывод PG2) – cтроб адреса внешней памяти.
- RD (вывод PG1) – инвертированный строб чтения из внешней памяти.
- WR (вывод PG0) – инвертированный строб записи во внешнюю память.
Принципиальная схема модуля расширения памяти
Кликните для увеличения
AS6C6264 –микросхема КМОП статической оперативной памяти с произвольным доступом 65536 бит (8192 слова по 8 бит). Регистр-защелка используется для работы с мультиплексированной младшей шиной адреса и данных. Для доступа к ячейкам памяти нам необходимо указать 16-битный адрес к 8-битной ячейке и т.к. мы используем 8 КБайт, то использоваться будут только 13 адресных линий.
Автор применил кварцевый резонатор 7.3728 МГц, чтобы временные характеристики интерфейса, при работе с серией 74HC, были в норме и избежать включения дополнительных программных задержек.
Внешний вид модуля расширения
Загрузки
Принципиальная схема и печатная плата модуля расширения (формат Eagle) – скачать
В следующей части мы рассмотрим распределение памяти и алгоритм работы с внешней памятью, основные моменты при организации подпрограмм чтения/записи данных и протестируем работу внешнего модуля расширения памяти.
scienceprog.com
Источник: https://www.rlocman.ru/shem/schematics.html?di=71093
Использование интерфейса USART микроконтроллеров AVR
Дата публикации: 25 июня 2011.
Рейтинг: 5 / 5
Известно, что при передаче данных могут произойти различные сбои. Модуль UART, реализованный в микроконтроллерах, способен при приеме обнаруживать ошибку формата и переполнение.
Для взаимодействия с программой в модуле предусмотрены прерывания при наступлении следующих событий: прием завершен с адресом вектора $009 в таблице векторов прерываний, регистр данных передатчика пуст с адресом вектора $00А, передача завершена с адресом вектора $00В.
Выводы микроконтроллера, используемые модулем UART, являются линиями порта PD. В качестве входа приемника (RXD) используют вывод РD0, а в качестве выхода передатчика (TXD) – вывод PD1.
Принимаемые и передаваемые данные (восемь разрядов) хранятся в регистре UDR. Физически регистр UDR состоит из двух отдельных регистров, один из которых используется для передачи данных, другой – для приема. При чтении регистра UDR выполняется обращение к регистру приемника, при записи – к регистру передатчика.
Регистры управления модулями USART на примере микроконтроллера ATmega8
Буферные регистры приемника и передатчика располагаются по одному адресу пространства ввода/вывода и обозначаются как регистр данных UDR(Universal Data Register). В этом регистре хранятся младшие 8 разрядов принимаемых и передаваемых данных.
При чтении выполняется обращение к буферному регистру UDR приемника, при записи — к буферному регистру передатчика.
В модулях USART буфер приемника является двухуровневым (FIFO буфер), изменение состояния которого происходит при любом обращении к регистру UDR.
В связи с этим не следует использовать регистр UDR в качестве операндов команд типа «чтение/модификация/запись» (SBI и CBI). Кроме того, следует быть очень аккуратными при использовании команд проверки SBIC и SBIS, поскольку они также изменяют состояние буфера приемника.
Для управления модулями USART используются три регистра: UCSRA , UCSRB и UCSRC.
Описание разрядов регистра UCSRA.
Разряд | Название | Описание |
7 | RXC | Флаг завершения приема. Флаг устанавливается в «1» при наличии непрочитанных данных в буфере приемника (регистр данных UDR). Сбрасывается флаг аппаратно после опустошения буфера (в UART — после прочтения регистраданных). Если разряд RXCIE регистра UCSRB установлен, то при установке флага генерируется запрос на прерывание «прием завершен» |
6 | TXC | Флаг завершения передачи. Флаг устанавливается в «1» после передачи всех разрядов посылки из сдвигового регистра передатчика, при условии, что в регистр данных UDR небыло загружено нового значения. Если разряд TXCIE регистра UCSRB (UCSRnB) установлен, то при установке флагагенерируется прерывание «передача завершена». Флаг сбрасывается аппаратно при выполнении подпрограммы обработки прерывания или программно, записью в него лог. 1 |
5 | UDRE | Флаг опустошения регистра данных. Данный флаг устанавливается в «1» при пустом буфере передатчика (после пересылки байта из регистра данных UDR в сдвиговый регистр передатчика). Установленный флаг означает, что врегистр данных можно загружать новое значение. Если разряд UDRIE регистра UCR (UCSRB) установлен, генерируется запрос на прерывание «регистр данных пуст». Флаг сбрасывается аппаратно, при записи в регистр данных |
4 | FE | Флаг ошибки кадрирования. Флаг устанавливается в «1»при обнаружении ошибки кадрирования, т. е. если первыйстопбит принятой посылки равен «0». Флаг сбрасываетсяпри приеме стопбита, равного «1» |
3 | DOR | Флаг переполнения. В USART флаг устанавливается в «1»,если в момент обнаружения нового стартбита в сдвиговомрегистре приемника находится последнее принятое слово, абуфер приемника полон (два значения). В UART флаг устанавливается в «1», если новый кадр будет помещен в сдвиговый регистр приемника до того, как из регистра данных будет считано предыдущее слово. Флаг сбрасывается припересылке принятых данных из сдвигового регистра приемника в буфер |
2 | PE | Флаг ошибки контроля четности. Флаг устанавливается в«1», если в данных, находящихся в буфере приемника, выявлена ошибка контроля четности. При отключенном контроле четности этот разряд постоянно сброшен в «0» |
1 | U2X | Удвоение скорости обмена. Если этот разряд установлен в«1», коэффициент деления предделителя контроллера скорости передачи уменьшается с 16 до 8, удваивая тем самымскорость асинхронного обмена по последовательному каналу. В USART разряд U2X используется только при асинхронном режиме работы. В синхронном режиме он должен быть сброшен |
MPCM | Режим мультипроцессорного обмена. Разряд MPCM используется в режиме мультипроцессорного обмена. Если онустановлен в «1», ведомый микроконтроллер ожидает приема кадра, содержащего адрес. Кадры, не содержащие адресаустройства, игнорируются |
Описание разрядов регистра UCSRB.
Разряд | Название | Описание |
7 | RXCIE | Разрешение прерывания по завершению приема. Если данныйразряд установлен в «1», то при установке флага RXC регистра UCSRA генерируется прерывание «прием завершен» (если флаг I регистра SREG установлен в «1») |
6 | TXCIE | Разрешение прерывания по завершению передачи. Если данный разряд установлен в «1», то при установке флага TXC регистра UCSRA генерируется прерывание «передачазавершена» (если флаг I регистра SREG установлен в «1») |
5 | UDRIE | Разрешение прерывания при очистке регистра данных UART.Если данный разряд установлен в «1», то при установке флагаUDRE в регистра UCSRA генерируется прерывание «регистр данных пуст» (если флаг I регистра SREG установлен в «1») |
4 | RXEN | Разрешение приема. При установке этого разряда в «1» разрешается работа приемника USART/UART и переопределяется функционирование вывода RXD (RXDn). При сбросе разряда RXEN работа приемника запрещается, а его буфер сбрасывается. Значения флагов TXC, DOR/OR и FE при этом становятся недействительными |
3 | TXEN | Разрешение передачи. При установке этого разряда в «1» разрешается работа передатчика UART и переопределяется функционирование вывода TXD. Если разряд сбрасывается в «0» во время передачи, выключение передатчика произойдет только после завершения передачи данных, находящихся в сдвиговом регистре и буфере передатчика |
2 | UCSZ2 | Формат посылок. Этот разряд используется для задания размера слов данных, передаваемых по последовательному каналу. В модулях USART он используется совместно с разрядами UCSZ1:0 регистра UCSRC. В модулях UART, если разряд CHR9 установлен в «1», осуществляется передача и прием 9 разрядных данных, если сброшен — 8 разрядных |
1 | RXB8 | 8 й разряд принимаемых данных. При использовании 9 разрядных слов данных этот разряд содержит значение старшего разряда принятого слова. В случае USART содержимое этого разряда должно быть считано до прочтения регистра данных UDR |
TXB8 | 8 й разряд передаваемых данных. При использовании 9 разрядных слов данных, содержимое этого разряда является старшим разрядом передаваемого слова. Требуемое значение должно быть занесено в этот разряд до загрузки байта данных в регистр UDR |
Описание разрядов регистра UCSRC.
Разряд | Название | Описание |
7 | URSEL | Выбор регистра. Этот разряд определяет, в какой из регистровмодуля производится запись. Если разряд установлен в «1»,обращение производится к регистру UCSRC. Если жеразряд сброшен в «0», обращение производится к регистру UBRRH. |
6 | UMSEL | Режим работы USART. Если разряд сброшен в «0», модуль USART работает в асинхронном режиме. Если разряд установлен в «1», то модуль USART работает в синхронном режиме |
5 | UPM1 | Режим работы схемы контроля и формирования четности. Этиразряды определяют функционирование схем контроля иформирования четности |
4 | UPM0 | |
3 | USBS | Количество стопбитов. Этот разряд определяет количествостопбитов, посылаемых передатчиком. Если разряд сброшен в «0», передатчик посылает 1 стопбит, если установлен в «1», то 2 стопбита. Для приемника содержимое этого разряда безразлично |
2 | UCSZ1 | Формат посылок. Совместно с разрядом UCSZ2 этиразряды определяют количество разрядов данных в посылках(размер слова) |
1 | UCSZ0 | |
UCPOL | Полярность тактового сигнала. Значение этого разряда определяет момент выдачи и считывания данных на выводах модуля. Разряд используется только при работе в синхронном режиме. При работе в асинхронном режиме он должен быть сброшен в «0» |
Скорость приема/передачи USART
В асинхронном режиме, а также в синхронном режиме при работе в качестве ведущего, скорость приема и передачи данных задается контроллером скорости передачи, функционирующим как делитель системного тактового сигнала с программируемым коэффициентом деления. Коэффициент определяется содержимым регистра контроллера UBRR.
В блок приемника сформированный сигнал поступает сразу, а в блок передатчика — через дополнительный делитель, коэффициент деления которого (2, 8 или 16) зависит от режима работы модуля USART/UART.
Регистр UBRR является 12 разрядным и физически размещается в двух регистрах ввода/вывода UBRRH и UBRRL.
При работе в асинхронном режиме скорость обмена определяется не только содержимым регистра UBRR, но и состоянием разряда U2X регистра UCSRA .
Если этот разряд установлен в «1», коэффициент деления предделителя уменьшается в два раза, а скорость
обмена соответственно удваивается.
При работе в синхронном режиме этот разряд должен быть сброшен.
Cкорость обмена определяется следующими формулами, где
BAUD — скорость передачи в бодах, fCK — тактовая частота микроконтроллера, UBRR — содержимое регистра контроллера скорости передачи (0…4095):
асинхронный режим (обычный, U2Xn = «0»)
BAUD = fCK/16(UBRR + 1);
асинхронный режим (ускоренный, U2Xn = «1»)
BAUD = fCK/8(UBRR + 1);
синхронный режим ведущего
BAUD = fCK/2(UBRR + 1).
Ниже представлен пример тестовой программы для изучения протокола USART, где микроконтроллер Atmega8 обменивается информацией с терминалом, для наглядности к контроллеру подключен LCD 16X02 дисплей.
При нажатии на кнопки 1-3 в терминале высвечиваются соответствующие строки, также если выводить в терминал символы “a” или “b”, будет загораться или гаснуть светодиод, подключенный к порту PB0 контроллера. Любые символы выводимые в терминал будут также высвечиваться на LCD дисплее.
Для тестирования в “железе”, микроконтроллер подключается к компьютеру через микросхему преобразователя уровней MAX232, для обмена данными используется стандартная программа Hyper Terminal от Microsoft.
//*** Пример работы с USART интерфейсом микроконтроллеров AVR *** #include
#include #define BAUDRATE 9600 // Скорость обмена данными #define F_CPU 8000000UL // Рабочая частота контроллера unsigned char NUM = 0; unsigned char count = 0; unsigned char byte_receive = 0; unsigned char i = 1; // Функция задержки в мкс void _delay_us(unsigned char time_us) { register unsigned char i; for(i = 0; i < time_us; i++) { asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); } } // Функция задержки в мс void _delay_ms(unsigned int time_ms) { register unsigned int i; for(i = 0; i < time_ms; i++) { _delay_us(250); _delay_us(250); _delay_us(250); _delay_us(250); } } #define RS PD2 #define EN PD3 // Функция передачи команды void lcd_com(unsigned char p) { PORTD &= ~(1
Источник: https://radioparty.ru/prog-avr/program-c/307
Программирование AVR. Использование UART
Микроконтроллеры AVR, как и большинство современных контроллеров, имеют на своем борту аппаратный модуль UART, являющийся отличным решением для передачи данных. Именно про UART будет эта статья
Источник: https://microtechnics.ru/programmirovanie-avr-ispolzovanie-uart/
ATmega8535. Подключение графического индикатора WG12864B-YGH-VN. часть 1
Источник: http://mega-avr.ucoz.ru/publ/atmega8535_connect_display_wg12864b_and_microcontroller_part1/1-1-0-6
Adblockdetector