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

 
 
> Обработка 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
Ответов (1 - 4)
Непомнящий Евген...
сообщение 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
Nosaer
сообщение Dec 2 2015, 06:37
Сообщение #3


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

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



Благодаря вашему ответу понял как лучше реализовать и что моя ошибка была в типе данных, решил использовать unsigned long
Спасибо=)


Сообщение отредактировал Nosaer - Dec 2 2015, 06:48
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 2 2015, 07:25
Сообщение #4


Знающий
****

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



Цитата(Nosaer @ Dec 2 2015, 09:37) *
Вот я получил после всех своих операций 16 разрядное число, как мне его можно разделить по разрядно на старший и младший байт?


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

// или

union {
  uint16_t x;
  byte part[2];
};
Go to the top of the page
 
+Quote Post
Alex11
сообщение Dec 2 2015, 09:52
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Это примерно все равно. В первом случае компилятор, как правило, не делает сдвигов, а сразу выбирает нужный байт из памяти.
Go to the top of the page
 
+Quote Post

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

 


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


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