Страница 1 из 2

32 разрядная арифметика AVR

Добавлено: Сб апр 25, 2009 08:17:22
_PM_
Коты. Делал ли кто нибуть подобное? :roll:

сумму и разность не предлагать :oops: нужны нормальное деление
ну и умножение.

псип

Добавлено: Сб апр 25, 2009 09:02:07
ARV

Добавлено: Сб апр 25, 2009 09:46:43
_PM_
благодарствую :roll:

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

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

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

Добавлено: Вс апр 26, 2009 13:10:58
Барсик
GP1 писал(а):А вы попробуйте на Си сгенерировать последовательность импульсов с Ти=1 мкс и Тп=1 мкс :wink:
Запросто. Загоняю 8 разрядный таймер в Fast PWM моду, и получаю что хочу. Причём эта последовательность сохранится даже тогда, когда я буду на C обсчитывать свои долгие фоновые задачи :)

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

Добавлено: Вс апр 26, 2009 13:26:09
Yellow Tiger
GP1 писал(а):А вы попробуйте на Си сгенерировать последовательность импульсов с Ти=1 мкс и Тп=1 мкс :wink:
Можно и короче. :) Например, одна сто двадцать восьмая (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_
Не пойму о чем вы спорите :lol:
В рамках архитектуры АВР язык асма и си ЭКВИВАЛЕНТНЫ
и их рамки определяются этой самой архитектурой. Фактически
нет ни одного решения которое можно сделать в одном и не сделать
в другом. Потому что ВСЕ делается через те же самые порты ВВ,
регистры, память.

Миритесь.

Добавлено: Вс апр 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_
Ой блин.. давайте без давайте :lol:

Асм + макросы >= ЯВУ. И спорить тут не о чем. :wink:
И удобней будет в разы. С другой стороны в Си тоже
макроопределения есть.

Давайте заведем отдельную тему и там сразимся.
Для затравки - вы знаете что существует 183 !!!
способа представления и обсчета матриц.

Добавлено: Вс апр 26, 2009 13:47:28
Yellow Tiger
GP1 писал(а):При всем уважении, какова тактовая у Вас?
А счетчик здесь не от тактовой запитан, а от тактовой, умноженной на восемь:

Код: Выделить всё

while ((PLLCSR & 1)==0);
PLLCSR|=0x04;
что для тактовой, равной 8МГцам, даст 64МГц, отсюда и top=128, чтобы получить полмегагерца (2мкс) в периоде.
_PM_ писал(а):Асм + макросы >= ЯВУ. И спорить тут не о чем.
Мнение настолько ммм... субъективное, что спорить - действительно не о чем.

Добавлено: Вс апр 26, 2009 13:59:42
GP1
Yellow Tiger
Или мы о разных процессорах говорим, или я от жизни отстал, но ни в одной меге, не говоря уже о тини, которые мне попадались, я не встречал умножителя тактовой :shock:

Добавлено: Вс апр 26, 2009 14:03:08
Yellow Tiger
Значит, не все попадались. 8) Глянь в тиньки -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 писал(а):Значит, не все попадались. 8) Глянь в тиньки -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'ями, способный выдать меандр с временами по четверть микросекунды на импульс и паузу. То есть, для достижения затребованных тобой времен, пришлось бы снизить тактовую в четыре раза! :)))