16 битный счетчик или как посчитать до 65535 на 8 битном мк
Добавлено: Пт фев 21, 2020 10:09:39
Всем Привет ! понадобилось мне как то посчитать прерывания от таймера больше чем 256 раз. В интернете не нашел готовых алгоритмов. Искал не долго минут 30.
Вообщем решил написать свой - прошу оценить насколько это правильно я сделал. Может кому то пригодится.
Код на ассемблере avr
;*****************************************
; 16 битный счетчик - использовать только 1 рон
;*******************************************
.include "tn13def.inc"
;****** РЕГИСТРЫ
.def tmp0=r16 ; используется везде в качестве переменной для обмена данными
.def count_timer=r18 ; 1 байт нашего счетчика
;*******************************************
rjmp start ;Reset Handle
reti ;Внешнее настраиваемое прерывание External Interrupt Request 0 INT0
reti ;Внешнее прерывание по изменению состояния вывода Pin Change Interrupt Request 0 PCINT0
reti ;Прерывание по переполнению таймера/счетчика 0
reti ;EE_READY_vect EEPROM готова
reti ;ANALOG_COMP_vect Аналоговый компаратор переключился
reti ;TIMER0_COMPA_vect Прерывание по сравнению, канал A таймера/счетчика 0
reti ;TIMER0_COMPB_vect Прерывание по сравнению, канал B таймера/счетчика 0
reti ;WDT_vect Сторожевой таймер (если используется в качестве источника прерывания)
reti ;ADC_vect Преобразование АЦП завершено
.dseg
counter2: .byte 1 ; Выделяем 1 ячеку в озу для хранения второго байта счетчика
.cseg ; область команд
reset:
ldi tmp0, low(RAMEND) ; Стандартная инициализация стека
out SPL,tmp0
ldi count_timer,0 ; Обнуляем первый байт счетчика, величина второго байта не принципиальна при сбросе мк
start: inc count_timer ; Добавляем единичку
BRBS SREG_Z,overfl ; Для проверки достижения макс знач - переполн. Используем проверку флага Z регистор флагов
rjmp start
overfl:
ldi count_timer,0 ; Обнуляем первый байт счетчика
lds tmp0,counter2 ; Читаем из оперативы выделенный байт counter2
inc tmp0 ; Так как команда inc не может напрямую работать с ячейкой озу - используем переходн. перем TMP0
sts counter2,tmp0 ; Сохраняем в озу новое значение counter2 увеличенное на 1. (инкрементируем)
BRBS SREG_Z,overfl1 ; Для проверки достижения макс знач - переполн. Используем проверку флага Z регистор флагов
rjmp start ; Если нужно досчитать до другого значения используем другую комаду ветвления их в мк много.
overfl1: nop
Вообщем решил написать свой - прошу оценить насколько это правильно я сделал. Может кому то пригодится.
Код на ассемблере avr
;*****************************************
; 16 битный счетчик - использовать только 1 рон
;*******************************************
.include "tn13def.inc"
;****** РЕГИСТРЫ
.def tmp0=r16 ; используется везде в качестве переменной для обмена данными
.def count_timer=r18 ; 1 байт нашего счетчика
;*******************************************
rjmp start ;Reset Handle
reti ;Внешнее настраиваемое прерывание External Interrupt Request 0 INT0
reti ;Внешнее прерывание по изменению состояния вывода Pin Change Interrupt Request 0 PCINT0
reti ;Прерывание по переполнению таймера/счетчика 0
reti ;EE_READY_vect EEPROM готова
reti ;ANALOG_COMP_vect Аналоговый компаратор переключился
reti ;TIMER0_COMPA_vect Прерывание по сравнению, канал A таймера/счетчика 0
reti ;TIMER0_COMPB_vect Прерывание по сравнению, канал B таймера/счетчика 0
reti ;WDT_vect Сторожевой таймер (если используется в качестве источника прерывания)
reti ;ADC_vect Преобразование АЦП завершено
.dseg
counter2: .byte 1 ; Выделяем 1 ячеку в озу для хранения второго байта счетчика
.cseg ; область команд
reset:
ldi tmp0, low(RAMEND) ; Стандартная инициализация стека
out SPL,tmp0
ldi count_timer,0 ; Обнуляем первый байт счетчика, величина второго байта не принципиальна при сбросе мк
start: inc count_timer ; Добавляем единичку
BRBS SREG_Z,overfl ; Для проверки достижения макс знач - переполн. Используем проверку флага Z регистор флагов
rjmp start
overfl:
ldi count_timer,0 ; Обнуляем первый байт счетчика
lds tmp0,counter2 ; Читаем из оперативы выделенный байт counter2
inc tmp0 ; Так как команда inc не может напрямую работать с ячейкой озу - используем переходн. перем TMP0
sts counter2,tmp0 ; Сохраняем в озу новое значение counter2 увеличенное на 1. (инкрементируем)
BRBS SREG_Z,overfl1 ; Для проверки достижения макс знач - переполн. Используем проверку флага Z регистор флагов
rjmp start ; Если нужно досчитать до другого значения используем другую комаду ветвления их в мк много.
overfl1: nop