реклама на сайте
подробности

 
 
> ST Visual Develop для STM8 и математические функции
zheka
сообщение Aug 11 2018, 08:59
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zheka
сообщение Aug 12 2018, 18:18
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 12 2018, 19:18
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(zheka @ Aug 12 2018, 21:18) *
А ну-ка, хорошо, вот Вам кусок кода, покажите, как бы Вы сделали из него цикл? Просто интересно.

Самое простое и очевидное что можно сделать: написать функцию отправляющую не побайтно, а строку байт.
Ну а в первую очередь - убрать float-ы.
Go to the top of the page
 
+Quote Post
zheka
сообщение Aug 12 2018, 19:44
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 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(); экран перестает работать. Как будто какое-то прерывание постоянно вызывается, что нарушает логику обмена информацией контроллером дисплея.

Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 13 2018, 14:05
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(zheka @ Aug 12 2018, 22:44) *
Из комментариев все ясно. Брейкпоинты почему-то в STVD не ставятся...

Может не стоит мучаться и взять IAR? Там всё работает. Он бесплатный для Вашего МК.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 11:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01422 секунд с 7
ELECTRONIX ©2004-2016