Если кому надо привожу программку для оценки частоты осциллятора спомощью низкочастотного частотомера. (например популярным тестером UNI-T M890F/G у которых шкала измерений до 20Khz)
частота осциллятора делится на 1000 и результат выводится на все пины порта B.
Код
;***************************************************************************
; Программа деления частоты осциллятора на Fdivisor для измерения
; частоты осциллятора низкочатотными частотомерами
; компилятор: AVR Studio 4 (4.11 SP 3).
;***************************************************************************
.include <m16def.inc>
.equ OSCCALValue = $FF; Значение загружаемое в OSCCAL
.equ Fdivisor = 1000 ; делитель частоты осциллятора
.equ Port = PortB ; используемый порт ввода-вывода
.def AL = R16; Аккумулятор
.def BL = R18; вспомогательный регистр
.cseg
.equ PortDDR = Port - 1; регистр настройки направления порта
.org 0x0000
jmp PSTART ; Program Start
.org 0x000C
jmp TIM1_COMPA; Timer1 Compare A Handler
.org 0x002A
PSTART:
ldi AL ,high(RAMEND) ; Main program start
out SPH, AL ; Set Stack Pointer to top of RAM
ldi AL, low(RAMEND)
out SPL, AL
; <-- инициализация портов и регистров
ldi AL, $FF
out PortDDR, AL
clr BL
; <-- инициализация таймера
ldi AL, High( Fdivisor >> 1 )
out OCR1AH, AL
ldi AL, Low( Fdivisor >> 1 )
out OCR1AL, AL
ldi AL, 1 | (1 << CTC1)
out TCCR1B, AL
ldi AL, (1 << OCIE1A)
out TIMSK, AL
; <-- калибровка осциллятора
ldi AL, OSCCALValue
out OSCCAL, AL
; <-- инициализация ядра
ldi AL, (1 << SE)
out MCUCR, AL
sei
;****************************************************
; Основной цикл программы
;****************************************************
MainCycle: ; <----------- ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ
sleep
rjmp MainCycle ; <----------- ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ
;****************************************************
; Обработчик прерывания TMR1 (Timer 1 OC)
;****************************************************
TIM1_COMPA:; Timer1 Compare A Handler
com BL
out Port, BL
reti