Перейти к содержанию

Проблема с использованием sprintf при работе с АЦП


illogic

Рекомендуемые сообщения

Добрый день!
в мк новичок, разбираюсь с ацп, проблема:
хочу значение ADC, переведенное в float (чтоб вольты показывать), запихать в массив char, с целью вывода на дисплей. Для этих целей использую sprintf. Однако он работает как угодно, но не так как надо) В частности, не работает только вариант, который приведу ниже, причем в VS он работает как надо, а в atmel нет.

float fladc = ADC/400;
    char buff[50];
    sprintf(buff, "%f", fladc);
    LCDwrite(buff);

//где LCDwrite это:

void LCDwrite ( char* ch){
        DataPort = 0x00;
    int L = strlen(ch);
    for (int x = 0; x!=L; x++){
        DataPort = *ch++;
        ControlPort |= (1<<RS)|(1<<E);
        ControlPort &= ~(1<<E);
        _delay_us(50);
    }

 

не работает именно %f, если просить его вывести символ/целое число - все работает и выводится на дисплей.
В интересующем меня (и не работающем) случае на экран выводится один "?". 
На форуме впервые, если что не так - обязательно учту :)

Изменено пользователем illogic
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

для начала сравните  размер скомпилированного файла с этой функцией  а потом без... 

... нужно брать ваше float и любым доступным простым способом "вручную" выцарапывать из него "разряды" для отображения.

Ссылка на комментарий
Поделиться на другие сайты

@dasZebra Спасибо :)
Но даже если я не буду использовать эту функцию, остается вопрос - почему не работает то, чисто из любопытства хочется понять.

Ссылка на комментарий
Поделиться на другие сайты

о не, тут  вникать нет смысла, ибо причин может быть до и больше.... начиная от того, что возможно компилятор и не собирался компилить эту функцию как нужно 

Ссылка на комментарий
Поделиться на другие сайты

18 минут назад, illogic сказал:

почему не работает то,

Вот тут показано, как заставить эту функцию работать: надо поставить тик в настройках Atmel STUDIO 6 и добавить библиотеку.

Ссылка на комментарий
Поделиться на другие сайты

13 минуты назад, dasZebra сказал:

эту функцию в МК нельзя использовать.... .не в смысле не буде работать, а просто нельзя. ну почти как на ноль делить

Феерический бред!

Только что, dasZebra сказал:

о не, тут  вникать нет смысла, ибо причин может быть до и больше

Еще один феерический бред. Причина только одна: по умолчанию проект линкуется с "усеченной" версией форматированного ввода-вывода, без поддержки float. Как лечить - было подсказано @Yurkin2015

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

20 минут назад, dasZebra сказал:

эту функцию в МК нельзя использовать

Вы запретили? Использовать данную функцию можно и она отлично работает. Единственный недостаток - огромный расход флеша МК. Если память критична, можно вообще уйти от float домножив число на 10, 100, 1000, в зависимости от точности,  а потом разбить на разряды обычным делением и сформировать массив char.

Ссылка на комментарий
Поделиться на другие сайты

@Yurkin2015 Благодарю!

в моем случае эта функция действительно увеличивает размер HEX файла с три раза, так что попробую сделать так, как предложил @BARS_:) 

Изменено пользователем illogic
Ссылка на комментарий
Поделиться на другие сайты

Только что, dasZebra сказал:

Доктор тот, кто первым халат одел?

Не надо было снимать. 

Вы сами виноваты, что с безапелляционной уверенностью вещали откровенную чушь.

Только что, illogic сказал:

в моем случае эта функция действительно увеличивает размер HEX файла с три раза

Эта "функция" увеличивает не в разы, а на 1,5-2,5 килобайта. Если ваша прошивка состоит из двух строк - это много, а если из 200 - то уже нормально. А для 2000 будет и незаметно. Эта функция еще и "медленная", что тоже учитывать надо.

Кстати, вас не смущает тот факт, что само применение float в вашем проекте уже тянет на 1,5-2 килобайта прошивки? Попробуйте для смеху заменить float на int и поглядеть, во что превратится ваша прошивка...

И тем не менее, ардуинщики и CVAVR-щики сильно про float не парятся, и, в общем-то, свои задачи успешно решают.

 

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

36 минут назад, BARS_ сказал:

Вы запретили?

было дело....:rolleyes:... и память оно жрет не только для флота... 

9 минут назад, ARV сказал:

Эта "функция" увеличивает не в разы, а на 1,5-2,5 килобайта.

а если той памяти всего 2 килобайта?... 

Ссылка на комментарий
Поделиться на другие сайты

Только что, BARS_ сказал:

А если памяти 8Кб то уже не только заметно, но и недопустимо...

Мне придется повториться...

Только что, ARV сказал:

Вы сами виноваты, что с безапелляционной уверенностью вещали откровенную чушь.

На 8 килобайтах printf и float отлично уживаются. Вы еще скажите, что на Си для attiny13 писать нельзя.

А любое безапелляционное утверждение понижает уровень доверия к вашей компетентности.

Только что, dasZebra сказал:

а если той памяти всего 2 килобайта?

Что это доказывает? Ведь памяти бывает и 128 килобайт, не так ли? Разве отсутствие у вас нужной технической базы оправдывает запрет на применение чего-либо в других случаях?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Только что, ARV сказал:

На 8 килобайтах printf и float отлично уживаются.

Это если программа маленькая. float да, а вот принт в принципе не нужен, сформировать массив для дисплея проще пареной репы.

 

Только что, ARV сказал:

безапелляционное утверждение

А я так ничего и не утверждал.

Ссылка на комментарий
Поделиться на другие сайты

Только что, BARS_ сказал:

А я так ничего и не утверждал.

Разве? А вот это разве не безапелляционное утверждение:

Только что, BARS_ сказал:

если памяти 8Кб то уже не только заметно, но и недопустимо

Утверждение в категоричной форме - это оно самое.

Только что, BARS_ сказал:

принт в принципе не нужен

Вот еще одно утверждение на грани. Не нужен - это сильно, тем более в принципе.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • @korsaj Сегодня попробовал сделать как ты посоветовал. Получился следующий код. #define F_CPU 7372800UL #define BAUND 9600L #define UBRRL_value (F_CPU/(BAUND*16))-1 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> void init_pin(void); #define C_PC0 (~PINC&(1<<PC0)) #define C_PC1 (~PINC&(1<<PC1)) #define LED_1_ON() PORTD|=(1<<PD2) #define LED_1_OFF() PORTD&=~(1<<PD2) #define LED_2_ON() PORTD|=(1<<PD3) #define LED_2_OFF() PORTD&=~(1<<PD3) #define FLAG_END_RX (1<<3) #define FLAG_ERR_RX (1<<4) #define BUF_SIZE 20 char rx_buf[BUF_SIZE]; char buf_index = 0; volatile start=1, flags; char b; ISR(USART_RXC_vect) { b=UDR; if(!(flags & FLAG_END_RX)) { rx_buf[buf_index]=UDR; if(rx_buf[buf_index] == 0x0D) { flags |= FLAG_END_RX; return; } buf_index++; if(buf_index >= BUF_SIZE) { buf_index = 0; flags |= FLAG_ERR_RX; } } } void init_UART() { UBRRL = UBRRL_value; UBRRH = UBRRL_value>>8; UCSRB|=(1<<TXEN); UCSRB|=(1<<RXEN); UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)); UCSRB|=(1<<RXCIE); sei(); flags = 0; } void send_UART(char value) { while(!(UCSRA&(1<<UDRE))); UDR=value; } int main(void) { init_pin(); init_UART(); while(1) { if (start==1) { _delay_ms(500); send_UART('O'); send_UART('K'); send_UART('!'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); start=0; } if (b == '0') { LED_1_ON(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '1') { LED_1_OFF(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '2') { LED_1_ON(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('2'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '3') { LED_1_OFF(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('3'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (C_PC0) { send_UART('P'); send_UART('C'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } if (C_PC1) { send_UART('P'); send_UART('C'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } } } void init_pin(void) { DDRC = 0b00000000; PORTC = 0b11111111; DDRD |= ((1<<2)|(1<<3)); PORTD &=~ ((1<<2)|(1<<3)); } Ну как сказать всё работает, но вот меня очень интересует приём команд на саму ATMEGA16. Он так и работает только с цифрами. Более ничего корректно принять не получается даже используя таблицу ascii. А мне нужно будет принимать команды и посложней чем просто буквенно - цифровые. Потому как возвращаясь к командам самого плеера там в этих командах хранятся различные данные. Вот примерно так это всё выглядит. AT+QM \ r \ n Запрос режима работы [0: Bluetooth], [1: MP3] AT+M1 \ r \ n Номер текущего файла AT+M2 \ r \ n Общее количество звуковых файлов AT+MD \ r \ n Источник музыки USB или SD Card AT+MT \ r \ n Общее время воспроизведения текущего файла AT+MK \ r \ n Время воспроизведения текущего файла AT+MP \ r \ n Текущее состояние плеера [0]Стоп, [1]Воспроизведение, [2]Пауза К примеру при отправке команды AT+M1 \ r \ n в ответ мы получим M1 + 000002 \ r \ n при этом здесь может быть любое число в hex формате. Мне же нужно каким то образом принять эти данные и обработать их соответствующим образом. Но при этом и нужно учитывать так же что плеер может сам отправить эти данные по началу воспроизведения трека. Вот в этом сейчас и стоит основная задача. Чего я и пытаюсь получить в итоге.
    • Ну тогда дорога к сименсу в гости - они вам какой-нибудь Desigo CC или даже Siematic предложат, тыщ за 10 долларов. Ну и ещё тыщ 5 надо будет отдать за контроллеры и их конфигурирование.   А если попроще - то можно к отечественным MasterSCADA обратиться, либо к WiredBoard - у них не совсем SCADA система, но нормальные контроллеры, довольно просто настраиваются и можно графическую оболочку рисовать.
    • тогда вы имеете то, что имеете, и никак от этого не избавиться. Хоть святой водой окропите. "Или трусы или крестик" (с) Нагрузки у вас немаленькие. Вы же с нуля переделываете, снова некуда ? Понятие LowESR очень неконкретное. Сколько вешать в граммах ? пустая трата времени
    • Да все это туфта, выеденного яйца не стоит. В общем чушь собачья. На мониторе тему уже сплавили в мусорку, а здесь треп еще будет на 10 страницах. Все камеры, их у него было три, исправные. Записывают отлично. А дальше вся проблема в этом. Особо интересно - монтажник видео.
    • 1. А это как определяется?  Так пробовали на другом смотреть? 2. Так как всё-таки смотрели - напрямую с камеры или "Копирование файлов на компьютер ничего не меняет по сравнению с просмотром с камеры напрямую"?
    • Может быть повторюсь, но - самому впаивать в имеющую схему радиодетали не имею желания, хочется узнать - может есть в природе плата, которую необходимо будет просто приобрести и  расключить правильно? Я так понимаю один канал надо инвертировать, но чем. Вопрос только в этом
×
×
  • Создать...