Помогите оптимизировать код
|
|
nekill |
Дата: Пн, 08.08.2011, 08:34 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
2
Замечания:
±
На сайте с 05.08.2011
Статус:
Offline
|
Всех приветствую. Сделал электронный барометр на датчике MPX4115A, работает, но в связи с тем, что выходная характеристика датчика линейная но имеет небольшой наклон, зависимость выходного сигнала от давления выглядит следующим образом Vout=Vs*(.0009*P-0.0095) , где Р давление в кПа Из этой формулы выразим значение давления P=((Vout/Vs)+0.095)/0.0009, для давления в кПа P=((Vout/Vs)+0.095)/0.0012, для давления в мм ртутного столба В программе для получения значения давления использовал формулу в след виде P=((volt+1)/256)+0.095)/0.0012, где volt-значение АЦП, но так как PicBasic с дробными числами не работает, я ничего другого придумать не смог как разложить числа на целые и дробные части и считать их отдельно, причем когда в расчете дробной части получается целое число, его приходится переносить в целую часть числа и считать далее. В итоге все работает, но код программы мне не нравится можно ли его оптимизировать. Подскажите как.
' ---------------------[Подключаемые файлы и настройка режимов]---------------------------
' Задание параметров для команды ADCIN PIC16F876 Define ADC_BITS 8 ' Задать число разрядов в результате Define ADC_CLOCK 3 ' Выбрать источник тактового сигнала (3 = RC) Define ADC_SAMPLEUS 50 ' Задать время преобразования в микросекундах
' ---------------------[Переменные]------------------------------------------------------- ' adval var byte ' Создать переменную для хранения результата advam var word volt var byte indic var word decimal var word rez1 var word rez2 var word rez3 var word delen1 var word delen2 var word delen3 var word delen4 var word ' ' ---------------------[Процедура инициализации]------------------------------------------ Init: PortB = $00 ' Все выходы перед началом сбросить в 0 TrisB = %00000000 ' Все выводы порта PORTB сделать выходами
' ---------------------[Основная программа]-----------------------------------------------
TRISA = %11111111 ' Сделать все выводы порта PORTA входами ADCON1 =%00000010 ' Сделать выводы порта PORTA аналоговыми входами
Define LOADER_USED 1 ' Эта строка нужна только если для прошивки
DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 3 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 0 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000 ' Задать паузу между передачей команд на ЖКИ DEFINE LCD_DATAUS 50 ' Задать паузу между передачей данных на ЖКИ
start: ADCIN 2, volt ' Преобразовать напряжение в канале 2
rez1=((volt+1)*100)/256 delen1=((volt+1)*100)//256 delen2=(delen1*10)/1000 rez2=((rez1*10)+delen2+95)*10 delen3=(delen1//1000)*10 delen4=delen3/1000 indic=(rez2+delen4)/12 ' целая часть значения давления для вывода на дисплей decimal=(rez2+delen4)//12 ' десятичная часть значения давления для вывода на дисплей
lcdout $fe,1, dec volt," P=", dec (indic),",", dec1 (decimal) pause 1000
goto start
Сообщение отредактировал
nekill - Пн, 08.08.2011, 08:40
|
|
|
|
MasterPic |
Дата: Сб, 13.08.2011, 11:44 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Используй переменные типа Float, если позволяет место.
|
|
|
|
ivan_fd |
Дата: Сб, 13.08.2011, 17:52 | Сообщение # 3 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Quote (MasterPic) Используй переменные типа Float, если позволяет место.
Quote (nekill) но так как PicBasic с дробными числами не работает
Это PicBasicpro, у него нету типа Float. Разве, что использовать внешние модули.
Сообщение отредактировал
ivan_fd - Сб, 13.08.2011, 17:53
|
|
|
|
deskjet |
Дата: Вс, 14.08.2011, 14:28 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
143
Замечания:
±
На сайте с 20.06.2009
Статус:
Offline
|
Quote (nekill) Помогите оптимизировать код Это проще простого и не надо связываться с Float. Нужно в операциях деления\умножения избавляться от дробных чисел. Для этого, в арифметических операциях, нужно использовать числа умноженные например на 1000, и в конце вычислений разделить результат на ту же тысячу.
За 20 8 дней ни одного сгоревшего микроконтроллера. PIC12, PIC16, PIC18, ATtiny, ATmega, STM8, STM32, MSP430
|
|
|
|
MasterPic |
Дата: Вс, 14.08.2011, 15:41 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Ну у него так и сделано, вообще-то. А в PBP можно подключить библиотеки для работы с Float
|
|
|
|