Код: Выделить всё
.include "tn25def.inc"
;= Start macro.inc ====
;= End macro.inc ====
; RAM =================
.DSEG ; Сегмент ОЗУ
.ORG SRAM_START+100
BCount: .byte 2 ;Переменная счетчик ударов
; FLASH ===============
.CSEG ; Кодовый сегмент
.ORG 0x000000
RJMP Reset
; ***** INTERRUPT VECTORS ************************************************
.ORG 0x0001
RJMP IC ;Прерывание по импульсу
.ORG 0x0002
RETI
.ORG 0x0003
RETI
.ORG 0x0004
RETI
.ORG 0x0005
RJMP RTClock ;Переполнение таймера RTC
.ORG 0x0006
RETI
.ORG 0x0007
RETI
.ORG 0x0008
RETI
.ORG 0x0009
RETI
.ORG 0x000A
RJMP IC2 ;Совпадение регистра сравнения A таймера RTC
.ORG 0x000B
RJMP RTClock1 ;Совпадение регистра сравнения B таймера RTC
.ORG 0x000C
RETI
.ORG 0x000D
RETI
.ORG 0x000E
RETI
;######################Константы######################
.equ Bar = 4 ;Константа такт
.equ Square = 16 ;Константа квадрат
.equ DSquare = 32 ;Константа двойка
.def RTCHigh = R18 ;Старший байт RTC(Часы)
.def StartTimeH = R19 ;Старший байт Первого импульса
.def StartTimeL = R20 ;Младший байт Первого импульса
.def EndTimeH = R21 ;Старший байт Второго импульса
.def EndTimeL = R22 ;Младший байт Второго импульса
.def SEndTimeH = R23
.def SEndTimeL = R24
.def AEndTimeH = R25
.def AEndTimeL = R26
;######################################################
;====
;========Инициализация===================
;====
Reset: LDI R16,RAMEND ;Инициализация стека
OUT SPL,R16
CLR R0
CLR R1
CLR R2
CLR R3
CLR R4
CLR R5
CLR R6
CLR R7
CLR R8
CLR R9
CLR R10
CLR R11
CLR R12
CLR R13
CLR R14
CLR R15
CLR R16
CLR R17
CLR R18
CLR R19
CLR R20
CLR R21
CLR R22
CLR R23
CLR R24
CLR R25
CLR R26
CLR R27
CLR R28
CLR R29
CLR R30
CLR R31
;==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!
LDI R16,7 ;Грузим в R16 0000 0111
OUT DDRB,R16 ;Вводим порт PB1 режим выхода
;==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!==УДАЛИТЬ ПОСЛЕ ДЕГБАГА !!!!!!!!!
;==Инициализация I\O и их прерываний
LDI R16,7 ;Грузим в R16 0000 0111
OUT PORTB,R16 ;Вводим порты PB0,PB1,PB2 режим PULL UP
LDI R16,2 ;Грузим в R16 0000 0010
OUT DDRB,R16 ;Вводим порт PB1 режим выхода
IN R16,MCUCR ;Загружаем регистр MCUCR
ORI R16,1<<1 ;Применяем маску ИЛИ 0000 0010 к регистру MCUCR
OUT MCUCR,R16 ;Возвращяем регистр MCUCR обратно
IN R16,GIMSK ;Загружаем регистр GIMSK
ORI R16,1<<6 ;Применяем маску ИЛИ 0100 0000 к регистру GIMSK
OUT GIMSK,R16 ;Возвращяем регистр GIMSK обратно
;==Инициализация таймера RTC========
;Разрешаем прерывания по переполнению таймера
IN R16,TIMSK ;Загружаем регистр TIMSK
ORI R16,1<<1 ;Применяем маску ИЛИ 00000010 к регистру TIMSK
OUT TIMSK,R16 ;Закидываем в таймер (разрешаем прерывания по переполнению)
;Програмируем таймер на счет тактовой частоты и запускаем
IN R16,TCCR0B ;Загружаем регистр TCCR0B
ORI R16,1<<0 ;Применяем маску ИЛИ 00000001 к регистру TCCR0B
OUT TCCR0B,R16 ;Возвращяем регистр TCCR0B обратно
SEI ;Разрешаем прерывания глобально
RJMP MainLoop ;Ожидание подачи сигнала
;====
;========Конец инициализации=============
;====
;========Диспетчер========Диспетчер========Диспетчер========Диспетчер========
Mainloop: NOP
NOP
NOP
NOP
NOP
NOP
RJMP Mainloop
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;*=*=*=*=*=*=*=*=*=*=*=*=*=Счетчик BPM*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
IC: Mov StartTimeH,EndTimeH
Mov StartTimeL,EndTimeL
Mov EndTimeH,RTCHigh
IN EndTimeL,TCNT0
RJMP Calc
IC1:
;==Очистим флаг регистра сравнения A==
IN R16,TIFR ;Загружаем регистр TIFR в R16
ANDI R16,16 ;Накладываем маску И 0001 0000 на регистр TIFR
OUT TIFR,R16 ;Загружаем R16 в регистрн TIFR тем самым очищяя флаг регистра сравнения A
;==Програмируем таймер генерировать прерывания по совпадению с регистром сравнения A
OUT OCR0A,AEndTimeL ;Выводим ACT в регистр сравнения A
IN R16,TIMSK ;Загружаем регистр TIMSK в R16
ORI R16,1<<4 ;Накладываем маску ИЛИ 0001 0000 на регистр TIMSK
OUT TIMSK,R16 ;Загружаем R16 в регистрн TIMSK тем самым разрешая прерывания по совпадению.
RETI
IC2: CP AEndTimeH,RTCHigh
BRNE IC3
CBI PORTB,1
LDI R17,1
RCALL IC
IC3: RETI
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;========Аспирант======
;EndTime subtrackt StartTime
Calc: Mov SEndTimeL,EndTimel
Mov SEndTimeH,EndTimeH
sub SEndTimeL,StartTimel
sbc SEndTimeH,StartTimeH
Mov AEndTimeL,EndTimel
Mov AEndTimeH,EndTimeH
add AEndTimeL,SEndTimeL
adc AEndTimeH,SEndTimeH
CPI AEndTimeH,128
BRLO Calc1
SUBI AEndTimeH,128
Calc1: RJMP IC1
;========Это часы реального времени, они считают========
RTClock: CPI R17,1
BRNE RTClockAB
SBI PORTB,1
CLR R17
RTClockAB: INC RTCHigh ;При переполнении младщего 8 битного регистра увеличиваем старший байт RTC
CPI RTCHigh,128 ;Сравниваем с точкой переполнения
BRLO RTCRETI ;Если не равно, уходим на RETI
;Если равно, досчитываем
;==Очистим флаг регистра сравнения B==
IN R16,TIFR ;Загружаем регистр TIFR в R16
ANDI R16,8 ;Накладываем маску И 0000 1000 на регистр TIFR
OUT TIFR,R16 ;Загружаем R16 в регистрн TIFR тем самым очищяя флаг регистра сравнения B
;==Програмируем таймер досчитать последние 128 тактов секунды
LDI R16,128 ;Загружаем в R16 128
OUT OCR0B,R16 ;Выводим 128 в регистр сравнения B
IN R16,TIMSK ;Загружаем регистр TIMSK в R16
ORI R16,1<<3 ;Накладываем маску ИЛИ 0000 1000 на регистр TIMSK
OUT TIMSK,R16 ;Загружаем R16 в регистрн TIMSK тем самым разрешая прерывания по совпадению.
RTCRETI: RETI
;==Прошла секунда, подготовка к подсчету следующей
RTClock1: IN R16,TIMSK ;Загружаем регистр TIMSK в R16
ANDI R16,247 ;Накладываем маску И 1111 0111 на регистр TIMSK
OUT TIMSK,R16 ;Загружаем R16 в регистрн TIMSK тем самым запрещяя прерывания по совпадению.
CLR RTCHigh ;Очистим старший байт RTC.
RETI ;Уходим
; EEPROM ==============
.ESEG ; Сегмент EEPROM