Страница 1 из 2
32 разрядная арифметика AVR
Добавлено: Сб апр 25, 2009 08:17:22
_PM_
Коты. Делал ли кто нибуть подобное?
сумму и разность не предлагать

нужны нормальное деление
ну и умножение.
псип
Добавлено: Сб апр 25, 2009 09:02:07
ARV
Добавлено: Сб апр 25, 2009 09:46:43
_PM_
благодарствую

Добавлено: Сб апр 25, 2009 12:36:17
GP1
Ю.Ревич, в его замечательной книге "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера" не только 32-х но и любой разрядности, проверял работает.

Добавлено: Сб апр 25, 2009 14:11:22
_PM_
ААаааааа.. суперская книга!!
Спасибо!

Добавлено: Вс апр 26, 2009 11:22:26
GP1
BCluster писал(а):уу, у нас фанатики появились ))))
А вы попробуйте на Си сгенерировать последовательность импульсов с Ти=1 мкс и Тп=1 мкс

Добавлено: Вс апр 26, 2009 13:10:58
Барсик
GP1 писал(а):А вы попробуйте на Си сгенерировать последовательность импульсов с Ти=1 мкс и Тп=1 мкс

Запросто. Загоняю 8 разрядный таймер в Fast PWM моду, и получаю что хочу. Причём эта последовательность сохранится даже тогда, когда я буду на C обсчитывать свои долгие фоновые задачи

Добавлено: Вс апр 26, 2009 13:15:22
GP1
а если предположить, что все таймеры заняты другими задачами (мне однажы из-за того, что в мегах макс.4 таймера пришлось ставить еще один корпус) и при этом генерировать ту самую последовательность с точностью 1мкс.
Добавлено: Вс апр 26, 2009 13:26:09
Yellow Tiger
GP1 писал(а):А вы попробуйте на Си сгенерировать последовательность импульсов с Ти=1 мкс и Тп=1 мкс

Можно и короче.

Например, одна сто двадцать восьмая (1/128) от 1мкс - подойдет?
Нет? Нужна именно 1мкс? Ну, хорошо, пусть так:
Код: Выделить всё
PLLCSR=0x02;
while ((PLLCSR & 1)==0);
PLLCSR|=0x04;
TCCR1=0x51;
GTCCR=0x40;
TCNT1=0x00;
OCR1A=64;
OCR1C=128;
GP1 писал(а):а если предположить, что все таймеры заняты...
Во-первых, при чем здесь язык Си?

Да и поздно уже менять условия задачи - решение-то уже готово, теперь платить надо, а не вертеться.
А во-вторых - разве вы не чувствуете, что коллеги просто шутят? Всем, кроме новичков, хорошо известно, что в условиях недостатка тех или иных ресурсов, язык ассемблера - последнее средство. Но им также хорошо известно и то, что в других условиях ЯВУ - первейшее средство! И о чем спорить?

Добавлено: Вс апр 26, 2009 13:32:14
_PM_
Не пойму о чем вы спорите
В рамках архитектуры АВР язык асма и си ЭКВИВАЛЕНТНЫ
и их рамки определяются этой самой архитектурой. Фактически
нет ни одного решения которое можно сделать в одном и не сделать
в другом. Потому что ВСЕ делается через те же самые порты ВВ,
регистры, память.
Миритесь.
Добавлено: Вс апр 26, 2009 13:36:38
Yellow Tiger
_PM_ писал(а):ВСЕ делается через те же самые порты ВВ, регистры, память. Миритесь.
Несовсем согласен - разные там логарифмы, синусы/косинусы и прочее из той же серии лучше все же делать не через порты ввода/вывода, а на ЯВУ. Ну, удобнее же - согласитесь!
А вот с "миритесь" - согласен полностью!

Добавлено: Вс апр 26, 2009 13:40:41
GP1
Yellow Tiger писал(а):Например, одна сто двадцать восьмая (1/128) от 1мкс - подойдет?
Нет? Нужна именно 1мкс? Ну, хорошо, пусть так:
Код: Выделить всё
PLLCSR=0x02;
while ((PLLCSR & 1)==0);
PLLCSR|=0x04;
TCCR1=0x51;
GTCCR=0x40;
TCNT1=0x00;
OCR1A=64;
OCR1C=128;
При всем уважении, какова тактовая у Вас?
если учесть что при 20 МГц 1 тик занимает 0,05 мкс то при таких условиях период повторения Ваших импульсов будет 6,4 мкс

. а длительность импульса 3,4 мкс.
зы: да я ни с кем и не собирался ссориться

Добавлено: Вс апр 26, 2009 13:42:30
_PM_
Ой блин.. давайте без давайте
Асм + макросы >= ЯВУ. И спорить тут не о чем.
И удобней будет в разы. С другой стороны в Си тоже
макроопределения есть.
Давайте заведем отдельную тему и там сразимся.
Для затравки - вы знаете что существует 183 !!!
способа представления и обсчета матриц.
Добавлено: Вс апр 26, 2009 13:47:28
Yellow Tiger
GP1 писал(а):При всем уважении, какова тактовая у Вас?
А счетчик здесь не от тактовой запитан, а от тактовой, умноженной на восемь:
что для тактовой, равной 8МГцам, даст 64МГц, отсюда и top=128, чтобы получить полмегагерца (2мкс) в периоде.
_PM_ писал(а):Асм + макросы >= ЯВУ. И спорить тут не о чем.
Мнение настолько ммм... субъективное, что спорить - действительно не о чем.
Добавлено: Вс апр 26, 2009 13:59:42
GP1
Yellow Tiger
Или мы о разных процессорах говорим, или я от жизни отстал, но ни в одной меге, не говоря уже о тини, которые мне попадались, я не встречал умножителя тактовой

Добавлено: Вс апр 26, 2009 14:03:08
Yellow Tiger
Значит, не все попадались.

Глянь в тиньки -25, -45, -85...
Кстати, на 8 мегагерцах можно сделать полмегагерца на выходе и без аппаратных особенностей этих тинек - просто на общих принципах... сейчас покажу...
Нет, недооценил я CvAvr - всего четыре такта достаточно для этих целей, то есть, на 8МГцах будет аж в четыре раза быстрее, чем ты хотел.
Код: Выделить всё
while (1) PINB.0 = 1;
//_0x6:
// SBI 0x16,0 ; 2 cycles
// RJMP _0x6 ; 2 cycles
Тоже, правда, работает не на всех AVR'ках, но на многих, а если писать в лоб, то будет работать на всех, но уже в четыре раза быстрее не получится - впритык сработает.

Добавлено: Вс апр 26, 2009 14:12:03
GP1
Yellow Tiger писал(а):Значит, не все попадались.

Глянь в тиньки -25, -45, -85...
Посмотрел... все что нашел - что fclk=fфапч/4 т.е. 16МГц...
Добавлено: Вс апр 26, 2009 14:19:09
Yellow Tiger
GP1 писал(а):Посмотрел... все что нашел - ...
Неправильно ищешь - нужно искать регистр, который я в тексте использовал, я же не зря кусок кода цитировал...
Добавлено: Вс апр 26, 2009 14:25:57
GP1
Yellow Tiger
Разобрался, спасибо.
Век живи - век учись, бестолковым помрешь

Добавлено: Вс апр 26, 2009 14:29:07
Yellow Tiger
GP1 писал(а):Разобрался, спасибо.
Заметь - я привел и чисто сишный способ,
не требующий именно этих тинек с PLL'ями, способный выдать меандр с временами по четверть микросекунды на импульс и паузу. То есть, для достижения затребованных тобой времен, пришлось бы
снизить тактовую
в четыре раза!
