Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 25.06.2009, 13:08  
3ann
Временная регистрация
 
Регистрация: 21.11.2006
Сообщений: 96
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
3ann на пути к лучшему
По умолчанию Компилятор Hi-Tech, вычисление, на PIC12F675

На контроллер PIC12F675 по одному из входов поступает аналоговый сигнал, по двум другим выходам он передается на четырехразрядний семисегментный индикатор. Компиляция в Hi-Tech 8.05pl.
Если реализовать вычисление вот так:
unsigned int U_Val;
unsigned long N_ADC;
N_ADC = (ADRESH ‹‹ | ADRESL;
U_Val = N_ADC*489/100;
то вычисляет не правильно.
А если вот так
unsigned int U_Val;
unsigned int N_ADC;
N_ADC = (ADRESH ‹‹ | ADRESL;
U_Val = (long)N_ADC*489/100;
то правильно.
Возможно подскажет кто - почему и как правильно организовать вычисления в Hi-Tech, для случая когда входные данные 10 разрядов, а выходные, масштаби-рованные в диапазоне, например, 0...9999 или 0...99999 (десятичные для вывода на цифровой индикатор). Только,пожалуйста, не отсылайте к литературе на английском языке, я пытался что-то понять в руководстве на английском по Hi-Tech, даже с помощью PROMT, но безуспешно(как пишут в анкетах "читаю со словарем" как-то и только на немецком). [/i]
Реклама:
3ann вне форума  
Непрочитано 25.06.2009, 13:24  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Ну а хайтек здесь причем ?
Стандартная практика в любом диалекте си - проводится приведение формата данных к результату. По переполнению инт-а неправильный результат.
Указав параметр (long) Вы сделали умножение (привели к лонгу оба типа ) и затем целую часть в результат.
По поводу перевода itoa - поиск здесь толково не работает, но примеров немеряно, поверьте, тема поднималась несчетное число раз.
Ну вот рубились
http://www.microchip.su/showthread.php?t=4050
urry вне форума  
Непрочитано 25.06.2009, 16:51  
3ann
Временная регистрация
 
Регистрация: 21.11.2006
Сообщений: 96
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
3ann на пути к лучшему
По умолчанию

Вы пишете "тема поднималась несчетное число раз".Вот и мне казалось что должна бала. И прежде чем открывать эту тему как новую, я попытался поиском на этом форуме последовательно со словами сначала "вычисление", затем "арифметические операции" найти какие-то сообщения, но следовал ответ "не найдено".
Подскажите, что-ли как искать.
Вашу фразу "Указав параметр (long) Вы сделали умножение (привели к лонгу оба типа ) и затем целую часть в результат." я что-то не совсем понял.
Вы пишете "...проводится приведение формата данных к результату", как и в книгах по СИ .
Поскольку результат - U_Val,то я
пытался сделать вот так:
unsigned long U_Val;
U_Val = N_ADC*489/100;
но снова вычисляется не верно.
3ann вне форума  
Непрочитано 25.06.2009, 17:51  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Простите, я невнимательно посмотрел. Формат лонг - это целое число.
"Родным" форматом числа с плавающей запятой для Хайтека является тип double (float) - 3 или 4 байтовый, в зависимости от установок компилятора.
Чтобы корректно просмотреть результат в отладчике, выставьте формат - 4 байта.
В Вашем случае для получения дробного числа результата
Код:
double U_Val;
int N_ADC=2;
U_Val = (double)N_ADC*489/100;
Присоединяю кусочек русского описания на компилятор.

-- Прилагается рисунок: --

Прикрепленный файл: 1946041.pdf
urry вне форума  
Непрочитано 25.06.2009, 23:26  
avr123-nm-ru
Почётный гражданин KAZUS.RU
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
avr123-nm-ru на пути к лучшему
По умолчанию

Сообщение от urry
Стандартная практика в любом диалекте си - проводится приведение формата данных к результату.
точнее к типу данных которые хранит переменная в которую данные желают поместить.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
avr123-nm-ru вне форума  
Непрочитано 26.06.2009, 09:30  
3ann
Временная регистрация
 
Регистрация: 21.11.2006
Сообщений: 96
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
3ann на пути к лучшему
По умолчанию

"Стандартная практика в любом диалекте си - проводится приведение формата данных к результату."
"точнее к типу данных которые хранит переменная в которую данные желают поместить".
Если это так, то почему считает не правильно вот это
unsigned int N_ADC;
unsigned long U_Val;
U_Val = N_ADC*489/100;
- "переменная в которую данные желают поместить" в этом случае результат unsigned long U_Val;
3ann вне форума  
Непрочитано 26.06.2009, 09:42  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Где неправильно ???

-- Прилагается рисунок: --

urry вне форума  
Непрочитано 26.06.2009, 10:47  
avr123-nm-ru
Почётный гражданин KAZUS.RU
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
avr123-nm-ru на пути к лучшему
По умолчанию

Сообщение от 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
avr123-nm-ru вне форума  
Непрочитано 26.06.2009, 13:34  
SUI
Частый гость
 
Регистрация: 28.06.2006
Сообщений: 20
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
SUI на пути к лучшему
По умолчанию

Переменная N_ADC у вас типа unsigned int при перемножении на константу (489) получаем тот же тип (unsigned int), т.е. если у вас десяти разрядный АЦП (максимальное значение 1023) при перемножении получим 489х1023=500247, в то время как максимальное значение переменной unsigned int всего 65535. Компилятору надо сообщить, чтобы он результат этой операции рассматривал как число с большей разрядностью (один из операндов привести к типу unsigned long)
Вы же сами b ответили на свой вопрос, написав - U_Val = (long)N_ADC*489/100
SUI вне форума  
Непрочитано 29.06.2009, 10:46  
3ann
Временная регистрация
 
Регистрация: 21.11.2006
Сообщений: 96
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
3ann на пути к лучшему
По умолчанию

Примерно понятно теперь для приведенного примера
(U_Val = (long)N_ADC*489/100).
А если, например, решение квадратного (или кубического) уравнения типа
U_Val = N_ADC*N_ADC*N_ADC*489+N_ADC*N_ADC*500
где расставлять эти (long)и? Или эта задача решается принципиально по другому?
3ann вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot