Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка 19 разрядного числа.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Nosaer
Здравствуйте. Возможно глупый вопрос, но я окончательно запутался с арифметикой 16 и 8 битных значений.
16 разрядный таймер контроллера считает внешнии импульсы.
Периодически он переполняется, количество переполнений я считаю в отдельную переменную. (К сожалению все таймеры в контроллере задействованы, поэтому из двух 16 разрядных, сделать один 32 разрядный не получится.)
Итого, с учетом всех переполнений, у меня максимально может получится 19 разрядное число.
Которое мне нужно поделить на 8, то есть сдвинуть на 3 разряда вправо, чтобы оно стало 16 разрядным.
и затем вычесть из получившегося значения 0x07FF.

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

Надеюсь на вашу помощь, или хотя бы на ссылку на литературу где могу прочитать про это.
Непомнящий Евгений
Код
unsigned ticks;
(ticks >> 3) - 0x7ff;


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

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

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


Правда не уверен, что это будет быстрее первого варианта.
Nosaer
Благодаря вашему ответу понял как лучше реализовать и что моя ошибка была в типе данных, решил использовать unsigned long
Спасибо=)
Непомнящий Евгений
Цитата(Nosaer @ Dec 2 2015, 09:37) *
Вот я получил после всех своих операций 16 разрядное число, как мне его можно разделить по разрядно на старший и младший байт?


Код
uint16_t x;
byte lo = x&0xff, hi = x>>8;

// или

union {
  uint16_t x;
  byte part[2];
};
Alex11
Это примерно все равно. В первом случае компилятор, как правило, не делает сдвигов, а сразу выбирает нужный байт из памяти.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.