|
Согласование переменных разных типов |
|
|
|
Feb 5 2010, 19:35
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
Цитата(ukpyr @ Feb 5 2010, 21:06)  а что вы передаете в lcd_putdata (что возвращает get_freq) ? в lcd_putdata уходит char (который возвращает get_freq), так как если передавать в чистом виде числовое значение, то дисплей его считает как код символа и соответственно показывает символ, соответствующий полученному значению.
|
|
|
|
|
Feb 6 2010, 17:29
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
На данный момент решён вопрос с отображение значений во float. Действия следующие: Код char* get_freq() { static char Str[16]; double tmp; tmp = 560.1223; sprintf(Str, "%4.4fkHz", tmp); return Str;
} Т.е. в таком виде работает отлично (плюс дополнительные команды к линкеру для подключения внешних библиотек) + 2к к размеру флэша.
|
|
|
|
|
Feb 7 2010, 12:30
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
Вариант #2. В таком виде - работает. Если раскомментить и вызвать через функцию - виснет. Почему? Проц поставил ATmega32. main.hКод #ifndef _MAIN_H #define _MAIN_H #endif #define khzFmt "F=%4.4fkHz" #define mhzFmt "F=%3.4fMHz" char buf[16]; main.cКод #ifndef F_CPU #define F_CPU 8000000UL #endif #include <avr/io.h> #include <stdio.h> #include <stdint.h> #include "lcd.h" #include "main.h" /*void hzToStr(char* buf, const uint32_t hz, uint8_t freqSelect) { double fd = (float)hz / 1000.0f; if (freqSelect == 0) snprintf(buf, sizeof(buf), khzFmt, fd); if (freqSelect == 1) snprintf(buf, sizeof(buf), mhzFmt, fd); }*/ int main(void) { uint32_t hz = 1325235; lcd_init(); double fd = (double)hz / 1000.0f; snprintf(buf, sizeof(buf), khzFmt, fd); lcd_putdata(1, (char*)buf); //hzToStr(buf, hz, 0); //lcd_putdata(1, (char*)buf); lcd_putdata(2, "adflasdf"); while(1){;} }
|
|
|
|
|
Feb 7 2010, 13:16
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Если уж использовать в WinAVR printf, то тогда так: Код void lcd_putchar(char data); // то, что уже есть
int lcd_file_putc(char ch, FILE * stream) { (void) stream; lcd_putchar(ch); return 0; }
// аналогично создаём и для UART void uart_putchar(char ch); // он может вообще в кольцевой буфер помещать, ждать только если места нет int uart_file_putc(char ch, FILE * stream) { (void) stream; if(ch == '\n') uart_putchar('\r'); uart_putchar(ch); return 0; }
FILE lcd_file = FDEV_SETUP_STREAM(lcd_file_putc, 0, _FDEV_SETUP_WRITE); FILE uart_file = FDEV_SETUP_STREAM(uart_file_putc, uart_file_getc, _FDEV_SETUP_WRITE);
#define lcd_stream (&lcd_file); #define uart_stream (&uart_file);
fprintf_P( lcd_stream, PSTR("Freq %6.3fMHz"), freq);
fputs_P( PSTR("Hello!\n"), uart_stream); fprintf_P( uart_stream, PSTR("Freq %6.3fMHz"), freq); А для ЖКИ можно и вообще так: Код void lcd_printf_P(uint8_t x, uint8_t y, prog_char *fmt, ...) __attribute__((format(printf, 3, 4)));
void lcd_printf_P(uint8_t x, uint8_t y, prog_char *fmt, ...) { lcd_gotoxy(x,y);
va_list vl; va_start(vl, fmt); vfprintf_P( lcd_stream, fmt, vl); va_end(vl); }
lcd_printf_P(1, 5, PSTR("%6.3MHz"), freq); Раз уж платить увеличенным расходом кода, то хоть знать за что. Цитата(GoodNews @ Feb 7 2010, 14:30)  Если раскомментить и вызвать через функцию - виснет. Почему? Да так вроде всё нормально. Не вижу причины :-( Определять переменные в .h нехорошо (это я про char buf[16]), но к зависанию это не имеет отношения.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 7 2010, 15:49
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
Цитата(ReAl @ Feb 7 2010, 15:16)  Если уж использовать в WinAVR printf Собственно я не WinAVR использую. Платформа Linux, ядро 2.6.28-17_x86-64, компилятор AVR-GCC, прогер - avrdude, программатор - AVRISP (JONIS+ в запасе), набор библиотек avr-libc.
|
|
|
|
|
Feb 7 2010, 17:05
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(GoodNews @ Feb 7 2010, 17:49)  Собственно я не WinAVR использую. Платформа Linux, ядро 2.6.28-17_x86-64, компилятор AVR-GCC, прогер - avrdude, программатор - AVRISP (JONIS+ в запасе), набор библиотек avr-libc. Да это я по привычке, конечно, имелись ввиду avr-gcc и avr-libc, а инсталлятором этого добра и средой для выполнения служат WinAVR+Windows или apt + Linux - какая разница? У меня проекты собираются и там, и там.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 7 2010, 17:51
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
Цитата(ReAl @ Feb 7 2010, 19:05)  Да это я по привычке, конечно, имелись ввиду avr-gcc и avr-libc, а инсталлятором этого добра и средой для выполнения служат WinAVR+Windows или apt + Linux - какая разница? У меня проекты собираются и там, и там. Ну там сильно отличий наверное нету. Только библиотеки по-разному называются (ioavr.h против io.h насколько я помню). Но не принципиально. Я думаю что реализую через int, так как всё-таки работает не так, как хотелось бы. Пока попробую через int в общем. Спасибо!
|
|
|
|
|
Feb 8 2010, 16:37
|

Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259

|
Цитата(XVR @ Feb 8 2010, 13:01)  Пока видна 1 ошибка - sizeof(buf) в hzToStr и main не равны, т.к. в main это массив, а в hzToStr это указатель (параметр) Его надо было тоже как указатель использовать в main?
|
|
|
|
|
Feb 14 2010, 09:52
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(GoodNews @ Feb 7 2010, 19:51)  Ну там сильно отличий наверное нету. Только библиотеки по-разному называются (ioavr.h против io.h насколько я помню). Вообще нету. #include <avr/io.h> и побежали. Я же говорю - компилирутся и под вин, и под убунтой одни и те же проекты без изменений вообще и без ОС-зависимых define-ов. Цитата(GoodNews @ Feb 8 2010, 18:37)  Его надо было тоже как указатель использовать в main? Нет, в hzToStr нужно отдельным параметром передавать длину буфера. В первый просмотр я, наверное, ослеп, раз такое не заметил :-(
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|