[an error occurred while processing this directive] [an error occurred while processing this directive]
Функция abs(), или не наступите на грабли !!!
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Сергей Тюнькин 25 августа 2001 г. 16:36

Столкнулся с такой проблемой:
Прибор (можно назвать дальномером) в составе которого ЦАП, АЦП, ОЗУ (32К*16)всем этим управляет EPM7128 (ALTERA) и обработка результатов на 80c552 (ЦП) при среднем уровне амплидуды зондирующего сигнала(ЗС) определяет адрес максимума точно. Доведя амплитуду ЗС до максимально возможной,прибор редко, но выдавал неверный результат. Процесс измерения производится в следующей последовательности:
1- запуск ЗС
2- прием отраженного сигнала и запись в ОЗУ
3- корреляционная обработка сигнала (КОС)
4- поиск адреса экстремума КОС
5- обработка результата
С 1 по 4 пункт занимается ALTERA, 5- 80с552.
Для поиска ошибки пришлость продублировать пункт 4 на ЦП, и что ?Результаты совпадают :(, хотя на развертке осциллографа видно, что максимум КОС в другом месте.
Убив день на поиски выяснилось, все дело в функции abs() и
представлении signed чисел. Например для 16-ти разрядного signed числа диапазон следующий: -32768 ... 32767 (0x8000 ... 0x7FFF).
Так вот abs(-32768) = -32768 (abs(0x8000)=0x8000)
Для интереса проверил в C++Builder, TP7 а сама программа ЦП писалась на C в uVision 2 V2.04b. Для пимера привожу небольшую тестовую программку для C++Builder

//////////////////////////////////////////////////////////////////
// 0 1 2 3 4 5 6 7 8 9
short int Buf[10]={1,111,-222,32760,-32767,32760,-32768,12,1,3};

short int Search_Max()
{
short int i,old,Addres;
old=Addres=0;
for(i=0;i!=10;i++)
{
if (abs(Buf[i])>old)
{
old=abs(Buf[i]);
Addres=i;
}
}
return(Addres);
}
Результат Addres=7 !

Все стало на свои места.



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru