Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
25.11.2007, 01:56
|
|
Прописка
Регистрация: 02.05.2006
Сообщений: 171
Сказал спасибо: 97
Сказали Спасибо 43 раз(а) в 20 сообщении(ях)
|
...взять и поделить (двухбайтное число).
Может кто подскажет как поделить двухбайтное число - былоб однобайтное,дёрнул бы на разряд на право и все дела,а как дёрнуть двухбайтное (никаких запятых,на asm).
Спасибо.
|
|
|
|
25.11.2007, 02:27
|
|
Гражданин KAZUS.RU
Регистрация: 17.07.2006
Адрес: PV.DP.UA
Сообщений: 620
Сказал спасибо: 3
Сказали Спасибо 60 раз(а) в 48 сообщении(ях)
|
Телепаты в отпуске, поэтому хоть бы указал какой контроллер, на сколько делить...
Я так понимаю нужно делить на 2? Нет ничего проще - сдвигаешь вправо старший байт, потом младший, две команды(ну это для ПИКов, для АВР и других точно не знаю, но все примерно также должно быть).
__________________
Если ты читаешь это - значит тебе нечем заняться...
|
|
|
|
25.11.2007, 02:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: ...взять и поделить (двухбайтное число).
Сообщение от retas
|
былоб однобайтное,дёрнул бы на разряд на право и все дела,а как дёрнуть двухбайтное (никаких запятых,на asm).
|
Если сдвигами, значит степень двойки. Так и тут та же история, только нужно позаботиться, чтобы бит 0 старшего байта попал в бит 7 младшего, вот и вся недолга. Обычно, в асме для этого используют инструкции сдвига через флаг переноса - выдвигаемый бит попадает в CarryFlag, а в следующей инструкции - вдвигаемый бит берется из CarryFlag'а. Перед всей операцией сдвига нужно очистить флаг переноса, а-то, он попадет в 15-й бит результата.
Сообщение от vdlab
|
Нет ничего проще - сдвигаешь вправо старший байт, потом младший
|
А вот так делать не следует - результат будет ошибочным (даже для пиков). Кстати, если результат неважен, то неверно и то утверждение, что " Нет ничего проще" - тогда уж проще вообще ничего не делать - результат будет столь же неверным.
|
|
|
|
25.11.2007, 09:36
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Арифметика для AVR. Взята из аппноутов.
Удачи
Прикрепленный файл: 8217750.rar
|
|
|
|
25.11.2007, 10:38
|
|
Гражданин KAZUS.RU
Регистрация: 16.12.2004
Сообщений: 587
Сказал спасибо: 13
Сказали Спасибо 23 раз(а) в 9 сообщении(ях)
|
Re: ...взять и поделить (двухбайтное число).
Сообщение от tempora
|
Сообщение от vdlab
|
Нет ничего проще - сдвигаешь вправо старший байт, потом младший
|
А вот так делать не следует - результат будет ошибочным (даже для пиков). Кстати, если результат неважен, то неверно и то утверждение, что "Нет ничего проще" - тогда уж проще вообще ничего не делать - результат будет столь же неверным.
|
Вопрос. Почему деление на 2 нельзя заменять сдвигом на 1 вправо? Я везде так пользуюсь для сокращения времени работы и кода. Операция сдвига выполняется существенно быстрее чем операция деления. Можно поподробней. Сдвиг ес-но не циклический.
|
|
|
|
25.11.2007, 11:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
простите, никакой ошибки. Сдвигается первым именно старший байт - сдвигом, учитывающим перенос -заем
Код:
|
95: unsigned int q=0x4181;
0BD 3081 MOVLW 0x81
0BE 1283 BCF 0x3, 0x5
0BF 1303 BCF 0x3, 0x6
0C0 00A4 MOVWF 0x24
0C1 3041 MOVLW 0x41
0C2 00A5 MOVWF 0x25
96: q ›› =1;
0C3 1003 BCF 0x3, 0 // чистим бит переноса
0C4 0CA5 RRF 0x25, F //сдвигаем старший
0C5 0CA4 RRF 0x24, F//сдвигаем младший, учитывая бит переноса от старшего, который попадает в D7 младшего |
|
|
|
|
25.11.2007, 12:14
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,975
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Сообщение от urry
|
Т.е. сначала сдвигаем младший, затем старший - и бит заема-переполнения старшего байта идет в д7 младшего.
|
Все было верно раньше сказано. Первым сдвигается вправо старший! При этом используется команда арифметического сдвига. После выполнения этой команды мл. бит старшего остается в С разряде. Второй выполняется комнада циклического через С сдвига младшего - она задвигает С в ст. разряд
Для АВРок это выглядит так:
PS меня уже опередили
|
|
|
|
25.11.2007, 12:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: ...взять и поделить (двухбайтное число).
Сообщение от NemoCut32
|
Вопрос. Почему деление на 2 нельзя заменять сдвигом на 1 вправо?
|
А почему этот вопрос адресуется мне? Я как раз давал последовательность действий со сдвигом вправо, а не с делением, которого, кстати, в ассемблере чаще всего и нетути.
Сообщение от urry
|
... здесь имелась в виду ошибка - ...
Бит заема старшего байта после сдвига должен уйти в старший битт младшего. Т.е. сначала сдвигаем младший, затем старший - и бит заема-переполнения старшего байта идет в д7 младшего.
|
Дружище, ты сам себя запутал! В воскресенье утром, впрочем, это даже хорошо!
Если сдвигать (вправо, не так ли?) сначала младший, то его нулевой бит попадет в CF, а со следующей инструкцией - в старший бит старшего байта (там же тоже будет сдвиг вправо, не так ли?).
Я говорил совсем о другой ошибке... Даже если ограничиваться пиками младших и средних моделей (про старшие ничего не знаю), где всего один способ сдвигать - через CF, то всё равно описанная последовательность действий содержит мину случайного действия - человек забыл предусмотреть очистку флага переноса перед началом сдвигов... а процессор совсем не так догадлив, как нам того хотелось бы - если после предыдущих операций флаг будет установлен, проц, вопреки нашим планам, таки-засунет его, нимало не мохая, в старший бит результата! И будет потом человек, поверивший vdlab'у, дооолго дебажить свой кристалл, чтобы обнаружить эту трудноуловимую и неповторяющуюся ситуацию. Как говорится - дьявол кроется в мелочах! Меньше бита в этом алгоритме ничего нет, но разделив, скажем, 256 на 2, будет несколько непонятно получать иногда 128, а иногда - 32896. 8O
Добавлено: Ого, оказывется все в сборе!
|
|
|
|
25.11.2007, 12:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Сообщение от nml
|
Для АВРок это выглядит так:
|
Во-во, именно! Сдвиги-то бывают раазные!
|
|
|
|
25.11.2007, 13:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: ...взять и поделить (двухбайтное число).
Сообщение от tempora
|
.
Сообщение от vdlab
|
Нет ничего проще - сдвигаешь вправо старший байт, потом младший
|
А вот так делать не следует - результат будет ошибочным (даже для пиков).
|
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:41.
|
|