Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
25.06.2009, 13:08
|
|
Временная регистрация
Регистрация: 21.11.2006
Сообщений: 96
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Компилятор Hi-Tech, вычисление, на PIC12F675
На контроллер PIC12F675 по одному из входов поступает аналоговый сигнал, по двум другим выходам он передается на четырехразрядний семисегментный индикатор. Компиляция в Hi-Tech 8.05pl.
Если реализовать вычисление вот так:
unsigned int U_Val;
unsigned long N_ADC;
N_ADC = (ADRESH ‹‹ ![Горд собой](images/smilies/icon_dovl.gif) | ADRESL;
U_Val = N_ADC*489/100;
то вычисляет не правильно.
А если вот так
unsigned int U_Val;
unsigned int N_ADC;
N_ADC = (ADRESH ‹‹ ![Горд собой](images/smilies/icon_dovl.gif) | ADRESL;
U_Val = (long)N_ADC*489/100;
то правильно.
Возможно подскажет кто - почему и как правильно организовать вычисления в Hi-Tech, для случая когда входные данные 10 разрядов, а выходные, масштаби-рованные в диапазоне, например, 0...9999 или 0...99999 (десятичные для вывода на цифровой индикатор). Только,пожалуйста, не отсылайте к литературе на английском языке, я пытался что-то понять в руководстве на английском по Hi-Tech, даже с помощью PROMT, но безуспешно(как пишут в анкетах "читаю со словарем" как-то и только на немецком). [/i]
|
|
|
|
25.06.2009, 13:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Ну а хайтек здесь причем ?
Стандартная практика в любом диалекте си - проводится приведение формата данных к результату. По переполнению инт-а неправильный результат.
Указав параметр (long) Вы сделали умножение (привели к лонгу оба типа ) и затем целую часть в результат.
По поводу перевода itoa - поиск здесь толково не работает, но примеров немеряно, поверьте, тема поднималась несчетное число раз.
Ну вот рубились
http://www.microchip.su/showthread.php?t=4050
|
|
|
|
25.06.2009, 16:51
|
|
Временная регистрация
Регистрация: 21.11.2006
Сообщений: 96
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Вы пишете "тема поднималась несчетное число раз".Вот и мне казалось что должна бала. И прежде чем открывать эту тему как новую, я попытался поиском на этом форуме последовательно со словами сначала "вычисление", затем "арифметические операции" найти какие-то сообщения, но следовал ответ "не найдено".
Подскажите, что-ли как искать.
Вашу фразу "Указав параметр (long) Вы сделали умножение (привели к лонгу оба типа ) и затем целую часть в результат." я что-то не совсем понял.
Вы пишете "...проводится приведение формата данных к результату", как и в книгах по СИ .
Поскольку результат - U_Val,то я
пытался сделать вот так:
unsigned long U_Val;
U_Val = N_ADC*489/100;
но снова вычисляется не верно.
|
|
|
|
25.06.2009, 17:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Простите, я невнимательно посмотрел. Формат лонг - это целое число.
"Родным" форматом числа с плавающей запятой для Хайтека является тип double (float) - 3 или 4 байтовый, в зависимости от установок компилятора.
Чтобы корректно просмотреть результат в отладчике, выставьте формат - 4 байта.
В Вашем случае для получения дробного числа результата
Код:
|
double U_Val;
int N_ADC=2;
U_Val = (double)N_ADC*489/100; |
Присоединяю кусочек русского описания на компилятор.
-- Прилагается рисунок: --
![](https://kazus.ru/nuke/users_images/25062009/3678476.jpg)
Прикрепленный файл: 1946041.pdf
|
|
|
|
25.06.2009, 23:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Сообщение от urry
|
Стандартная практика в любом диалекте си - проводится приведение формата данных к результату.
|
точнее к типу данных которые хранит переменная в которую данные желают поместить.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
26.06.2009, 09:30
|
|
Временная регистрация
Регистрация: 21.11.2006
Сообщений: 96
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
"Стандартная практика в любом диалекте си - проводится приведение формата данных к результату."
"точнее к типу данных которые хранит переменная в которую данные желают поместить".
Если это так, то почему считает не правильно вот это
unsigned int N_ADC;
unsigned long U_Val;
U_Val = N_ADC*489/100;
- "переменная в которую данные желают поместить" в этом случае результат unsigned long U_Val;
|
|
|
|
26.06.2009, 09:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Где неправильно ???
-- Прилагается рисунок: --
|
|
|
|
26.06.2009, 10:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Сообщение от 3ann
|
U_Val = N_ADC*489/100;
- "переменная в которую данные желают поместить" в этом случае результат unsigned long U_Val;
|
Нет ! и деление у вас целочисленное.
в 1 байт вы можете любые числа закидывать - хть мульен - но там всегда будет 1 байт !
"Язык Си для микроконтроллеров" - http://avr123.nm.ru/05.htm
Кстати CVAVR на такие выражения вонинги пишет - "возможно переполнение" типа.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
26.06.2009, 13:34
|
|
Частый гость
Регистрация: 28.06.2006
Сообщений: 20
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Переменная N_ADC у вас типа unsigned int при перемножении на константу (489) получаем тот же тип (unsigned int), т.е. если у вас десяти разрядный АЦП (максимальное значение 1023) при перемножении получим 489х1023=500247, в то время как максимальное значение переменной unsigned int всего 65535. Компилятору надо сообщить, чтобы он результат этой операции рассматривал как число с большей разрядностью (один из операндов привести к типу unsigned long)
Вы же сами b ответили на свой вопрос, написав - U_Val = (long)N_ADC*489/100
|
|
|
|
29.06.2009, 10:46
|
|
Временная регистрация
Регистрация: 21.11.2006
Сообщений: 96
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Примерно понятно теперь для приведенного примера
(U_Val = (long)N_ADC*489/100).
А если, например, решение квадратного (или кубического) уравнения типа
U_Val = N_ADC*N_ADC*N_ADC*489+N_ADC*N_ADC*500
где расставлять эти (long)и? Или эта задача решается принципиально по другому?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
вычисление CRC
|
qaz12345qaz12345 |
Микроконтроллеры, АЦП, память и т.д |
32 |
23.08.2010 23:55 |
Вычисление параметров синусоиды по отсчетам, снятых с АЦП
|
_DmZ_ |
Микроконтроллеры, АЦП, память и т.д |
11 |
08.10.2008 16:23 |
Странное вычисление температуры DS18S20
|
nagano |
Микроконтроллеры, АЦП, память и т.д |
0 |
20.08.2008 08:58 |
компилятор C Hi-Tech, не работают директивы #asm #endasm
|
alexplev |
Микроконтроллеры, АЦП, память и т.д |
2 |
26.04.2008 22:47 |
компилятор fuzzy tech-mp lkz microchip
|
MrDigital |
Микроконтроллеры, АЦП, память и т.д |
0 |
26.11.2004 14:50 |
Часовой пояс GMT +4, время: 23:37.
|
|