LGT8F328P  ассемблер AVRA. Тактирование.

    По умолчанию выбран внутренний генератор 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