По умолчанию выбран внутренний генератор 32 МГЦ с делителем 8, тактовая 4 МГц. Изменить конфигурацию по умолчанию можно с помощью регистра PMCR и регистра предделителя CLKPR. Перед изменением источника тактирования, необходимо убедиться что источник тактирования находится в стабильном состоянии. Чтобы не попасть впросак, при ошибочных настройках или неисправном кварцевом резонаторе, рекомендуется включить сторожевой таймер.
Чтобы защитить регистр PMCR от случайного изменения, внесение изменений в регистр PMCR должно строго соответствовать установленной последовательности. Седьмой бит регистра PMCR используется для управления временной последовательностью. Сначала нужно записать бит PMCR[7] как 1 перед изменением его другого бита, затем изменить значение другого регистра PMCR в течение 6 тактов. После этих 6 тактов модификация PMCR станет недействительной.
Биты регистра PMCR: 0xF2
PMCE 7 Бит разрешающий изменение регистра PMCR
CLKFS 6 Управление частотой главного источника
CLKSS 5 Выбор основного источника тактовых импульсов
WCLKS 4 Выбор синхронизации WDT: 0 - Внутренний высоко скоростной 32 МГц, 1 - Внутренний 32 кГц
OSCKEN 3 Внешний низкочастотный кварцевый генератор, 1 включить, 0 отключить
OSCMEN 2 Внешний высокочастотный кварцевый генератор, 1 включить, 0 отключить
RCKEN 1 Внутренний RC-генератор 32 кГц , 1 включает, 0 отключает
RCMEN 0 Встроенный RC-генератор 32 МГц включает управление, 1 включает, 0 отключает
******************************************************************************
* PMCR[0] * 32MHz RC Enable control, 1 enable, 0 close *
* PMCR[1] * 32K RC Enable control, 1 enable, 0 close *
* PMCR[2] * 400K ~ 32MHz OSC mode enable, 1 enable, 0 close *
* PMCR[3] * 32K ~ 400K OSC mode enable, 1 enable, 0 close *
******************************************************************************
****************************************************************************************
* PMCR[6] * PMCR[5] * Master Clock Source *
* 0 * 0 * Internal RC oscillator ( system default) *
* 0 * 1 * External 400K ~ 32MHz high speed oscillator *
* 1 * 0 * Internal 32KHz RC oscillator *
* 1 * 1 * External 32K ~ 400KHz low speed oscillator *
****************************************************************************************
Пятый бит регистра PMCR - выбор внутреннего и внешнего тактирования.
Шестой бит регистра PMCR - высоко скоростное или низко скоростное тактирование
Пример переключения на внешний высоко скоростной кварц от 400КГц до 32МГц.
- PMCR[7] = 1 разрешить изменения
- PMCR[2] = 1 внешний кварц (это нужно сделать в течении 6 тактов)
- Подождать стабилизации
- PMCR[7] = 1 разрешить изменения
- PMCR[6:5] = 01 переключаемся в режим кварцевого генератора
- Выполните несколько операций NOP для повышения стабильности.
Выбор предделителя.
Чтобы избежать непреднамеренных изменений тактовой частоты, необходимо выполнить специальную процедуру записи для изменения CLKPR :
- отключить прерывания
- записать бит Clock Prescaler Change Enable (CLKPCE) в единицу, а все остальные биты в CLKPR - в ноль. (Действительно в течении 4 тактов)
- в течение четырех тактов записать желаемое значение в CLKPS, одновременно записывая ноль в CLKPCE.
- обратно включить прерывания
Биты регистра CLKPR: 0x61
CLKPCE 7 Разрешает изменения предделителя, разрешение действительно в течении 4 тактов
CLKOE1 6 Если установлен, то выводит тактовый сигнал на пин PE5
CLKOE0 5 Если установлен, то выводит тактовый сигнал на пин PBO
CLKPS3 3
CLKPS2 2
CLKPS1 1
CLKPS0 0
Выбор предделителя
CLKPS3 CLKPS2 CLKPS1 CLKPS0 Значение предделителя
0 0 0 0 1
0 0 0 1 2
0 0 1 0 4
0 0 1 1 8(по умолчанию)
0 1 0 0 16
0 1 0 1 32
0 1 1 0 64
0 1 1 1 128
1 0 0 0 256
Пример макросов
;------------------------------------------------------------------------------
; Wait 2,5ms|5ms|20ms
;------------------------------------------------------------------------------
.macro wait_stable
clr tempreg1
clr tempreg2
clr tempreg3
wait_stable_0:
ldi tempreg1, 0x02
wait_stable_1:
ldi tempreg2, 0x22
wait_stable_2:
ldi tempreg3, 0xC8
wait_stable_3:
dec tempreg3
brne wait_stable_3
dec tempreg2
brne wait_stable_2
dec tempreg1
brne wait_stable_1
.endm
;------------------------------------------------------------------------------
; Switch system clock between internal 32MHz RC
;------------------------------------------------------------------------------
.macro int_osc
clr tempreg1
clr tempreg2
ldi tempreg1, 0x80 ;prescaler settings
ldi tempreg2, 0x00
sts CLKPR, tempreg1
sts CLKPR, tempreg2
nop
nop
nop
clr tempreg1
clr tempreg2
ldi tempreg1, 0x80 ;switch to internal crystal
lds tempreg2, PMCR
andi tempreg2, 0x9f
sts PMCR, tempreg1
sts PMCR, tempreg2
wait_stable ;waiting for crystal stable
clr tempreg1
clr tempreg2
ldi tempreg1, 0x80 ;disable external crystal
lds tempreg2, PMCR
andi tempreg2, 0xfb
sts PMCR, tempreg1
sts PMCR, tempreg2
wait_stable ;waiting for crystal stable
.endm
;------------------------------------------------------------------------------
; Switch system clock between external high speed crystal
;------------------------------------------------------------------------------
.macro ext_osc
clr tempreg1
clr tempreg2
ldi tempreg1, 0x80 ;enable external crystal
lds tempreg2, PMCR
ori tempreg2, 0x04
sts PMCR, tempreg1
sts PMCR, tempreg2
wait_stable ;waiting for crystal stable
clr tempreg1
clr tempreg2
ldi tempreg1, 0x80 ;switch to external crystal
lds tempreg2, PMCR
andi tempreg2, 0x9f
ori tempreg2, 0x20
sts PMCR, tempreg1
sts PMCR, tempreg2
wait_stable ;waiting for crystal stable
clr tempreg1
clr tempreg2
ldi tempreg1, 0x80 ;set to right prescale
ldi tempreg2, 0x00
sts CLKPR, tempreg1
sts CLKPR, tempreg2
nop
nop
nop
.endm