16 битный счетчик или как посчитать до 65535 на 8 битном мк

Обсуждаем контроллеры компании Atmel.
Ответить
neitrino777
Родился
Сообщения: 19
Зарегистрирован: Вс сен 09, 2018 06:42:27

16 битный счетчик или как посчитать до 65535 на 8 битном мк

Сообщение neitrino777 »

Всем Привет ! понадобилось мне как то посчитать прерывания от таймера больше чем 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
Вложения
16bit_counter.asm
(2.25 КБ) 177 скачиваний
algoritm 16bit.jpg
(32.21 КБ) 175 скачиваний
Работа - продажа электронных компонентов. А для души - есть Ассемблер, дочка и сын.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение ARV »

алгоритм-то у вас нарисован не правильный... не по достижению 255 ветвление, а по переполнению, т.е. по достижению 256.
кроме того, если надо "досчитать" до какого-то значения, логичнее считать вычитанием из этого значения до нуля.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение akl »

neitrino777 Начинать счёт лучше с 0.

Код: Выделить всё

;rjmp start ;Reset Handle
rjmp RESET ;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,-1 ; предустановка в -1
;ldi count_timer,0 ; Обнуляем первый байт счетчика, величина второго байта не принципиальна при сбросе мк

start: inc count_timer ; Добавляем единичку
Последний раз редактировалось akl Пт фев 21, 2020 12:18:32, всего редактировалось 2 раза.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение ARV »

чем лучше-то? как по мне, так вычитанием проще. у топикстартера счет до 65535, если модифицировать его алгоритм для счета ДО ЛЮБОГО 16-битного числа - что выйдет? при вычитании те же 7 команд.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15561
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение BOB51 »

ADIW/SBIW забыли...
8)
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение ARV »

не забыли. при счете на вычитание проверить равенство нулю двухбайтового числа можно одой командой OR, а при счете на увеличение сравнить два двухбайтных числа (счетчик и заданное) одной командой никак не выйдет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15561
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение BOB51 »

А то, что ОБЕ эти команды (ADIW/SBIW) ставят Z=1 при результате = 0х0000
НЕ ПОДХОДИТ?
:wink:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение ARV »

BOB51 писал(а):НЕ ПОДХОДИТ?
как по мне, так без разницы, я ассемблером перегорел давно. все не упомнишь - если ставят Z, то и чудесно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15561
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение BOB51 »

Да и я не так часто самоделки верчу...
Старые "шпоры" и конспект выручают!
шпора AVR.pdf
(60.25 КБ) 146 скачиваний
(Тем более прыгать ассемблеру между трех семейств... :wink: )
:beer:
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение NStorm »

Чем люди только не занимаются, лишь бы C не изучать ;P
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15561
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение BOB51 »

Си/С++ я лучше с ардуинкой скушаю.
(https://radiokot.ru/forum/viewtopic.php?f=62&t=156720)
Оно друг дружке никак не мешает - только польза от взаимодополнений.
8)

Поставил топикстартеру плюсик за активность - маловато сейчас народу начинающего,
пусть не стесняются свои замечания/пробы публиковать - мы также не сразу "вумными котанами" стали!
:beer:
neitrino777
Родился
Сообщения: 19
Зарегистрирован: Вс сен 09, 2018 06:42:27

Re: 16 битный счетчик или как посчитать до 65535 на 8 битно

Сообщение neitrino777 »

Спасибо всем. Значит в правильном направление двигаюсь. С нуля считать да - наверное удобней. Хочу хорошо знать ассемблер - что бы выжимать из железок по максиму. Понятно, что крупные проекты это си или модули побольше. Мне важно понимать как это работает внутри на случай если что-то не работает уметь это чинить -оптимизировать.
Работа - продажа электронных компонентов. А для души - есть Ассемблер, дочка и сын.
Ответить

Вернуться в «AVR»