Пример 19. Подстройка частоты RC-генератора и регистр OSCCAL.В контроллере
ATtiny13A подстройка частоты внутреннего
RC-генератора выполняется через регистр
OSCCAL. В регистре не используется старший бит, его значения могут быть в пределах
0x00 - 0x7F (или
от 0 до 127, при этом соответствовать диапазону
50% - 200% от номинальной частоты). Чем больше его значение, тем выше частота
RC-генератора.
Для подстройки частоты в специальных ячейках микроконтроллера записаны две
!!! заводские калибровочные константы (для частоты
9,6 мГц и
4,8 мГц). Они обычно разные, но могут быть и одинаковыми. По умолчанию при подаче питания происходит загрузка константы всегда из ячейки для частоты
9,6 мГц
!!! И если фьюзами будет установлена частота 9,6мГц, то подстройка частоты происходит. Но если фьюзами будет установлена частота
4,8 мГц, то подстройка частоты выполняется только в случае если константы в ячейках одинаковые. Но в большинстве случаях константы разные и поэтому при использовании частоты
4,8 мГц значение второй калибровочной ячейки должно загружаться в регистр
OSCCAL программным путём.
Как пример: На изображении вкладки
Advanced программы
SinaProg значения констант одного из контроллеров
ATtiny13A (который оказался “под рукой”) –
283B. Значение
28 (или
40 в десятичном виде) для частоты
9,6 мГц, оно заносится аппаратно при включении, если значение
OSCCAL не указано в программе. А значение
3B (или
59 в десятичном виде) для частоты
4,8 мГц и его необходимо переносить программно. При этом, в обоих случаях частоту можно менять в широких пределах программно, изменяя значение регистра
OSCCAL.
Значения
Low Fuse –
7A для
9,6 мГц;
79 для
4,8 мГц
!!! - Код: выделить все
//мк ATtiny13A
//F_CPU = 4800000 //9600000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int main(void) {
PORTB= 0b00011111; // к PB0 подключен светодиод с сопротивлением
DDRB = 0b00000001;
//OSCCAL = 67;
sei();
while(1) {
_delay_ms(5000); _delay_ms(5000);
_delay_ms(5000); _delay_ms(5000);
_delay_ms(5000); _delay_ms(5000);
_delay_ms(5000); _delay_ms(5000);
_delay_ms(5000); _delay_ms(5000);
_delay_ms(5000); _delay_ms(5000); //в сумме 60 секунд
PORTB ^= 0b00000001; //переключение PB0
}
}
К выводу
PB0 подключён светодиод с сопротивлением и программно установлен минутный интервал между переключением состояний светодиода. Значения измеренного времени проводилось упрощённо, на глаз (три минутных интервала).
Значение
OSCCAL=67 при
F_CPU=4800000 в последующем использовалось для настройки программы приёма байта с модуля
HC-06 на скорости
9600. И было проверено экспериментально, данные в таблице: “
+”
верный приём, “
-“
ложный.
Значение
OSCCAL=47 при
F_CPU=9600000 было проверено также экспериментально, подобно способу из предыдущей таблицы
(34+60)/2=47. Оно в последующем использовалось для настройки программы приёма байта с модуля
HC-06 на скорости
9600. Так как при частоте
9,6 мГц константа
40 (значение находится в пределах
34-60) записывается в регистр при подаче питания автоматически, то указывать значение регистра
OSCCAL в программе не надо.