реклама на сайте
подробности

 
 
> Обработка 19 разрядного числа.
Nosaer
сообщение Dec 2 2015, 04:52
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 85
Регистрация: 6-02-15
Пользователь №: 84 967



Здравствуйте. Возможно глупый вопрос, но я окончательно запутался с арифметикой 16 и 8 битных значений.
16 разрядный таймер контроллера считает внешнии импульсы.
Периодически он переполняется, количество переполнений я считаю в отдельную переменную. (К сожалению все таймеры в контроллере задействованы, поэтому из двух 16 разрядных, сделать один 32 разрядный не получится.)
Итого, с учетом всех переполнений, у меня максимально может получится 19 разрядное число.
Которое мне нужно поделить на 8, то есть сдвинуть на 3 разряда вправо, чтобы оно стало 16 разрядным.
и затем вычесть из получившегося значения 0x07FF.

На ассемблере эту задумку я осуществить могу, с помощью команд LSR, SUBI, SBCI и оперируя тремя регистрами.
А на С не получается. Городить вставки ассемблера в код на С не хочу. Пользуюсь AVR Studio.

Надеюсь на вашу помощь, или хотя бы на ссылку на литературу где могу прочитать про это.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Непомнящий Евген...
сообщение Dec 2 2015, 05:23
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Код
unsigned ticks;
(ticks >> 3) - 0x7ff;


В ticks можно складывать переполнения как ticks += 0x10000, а затем устанавливать младшие 2 байта из счетчика.

Или хочется не собирать все в промежуточную переменную?

Если нигде не напутал, то что-то такое
Код
byte overflows;
word res = (TCCR>>3) + (overflows<<13);


Правда не уверен, что это будет быстрее первого варианта.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 10:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016