
- •ATmega128, aTmega128l - 8-разрядный avr-микроконтроллер с внутрисистемно программируемой флэш-памятью емкостью 128 кбайт
- •Усапп …………………………………………………………………………………………………..168
- •Ядро центрального процессорного устройства avr
- •Интерфейс внешней памяти
- •Системная синхронизация и тактовые источники
- •Внешняя синхронизация
- •Управление энергопотреблением и режимы сна
- •Режим холостого хода (Idle)
- •Режим уменьшения шумов ацп (adc Noise Reduction)
- •Режим выключения (Power-down)
- •Экономичный режим (Power-save)
- •Дежурный режим (Standby)
- •Расширенный дежурный режим (Extended Standby)
- •Минимизация потребляемой мощности
- •Системное управление и сброс
- •Прерывания
- •Векторы прерываний в aTmega128
- •Порты ввода-вывода
- •Порты в качестве универсального цифрового ввода-вывода
- •Альтернативные функции порта
- •Int0/scl – порт d, разряд 0
- •Описание регистров портов ввода-вывода
- •Внешние прерывания
- •Аналоговый компаратор
- •Введение
- •Доступ к 16-разр. Регистрам
- •Тактовые источники таймера-счетчика 1/3
- •Блок счетчика
- •Блок захвата
- •Блоки сравнения
- •Блок формирования выходного сигнала
- •Режимы работы
- •Временные диаграммы 16-разр. Таймеров-счетчиков
- •Описание регистров 16-разр. Таймеров-счетчиков
- •Предделители таймеров-счетчиков 1, 2 и 3
- •Аналогово-цифровой преобразователь
- •Интерфейс jtag и встроенная отладочная система
- •Модулятор выходов таймеров (ocm1c2)
- •Последовательный периферийный интерфейс - spi
- •Функционирование вывода ss
- •Блок формирования выходного сигнала
- •Временные диаграммы таймера-счетчика 0
- •Описание регистров 8-разрядного таймера-счетчика 0
- •Асинхронная работа таймера-счетчика 0
- •Предделитель таймера-счетчика 0
- •Генерация тактовых импульсов
- •Форматы посылки
- •Инициализация усапп
- •Передача данных - Передатчик усапп
- •Прием данных - Приемник усапп
- •Асинхронный прием данных
- •Многопроцессорный режим связи
- •Описание регистров усапп
- •Примеры установок скоростей связи
- •Двухпроводной последовательный интерфейс twi
- •Формат посылки и передаваемых данных
- •Системы многомастерных шин, арбитраж и синхронизация
- •Обзор модуля twi
- •Описание регистров twi
- •Рекомендации по использованию twi
- •Режимы передачи
- •Программирование памяти
- •Параллельное программирование
- •Последовательное программирование
- •Программирование через интерфейс jtag
- •Электрические характеристики
- •Требования к характеристикам внешнего тактового сигнала
- •Характеристики двухпроводного последовательного интерфейса
- •Характеристики временной диаграммы spi
- •Предварительные данные по характеристикам ацп
- •Временная диаграмма внешней памяти данных
- •Типовые характеристики aTmega128: предварительные данные
- •Типовые характеристики aTmega128: предварительные данные (продолжение)
- •Типовые характеристики aTmega128: предварительные данные (продолжение)
- •Сводная таблица регистров
- •Набор инструкций
- •Информация для заказа
Доступ к 16-разр. Регистрам
Регистры TCNTn, OCRnA/B/C и ICRn являются 16-разрядными, поэтому, доступ к ним через 8-разр. шину данных AVR ЦПУ может быть осуществлен с помощью двух инструкций чтения или записи. У каждого 16-разр. таймера имеется свой 8-разр. регистр для временного хранения старшего байта данных. Поэтому, во время доступа к 16-разр. регистрам одного таймера используется один и тот же временный регистр. Чтение/запись младшего байта инициирует 16-разр. операцию чтения/записи. Если выполняется запись младшего байта 16-разр. регистра, то за один такт ЦПУ одновременно записываются и младший байт и старший байт из временного регистра. Если выполняется чтение младшего байта 16-разр. регистра, то за один такт ЦПУ параллельно с чтением младшего байта происходит копирование старшего байта 16-регистра во временный регистр.
Не все 16-разрядные регистры используют временный регистр для копирования старшего байта. Чтение 16-разр. регистров OCRnA/B/C не связано с использованием временного регистра.
Таким образом, чтобы записать данные в 16-разр. регистр, необходимо сначала записать старший байт, а затем младший. А при чтении 16-разр. регистра, наоборот, сначала считывается младший байт, а затем старший.
Ниже приведен пример на Ассемблере и Си, показывающие как осуществлять доступ к 16-разр. регистрам таймера. В примере предполагается, что во время обновления временного регистра не возникает прерываний. Аналогично может быть выполнен доступ к регистрам OCRnA/B/C и ICRn.
Пример кода на Ассемблере(1)
...
; Установка TCNTn = 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNTnH,r17
out TCNTnL,r16
; Чтение TCNTn в r17:r16
in r16,TCNTnL
in r17,TCNTnH
...
Пример кода на Си(1)
unsigned int i;
...
/* Установка TCNTn = 0x01FF */
TCNTn = 0x1FF;
/* Чтение TCNTn в i */
i = TCNTn;
...
Прим: 1. При разработке примеров предполагалось, что подключен файл специфических заголовков. Если адресуемый регистр ввода-вывода расположен в расширенной памяти ввода-вывода, то инструкции “IN”, “OUT”, “SBIS”, “SBIC”, “CBI” и “SBI” необходимо заменить на инструкции доступа к расширенной памяти ввода-вывода “LDS” и “STS” совместно с инструкциями “SBRS”, “SBRC”, “SBR”, и “CBR”.
В примере на Ассемблере значение TCNTn возвращается парой регистров r17:r16. При этом следует обратить внимание на проблему, которая связана с необходимостью выполнения двух инструкций для получения доступа к 16-разр. регистру. Если после выполнения первой инструкции доступа 16-разр. регистра происходит прерывание и в процедуре обработки прерывания также происходит обновление этого же или другого регистра, но относящегося к тому же таймеру, то по завершении обработки прерывания изменяется содержимое временного регистра и выполнение второй инструкции приведет к некорректному результату. Таким образом, когда и в основной программе и в прерываниях происходит обновление временного регистра, то в основной программе перед инициацией доступа к 16-разр. регистру необходимо запретить прерывания.
В следующем примере показано как корректно выполнить чтение регистра TCNTn без опасности изменения содержимого временного регистра в прерываниях. Аналогично данный пример следует распространять на доступ к регистрам OCRnA/B/C и ICRn.
Пример кода на Ассемблере (1)
TIM16_ReadTCNTn:
; Запомнили состояние общего флага прерываний
in r18,SREG
; Запрет прерываний
cli
; Чтение TCNTn в r17:r16
in r16,TCNTnL
in r17,TCNTnH
; Восстановили состояние общего флага прерываний out SREG,r18
ret
Пример кода на Си (1)
unsigned int TIM16_ReadTCNTn( void )
{
unsigned char sreg;
unsigned int i;
/* Запомнили состояние общего флага прерываний */
sreg = SREG;
/* Запретили прерывания */
_CLI();
/* Чтение TCNTn в i */
i = TCNTn;
/* Восстановили состояние общего флага прерываний */
SREG = sreg;
return i;
}
Прим: 1. При разработке примеров предполагалось, что подключен файл специфических заголовков. Если адресуемый регистр ввода-вывода расположен в расширенной памяти ввода-вывода, то инструкции “IN”, “OUT”, “SBIS”, “SBIC”, “CBI” и “SBI” необходимо заменить на инструкции доступа к расширенной памяти ввода-вывода “LDS” и “STS” совместно с инструкциями “SBRS”, “SBRC”, “SBR”, и “CBR”.
В коде на Ассемблере значение регистра TCNTn возвращается парой регистров r17:r16. В следующем примере показано как избежать опасного влияния изменения содержимого временного регистра при возникновении прерывания во время записи в регистр TCNTn. На этом же принципе может быть выполнена запись в регистры OCRnA/B/C или ICRn.
Пример кода на Ассемблере (1)
TIM16_WriteTCNTn:
; Запомнили состояние общего флага прерываний
in r18,SREG
; Запрет прерываний
cli
; Копирование TCNTn в r17:r16
out TCNTnH,r17
out TCNTnL,r16
; Восстановили состояние общего флага прерываний
out SREG,r18
ret
Пример кода на Си (1)
void TIM16_WriteTCNTn( unsigned int i )
{
unsigned char sreg;
unsigned int i;
/* Запомнили состояние общего флага прерываний */
sreg = SREG;
/* Запрет прерываний */
_CLI();
/* Копирование TCNTn в i */
TCNTn = i;
/* Восстановили состояние общего флага прерываний */
SREG = sreg;
}
Прим: 1. При разработке примеров предполагалось, что подключен файл специфических заголовков. Если адресуемый регистр ввода-вывода расположен в расширенной памяти ввода-вывода, то инструкции “IN”, “OUT”, “SBIS”, “SBIC”, “CBI” и “SBI” необходимо заменить на инструкции доступа к расширенной памяти ввода-вывода “LDS” и “STS” совместно с инструкциями “SBRS”, “SBRC”, “SBR”, и “CBR”.
В примере на Ассемблере предполагается, что записываемое значение в TCNTn предварительно записано в пару регистров r17:r16.
Повторное использование временного регистра старшего байта
Если выполняется запись в несколько 16-разр. регистров и при этом значение старшего байта одинаково для всех регистров, то достаточно однократно выполнить запись старшего байта. Однако при этом также учтите возможность некорректного завершения такой операции, если используются прерывания (см. выше описание механизма разрешения такой проблемы).