Ассемблер AVRA для LGT8F328P

Linux.

 

 

Выбор источника и скорости тактирования.

 

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

Установка ассемблера avra

sudo apt-get install avra

 

Сборка ассемблером AVRA
avra main.asm

 

Прошивка программатором LGTSWDICE

avrdude -c jtag2isp -P usb -p m328P -D -U flash:w:main.hex:i

 

Комманды сборки для Geany

avra "%f"

avrdude -c jtag2isp -P usb -p m328P -D -U flash:w:%e.hex


;------------------------------------------------------------------------------
; 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


;------------------------------------------------------------------------------
; Disalbe Watchdog Timer
;------------------------------------------------------------------------------
.macro wdt_off
    wdr 
    in tempreg1, MCUSR  
    andi tempreg1, ~(1 << WDRF)
    out MCUSR, tempreg1  
    lds tempreg1, WDTCSR
    ori tempreg1, (1 << WDCE) | (1 << WDE)
    sts WDTCSR, tempreg1
    lds tempreg1, (0 << WDE)
    sts WDTCSR, tempreg1
    clr tempreg1
.endm


;------------------------------------------------------------------------------
; Switch system clock between internal 16MHz RC
;------------------------------------------------------------------------------
.macro int_osc
    clr tempreg1
    clr tempreg2
    ldi tempreg1, 0x80            
    ldi tempreg2, 0x01            ;prescaler (0x00 - 32MHz, 0x01 - 16MHz)
    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            
    lds tempreg2, PMCR        
    ori tempreg2, 0x04            ;enable external crystal
    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


;------------------------------------------------------------------------------
;e2pctl module initialization
;1. enable E2PROM emulator
;2. configure 1KByte E2PROM (only first 2046 bytes avaliable)            
;------------------------------------------------------------------------------
.macro e2prom_1k
    clr tempreg1
    clr tempreg2
    ldi tempreg1, 0b10000000    ;0x80
    ldi tempreg2, 0b01001100    ;0x4c    
    sts ECCR, tempreg1
    sts ECCR, tempreg2
    nop
    nop
    nop                
.endm


;------------------------------------------------------------------------------
;e2pctl module initialization
;1. enable E2PROM emulator
;2. configure 2KByte E2PROM (only first 4092 bytes avaliable)            
;------------------------------------------------------------------------------
.macro e2prom_2k
    clr tempreg1
    clr tempreg2
    ldi tempreg1, 0b10000000    ;0x80    ;записать WEN 1 перед изменением епром    
    ldi tempreg2, 0b01001101    ;0x4d        
    sts ECCR, tempreg1
    sts ECCR, tempreg2
    nop
    nop
    nop                
.endm

Пример макросов

Скачать проект "HelloworldAVRA"