...примеров море, стоит только поискать http://www.avr-asm-tutorial.net/avr_en/ ... RSION.htmlНарод, есть всем известное преобразование BIN2BCD, а кто делал обратное BCD2BIN?
Мелкие вопросы по МК и ПЛИС.
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
- Реклама
Опять ассемблер
В сети ассемблера завались, а вот на Сях...
Так и придётся циклами.
В сети ассемблера завались, а вот на Сях...
Так и придётся циклами.
Последний раз редактировалось Chettuser Вс апр 07, 2013 20:49:48, всего редактировалось 1 раз.
Код: Выделить всё
uint fn_atoi(uchar *cPAR)
{
uint iRez=0;
while(*cPAR)
{
iRez = iRez*10+(*cPAR-'0');
*cPAR++;
}
return iRez;
}- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
- Реклама
А что такого? В вашем Мк нет двух свободных байт для хранения переменой int? В случае со знаковой переменной ваши 9999 легко помещаются в +-32 767.Ээээ! У меня не суперкомпьютер! А всего лишь скромные PIC16/18.
Лениво, особенно если есть готовоеChipKiller писал(а): можно и на С переписать
Есть, только операции умножения слишком прожорливы и по времени и по памяти.vitalik_1984 писал(а): В вашем Мк нет двух свободных байт для хранения переменой int? В случае со знаковой переменной ваши 9999 легко помещаются в +-32 767.
Он имел в виду реализацию умножения контроллер потянет с превеликим натягом... если хватит памяти вообще.
А в чем проблема с ассемблером? вставляй отдельным инклудом, PUSH/POP используемые регистры в подпрограмме и делов-то. Даже глаза мозолить не будет.
А вообще, для PIC-ов я гдето видел математически выведенные алгоритмы BCD-BIN и BIN-BCD преобразования для различных разрядностей, потреблением памяти и времени выполнения. С виду тарабарщина после обфускатора, а работу выполняет верно и быстро...
А вообще в таких алгоритмах можно обойтись без умножения - умножение на 10 заменяется суммой числа умноженного на 2 и на 8. в первом случае это всего лишь сдвиг на один бит, а во втором - на 3 бита.
В твоем примере - берется переменная результата X, и выполняется ряд операций:
X = D
X = X * 10 + C
X = X * 10 + B
X = X * 10 + A
4 присваивания, 3 умножения на 10(сдвиг числа на 1 бит и на 3) и 3 операции сложения. Никакого тяжеляка.
А в чем проблема с ассемблером? вставляй отдельным инклудом, PUSH/POP используемые регистры в подпрограмме и делов-то. Даже глаза мозолить не будет.
А вообще, для PIC-ов я гдето видел математически выведенные алгоритмы BCD-BIN и BIN-BCD преобразования для различных разрядностей, потреблением памяти и времени выполнения. С виду тарабарщина после обфускатора, а работу выполняет верно и быстро...
А вообще в таких алгоритмах можно обойтись без умножения - умножение на 10 заменяется суммой числа умноженного на 2 и на 8. в первом случае это всего лишь сдвиг на один бит, а во втором - на 3 бита.
В твоем примере - берется переменная результата X, и выполняется ряд операций:
X = D
X = X * 10 + C
X = X * 10 + B
X = X * 10 + A
4 присваивания, 3 умножения на 10(сдвиг числа на 1 бит и на 3) и 3 операции сложения. Никакого тяжеляка.
Да, правильно. Только запись в OCR FF - это удаление гланд через Ж... Лучше перевести таймер в обычный режим счёта.FreshMan писал(а):ааааааааааа......, тогда выходит надо не только запрещать прерывание по переполнению но и поднимать планку до FF
я правильно уразумел ?
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
То что надо, завтра додумаю. Спасибо!Alexeyslav писал(а): X = D
X = X * 10 + C
X = X * 10 + B
X = X * 10 + A
4 присваивания, 3 умножения на 10(сдвиг числа на 1 бит и на 3) и 3 операции сложения. Никакого тяжеляка.
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
Можно подробнее про умножение на 10 четырьмя сдвигами? Туго доходит.Alexeyslav писал(а):3 умножения на 10(сдвиг числа на 1 бит и на 3)
С уважением,
Виктор.
Виктор.
X * 10 = X * 8 + X * 2
К сдвинутому влево на 3 прибавляем сдвинутое один раз.
1. сдвигаем влево один раз. Запоминаем в NNN.
2. сдвигаем еще два раза.
3. прибавляем NNN.
4. радуемся.
1. сдвигаем влево один раз. Запоминаем в NNN.
2. сдвигаем еще два раза.
3. прибавляем NNN.
4. радуемся.
Docendo discimus
Эх.. не поленился я...
PIC16, HI-TECH PICC :64 байта ROM, 6 байт RAM, выполнение = 254 цикла.
72 байта ROM, 6 байт RAM, выполнение = 262 цикла.
72 байта ROM, 6 байт RAM, выполнение = 262 цикла.
PS: Ну почему у людей такое недоверие к компиляторам ? Неужели кто-то считает, что они глупее нас ?
PIC16, HI-TECH PICC :
Код: Выделить всё
unsigned char A,B,C,D;
unsigned int X;
X=D*1000 + C*100 + B*10 + A;
Код: Выделить всё
unsigned char A,B,C,D;
unsigned int X;
X = D;
X = X * 10 + C;
X = X * 10 + B;
X = X * 10 + A;
Код: Выделить всё
#define MUL_10(v) (((v)<<1) + ((v)<<3))
unsigned char A,B,C,D;
unsigned int X;
X = D;
X = MUL_10(X) + C;
X = MUL_10(X) + B;
X = MUL_10(X) + A;
PS: Ну почему у людей такое недоверие к компиляторам ? Неужели кто-то считает, что они глупее нас ?
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
Извините. Так и я умею. В тексте было сказано про четыре сдвига. Здесь же присутствует еще и операция сложения.Леонид Иванович писал(а):X * 10 = X * 8 + X * 2
Я недопонял, думал автор умеет чистыми сдвигами на 10 умножать. Вот и мне захотелось.
С уважением,
Виктор.
Виктор.
Я тоже...Аlex писал(а):Эх.. не поленился я...
64 байта ROM, 6 байт RAM, выполнение = 52 цикла!!!72 байта ROM, 6 байт RAM, выполнение = 262 цикла.
Код: Выделить всё
unsigned char A,B,C,D;
unsigned int X;
X = D;
X = (X<<1UL);
X = (X<<3UL);
X = X + C;
X = (X<<1UL);
X = (X<<3UL);
X = X + B;
X = (X<<1UL);
X = (X<<3UL);
X = X + A;
Та не... Просто некоторые не только читают статьи tester'а, а и задумываются...PS: Ну почему у людей такое недоверие к компиляторам ? Неужели кто-то считает, что они глупее нас ?![]()
http://www.pic24.ru/doku.php/osa/articl ... _выражений
По хорошему... одна строка - одно действие...Не делать длинных и сложных выражений
"Я не даю готовых решений, я заставляю думать!"(С)
Тут вроде как не на 10, а на 16 умножение получается.HHIMERA писал(а):Код: Выделить всё
X = D; X = (X<<1UL); X = (X<<3UL); X = X + C;
Ставим плюсы: )
Да.. недоглядел...
133 байт ROM, 10 байт RAM, 121 cycles
Реапьно используется сдвиг, а не умножение, как во всех примерах приведённых Alex...
Код: Выделить всё
unsigned char A,B,C,D;
unsigned int X, Y, Z;
X = D;
Y = (X << 1);
Z = (X << 3);
X = Y + Z + C;
Y = (X << 1);
Z = (X << 3);
X = Y + Z + B;
Y = (X << 1);
Z = (X << 3);
X = Y + Z + A;
Реапьно используется сдвиг, а не умножение, как во всех примерах приведённых Alex...
"Я не даю готовых решений, я заставляю думать!"(С)
Мда. На меге быстрее раза в 3-4 будет за счет аппаратного умножителя. 
Ставим плюсы: )
Где-то за 42 cycles...
А PIC24 за 18 cycles...

А PIC24 за 18 cycles...
"Я не даю готовых решений, я заставляю думать!"(С)


