|
ST Visual Develop для STM8 и математические функции |
|
|
|
Aug 11 2018, 08:59
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Господа, понадобилось мне разбить число float для вывода на сегментный индикатор (на целую и дробную части). Залез я в какой-то проект старый для STM32, где у меня это было реализовано - ан нет, не работает, библиотека math.h нужна. А а ST Visual Development нету такой. Попытался кормить ему тот файл, что в Keil - компилятор им подавился. Около сотни ошибок, подавляющее большинство из них - "not an argument" Собственно вопросы - кто-нибудь пытался вставить библиотеки от KEIL в ST Visual Development? Может в STVD есть свои математические функции? Если нет, то как протыми средствами C разделить float на челую и дробную (до двух знаков) части? Попробовал написать свою функцию, точностью до одного знака после запятой. Код void LCD_Show_Current(float current) {
int int_num, decimal_num; float decimal_part; int_num=current; decimal_part=current-int_num; decimal_num=decimal_part*10; } Результат странный - decimal part почему-то всегда меньше на 0.1 (соответственно decimal_num меньше на единицу). В функцию число поступает правильное (проверял уже внутри функции). А вот после decimal_part=current-int_num; получается недостача. В упор не вижу, где я ошибся? Тихо сам с собою - когда присваиваю переменной значение скажем 13.7, в отладчике оказывается, что переменная равна 13.69999998.... Что за самодеятельность контроллера?
Сообщение отредактировал zheka - Aug 11 2018, 08:45
|
|
|
|
|
 |
Ответов
|
Aug 12 2018, 18:18
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата Посмотрите на свои LCD_Show_Voltage()/LCD_Show_Temperature()/LCD_Show_Current() - не видите схожести? Ну если вы об этом... Они шлют разные команды, по разным адресам. Более того, значок процента для цифр в левой части экрана дисплей считает точкой (запятой) старшего разряда цифр, находящихся в правой части экрана. Управляя цифрами правой части экрана, нужно корректировать одну из цифр левой части, более того, нужно знать, что за параметр в данный момент в ней отображается (параметров 4, одновременно отображаемых - 2) Можно конечно выделить общее и написать универсальную функцию, но для этого должно до такой степени не хватать места, что трата времени на подобные хитрости себя оправдывает. Я же зная сколько места в контроллере, и имея опыт написания более объемных прошивок, полагал, что места хватит при самом небрежном отношении к коду. ДА его собственно и хватило, я поставил галку, как указал выше - все нормально. Эти 4 функции были написаны раздельно с целью упрощения рашифровки того, какой сегмент за что отвечает (даташита на дисплей нет). Цитата Зачем эти полотенца из send_command(0xC7);send_data(0x01); send_command(0x97); во многих местах? Что такое циклы - знаете? Есть функция LCD_Clear - там цикл уместен и я его использовал. А в остальных функциях.... А ну-ка, хорошо, вот Вам кусок кода, покажите, как бы Вы сделали из него цикл? Просто интересно. Код send_command(0x00); send_command(0x44); send_command(0xC7); if (int_num<10) send_data(0x00+percent_sign);else send_data(DIGITS[int_num/10]+percent_sign); send_command(0xCB); send_data(DIGITS[int_num%10]); send_command(0xCE); send_data(DIGITS[decimal_num]+1); send_command(0xCA); send_data(0x4); send_command(0x97); Но за критику в любом случае спасибо.
Сообщение отредактировал zheka - Aug 12 2018, 18:23
|
|
|
|
|
Aug 12 2018, 19:44
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата(jcxz @ Aug 12 2018, 22:18)  Самое простое и очевидное что можно сделать: написать функцию отправляющую не побайтно, а строку байт. Не спорю. И это можно сделать. Но повторюсь, задача экономии передо мной не стояла, да и не стоит. Моя прошивка будет существенно меньше той, что была в оригинала (там было еще меню настроек). Мне нужно было побыстрее, пусть и топорно, сделать небольшой реверс-инжиниринг. Для себя, лишь бы работало. Что-то не получается у меня с внешними прерываниями: Цитата ..... INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6) { GPIO_WriteHigh(BACKLIGHT_PORT, BACKLIGHT); // если прерывание сработает, то должна загореться подсветка (это не конечная цель, а просто способ отладки) }
.... main() {
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_IT); // кнопка, нога контроллера подтянута к питанию ITC_SetSoftwarePriority(ITC_IRQ_PORTD, ITC_PRIORITYLEVEL_1); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL); // кнопка замыкает на минус enableInterrupts();
// while(1); // для чистоты эксперимента, чтобы программа не шла дальше. Из комментариев все ясно. Брейкпоинты почему-то в STVD не ставятся... Прерывание не срабатывает. Вместе с тем есть еще одна странность - даже если отключить режим прерывания у пина, если вообще убрать текст обработчика (и сам обработчик), то как только вызвать enableInterrupts(); экран перестает работать. Как будто какое-то прерывание постоянно вызывается, что нарушает логику обмена информацией контроллером дисплея.
|
|
|
|
Сообщений в этой теме
zheka ST Visual Develop для STM8 и математические функции Aug 11 2018, 08:59 iiv замените на
Код decimal_num=((int)... Aug 11 2018, 10:00 zheka Что-то не совсем понял идею...
У меня, пока вы п... Aug 11 2018, 11:11 iiv Цитата(zheka @ Aug 11 2018, 16:11) Въехал... Aug 11 2018, 12:00 HardEgor Цитата(zheka @ Aug 11 2018, 15:59) Если н... Aug 11 2018, 12:19 Genadi Zawidowski Example
/* MODF.C */
#include <math.h>
#in... Aug 11 2018, 12:46 zheka КодЧую, что это обработка датчика температуры...
Н... Aug 11 2018, 19:12 jcxz Цитата(zheka @ Aug 11 2018, 22:12) Нет, э... Aug 11 2018, 19:15 Harbinger Цитата(zheka @ Aug 11 2018, 22:12) Неуже ... Aug 12 2018, 05:01 zheka Я использую COSMIC
Ну и нарисовалась очередная про... Aug 12 2018, 07:31 jcxz Цитата(zheka @ Aug 12 2018, 10:31) А прог... Aug 12 2018, 08:08 zheka Цитатас таким уменьем программирования, как в ... Aug 12 2018, 09:46 jcxz Цитата(zheka @ Aug 12 2018, 12:46) Или вы... Aug 12 2018, 14:27 Harbinger Аппаратный SPI там никак не задействовать? Кривая ... Aug 12 2018, 11:53 zheka Цитата(Harbinger @ Aug 12 2018, 14:53) Ап... Aug 12 2018, 12:45  aaarrr Цитата(zheka @ Aug 12 2018, 15:45) Как ок... Aug 12 2018, 12:51   zheka Цитата(aaarrr @ Aug 12 2018, 15:51) Так в... Aug 12 2018, 13:00 zheka ЦитатаЗачем хотя-бы дублировать одни и те же опера... Aug 12 2018, 14:33 jcxz Цитата(zheka @ Aug 12 2018, 17:33) Это гд... Aug 12 2018, 14:53 Harbinger Не видя всего проекта, сложно что-то сказать. Рабо... Aug 13 2018, 17:02 zheka Бесплатнее некуда
ЦитатаThe evaluation license is ... Aug 13 2018, 17:47 Harbinger Второе и предлагалось.
Cosmic на новом компе так и... Aug 13 2018, 18:29 zheka Н-да.. вы были правы. В IAR все работает.
Продолж... Aug 13 2018, 19:14 jcxz Цитата(zheka @ Aug 13 2018, 22:14) Почему... Aug 13 2018, 20:30 zheka Скачал полное руководство - RM0016
Описание halt з... Aug 14 2018, 18:21 zheka В общем я взял обычную китайскую отладочную плату,... Aug 18 2018, 18:54 jcxz Цитата(zheka @ Aug 18 2018, 21:54) Возвра... Aug 18 2018, 19:26 zheka ЦитатаА почему Вы вообще именно на STM8S экономию ... Aug 18 2018, 19:42 jcxz Цитата(zheka @ Aug 18 2018, 22:42) Я на В... Aug 18 2018, 20:10 zheka Проблема решена. Всем спасибо. Aug 19 2018, 06:47
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|