Например TDA7294

Форум РадиоКот • Просмотр темы - WinAvr в вопросах и ответах
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс окт 19, 2025 16:20:55

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2195 ]     ... , , , 63, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пт сен 21, 2012 13:27:29 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12
Рейтинг сообщений: 67
Зарегистрирован: Пт авг 27, 2010 05:57:06
Сообщений: 2482
Откуда: Тюмень
Рейтинг сообщения: 0
Бесполезная трата временных ресурсов на подсчет символов, а потом еще и на вывод.Тем более если в буфере у вас находится не ноль, судя по картинке.
Лучше уж тогда использовать
Код:

Lcd_send_buffer
(unsigned char * buffs){
    while (*buffs[i]){
    Lcd_send_char(*buffs[i++]);
    }
}
 

и буфер заполнять так
Код:
 
sprintf
(buffer"Out= %d/0"1234); 
 


Вроде так как то.Поправьте, если что не так.Пока нечем проверить


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пт сен 21, 2012 19:08:19 
Встал на лапы
Аватар пользователя

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт фев 21, 2012 20:42:26
Сообщений: 135
Откуда: Санкт-Петербург, Россия, Земля
Рейтинг сообщения: 0
vitalik_1984 писал(а):
Вроде так как то.Поправьте, если что не так.

А чего тут поправлять - это оптимальный вариант.
Только /0 лишнее - sprintf и так вставляет завершающий ноль.

_________________
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пт сен 21, 2012 22:26:08 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12
Рейтинг сообщений: 67
Зарегистрирован: Пт авг 27, 2010 05:57:06
Сообщений: 2482
Откуда: Тюмень
Рейтинг сообщения: 0
Вставлять то вставляет, только почему на экране появляются палочки?Получается это такой пользовательский символ выводится.
И если это он, то получается, что такой функцией уже нельзя будет вывести пользовательский символ с адресом 0.Так выходит?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 08:54:55 
Встал на лапы
Аватар пользователя

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт фев 21, 2012 20:42:26
Сообщений: 135
Откуда: Санкт-Петербург, Россия, Земля
Рейтинг сообщения: 0
Мне видится это так.
Изначально буфер заполнен нулями. Потом функция sprintf кладёт туда строку и 0x00. Функция
Код:
LCDString(buffer, 16);
посылает весь буфер, включая нули, в индикатор. А индикатор печатает 0x00 как палочки.

_________________
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 10:53:43 
Открыл глаза
Аватар пользователя

Зарегистрирован: Сб май 07, 2011 14:35:24
Сообщений: 53
Откуда: Россия
Рейтинг сообщения: 0
Еще вначале эксперимента инициализировал буфер заправляя нулями специально, перед тем как использовать. Все 16 ячеек. Палочки так и оставались. И скорее всего
Цитата:
А индикатор печатает 0x00 как палочки.
так и выходит.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 11:09:32 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
vitalik_1984 писал(а):
И если это он, то получается, что такой функцией уже нельзя будет вывести пользовательский символ с адресом 0.Так выходит?
Можно. Как адрес 8.
У HD44780 пользовательсике символы в адресах 0..7 продублированы в 8..15, т.е. любой символ по адресу A Є {0..7} можно выводить по адресу A+8 и наоборот. Я только адресами 8..15 всегда и пользовался.

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 11:39:14 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
vitalik_1984 писал(а):
Лучше уж тогда использовать
Код:
Lcd_send_buffer(unsigned char * buffs){
    while (*buffs[i]){
        Lcd_send_char(*buffs[i++]);
    }
}
 
Оставить что-то одно. Или индексацию
Код:
Lcd_send_buffer(unsigned char * buffs){
    unsigned char i = 0;
    while (buffs[i]) Lcd_send_char(buffs[i++]);
}
 
или разименование
Код:
Lcd_send_buffer(unsigned char * buffs){
    while (*buffs) Lcd_send_char(*buffs++);
}
 

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 18:42:29 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12
Рейтинг сообщений: 67
Зарегистрирован: Пт авг 27, 2010 05:57:06
Сообщений: 2482
Откуда: Тюмень
Рейтинг сообщения: 0
Во, во точно так и нужно.Забыл как правильно.Хотя второй вариант мне кажется проще и по написанию и лишние переменные не нужно объявлять.Компилятор сам где нужно создаст.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 20:04:18 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 65
Зарегистрирован: Пн янв 10, 2011 03:06:36
Сообщений: 736
Откуда: Ростов-на-Дону
Рейтинг сообщения: 0
rs39 писал(а):
Еще вначале эксперимента инициализировал буфер заправляя нулями специально, перед тем как использовать. Все 16 ячеек. Палочки так и оставались.
Может, имеет смысл прописать его пробелами вместо нулей?

_________________
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 20:44:25 
Открыл глаза
Аватар пользователя

Зарегистрирован: Сб май 07, 2011 14:35:24
Сообщений: 53
Откуда: Россия
Рейтинг сообщения: 0
Можно конечно, но с условием что буфер в программе будет использоваться всего один раз.
А иначе перед функцией sprintf это нужно будет делать каждый раз. Для этого удобнее всего написать отдельную функцию, в ней с помощью цикла заполнять буфер пробелами. Но стоит ли оно того.. Вроде как получается лишняя трата времени на заполнение неиспользуемых оставшихся ячеек, если строка в данный момент значительно короче.


Последний раз редактировалось rs39 Сб сен 22, 2012 20:51:28, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 20:48:20 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12
Рейтинг сообщений: 67
Зарегистрирован: Пт авг 27, 2010 05:57:06
Сообщений: 2482
Откуда: Тюмень
Рейтинг сообщения: 0
Цитата:
Может, имеет смысл прописать его пробелами вместо нулей?

Да с нулями нормально, только не выводить что попало, если только не нужно затирать предыдущее изображение.

Я еще не добрался до своего дисплея, но собираюсь именно затирать вместо очистки дисплея.
То есть хранить полный массив дисплея в буфере Мк.Пока вот не знаю чем это грозит.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 20:57:47 
Открыл глаза
Аватар пользователя

Зарегистрирован: Сб май 07, 2011 14:35:24
Сообщений: 53
Откуда: Россия
Рейтинг сообщения: 0
vitalik_1984 писал(а):
Цитата:

Я еще не добрался до своего дисплея, но собираюсь именно затирать вместо очистки дисплея.

Уточните пожалуйста, в каком смысле "затирать"? Просто писать данные в LCD поверх, либо все-же подавать на него какие то команды перед записью? У меня сейчас отладочная под рукой, могу попробовать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 21:14:22 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12
Рейтинг сообщений: 67
Зарегистрирован: Пт авг 27, 2010 05:57:06
Сообщений: 2482
Откуда: Тюмень
Рейтинг сообщения: 0
Ну то есть на первую позицию и поехали выводить всю длину строки.
И так с каждой строкой.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 21:32:28 
Открыл глаза
Аватар пользователя

Зарегистрирован: Сб май 07, 2011 14:35:24
Сообщений: 53
Откуда: Россия
Рейтинг сообщения: 0
Ок ясно.
Сейчас попробовал сделать. Из минусов пока ничего не заметил. А вот плюсы визуально есть. Не стало мерцания LCD, которое вероятнее всего происходило в момент LCD_Clear.
Массив конечно приходится "чистить" (заполнять нулями, пробелами) всегда перред sprintf.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 22:43:22 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12
Рейтинг сообщений: 67
Зарегистрирован: Пт авг 27, 2010 05:57:06
Сообщений: 2482
Откуда: Тюмень
Рейтинг сообщения: 0
Я где то читал, что с помощью этой функции делать строку определенной длины с заполнением любыми символами.Только вот уже не помню как точно это все выглядит и где посмотреть можно.
Кстати не нужно даже делать лишних движений сама функция sprintf в некоторых интерпретациях считает сколько в ней символов.И оставшееся можно дополнять пробелами.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 22:53:54 
Открыл глаза
Аватар пользователя

Зарегистрирован: Сб май 07, 2011 14:35:24
Сообщений: 53
Откуда: Россия
Рейтинг сообщения: 0
Наткнулся на грабли. Сначала не придал значения, думал может в функции очистки буфера ошибся когда писал:
Код:
//Функция очистки буфера
void clear_buff(unsigned char *buff)
{
unsigned char i=0;
while(i<16)
   {
    buff[i]=' ';
   i++;
   }
}

но оказалось все правильно.
Дело в том что sprintf в конце строки как правило ставит \0 - так вот этот ноль зараза все-равно отображается в конце строки на LCD, и догадайтесь с первого раза ввиде чего? Да, именно в виде 2-х вертикальных палочек :))

Изображение

Да, забыл добавить комментарий к картинке.
Нижнюю строку "Влажность" не берем в расче, т.к. это просто статичная переменная в прогмем, для наглядности.
А вот верхняя с температурой - она и есть, формируемая sprintf


Вложения:
lcd2.jpg [14.83 KiB]
Скачиваний: 949


Последний раз редактировалось rs39 Сб сен 22, 2012 23:24:18, всего редактировалось 1 раз.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Сб сен 22, 2012 23:21:02 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12
Рейтинг сообщений: 67
Зарегистрирован: Пт авг 27, 2010 05:57:06
Сообщений: 2482
Откуда: Тюмень
Рейтинг сообщения: 0
Уж проще запихать в эту ячейку пустой символ.Может более опытные мастера подскажут что как можно сделать?

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вс сен 23, 2012 09:50:11 
Встал на лапы
Аватар пользователя

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт фев 21, 2012 20:42:26
Сообщений: 135
Откуда: Санкт-Петербург, Россия, Земля
Рейтинг сообщения: 0
На мой взгляд, проще всего не выводить каждый раз весь буфер, а делать печать только того, что действительно изменилось. При выводе чисел проблема неполного стирания предыдущего значения решается легко - нужно указать функции sprintf минимальную ширину числа. Тогда, если число занимает меньше символов, функция добавляет пробелов.
В одном заброшенном проекте я делал функцию, которая выводила информацию на экран от мобильника. В одном из параметров функции передавались битовые флаги, указывающие какой именно участок надо перерисовать. Это экономило кучу времени, да и мелькания не было.

_________________
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вс сен 23, 2012 21:55:19 
Открыл глаза
Аватар пользователя

Зарегистрирован: Сб май 07, 2011 14:35:24
Сообщений: 53
Откуда: Россия
Рейтинг сообщения: 0
U235 писал(а):
При выводе чисел проблема неполного стирания предыдущего значения решается легко - нужно указать функции sprintf минимальную ширину числа. Тогда, если число занимает меньше символов, функция добавляет пробелов.

Да, пожалуй самый оптимальный вариант.
Следуя ему поступил следующим образом:
Зная сколько символов будет занято строкой, с учетом ширины числа (от 0 до 999 к примеру) задал в sprintf %3d, получилось 3, без учета символа завершения строки.
Все ранее навешанные функции strlen, заполнения буфера - убрал. Буфер так-же инициализировал в 3 ячейки супротив 16.
Функция очистки LCD тоже не нужна, т.к. длинна строки определена заранее(%3d).
Итог - код без лишних наворотов, мерцания дисплея нет, результат отображения без мусора.

Рабочий образец кода:
Код:
        unsigned char buffer[3];
        ...
        val = 999;
        sprintf(buffer,"%3d",val); // Заполняем буфер результатом, символ окончания строки невсчет
        LCDGotoXY(0, 0);
        LCDstring(buffer,3);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вс сен 23, 2012 22:34:26 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
rs39 писал(а):
Рабочий образец кода:
Плохо.
Код:
        unsigned char buffer[3];   // <---- Буфер на три символа
        ...
        sprintf(buffer,"%3d",val);  // <---- пишется три симола и завершающий 0 за ними, итого 4 !
Будет переполнение буфера, а там уж как [не]повезёт.

Я делаю без промежуточных буферов. avr-gcc (WinAVR) позволяет так:
Код:
#include <stdio.h>
#include <avr/pgmspace.h> // Размещать форматные строки в ОЗУ жаба давит

#include "lcd.h"  // отсюда lcd_putchar да lcd_goxy

// Переходник от "файлового" putc к LCD-шному putchar
int lcd_file_putc(char ch, FILE * stream)
{
    (void) stream;
    lcd_putchar(ch);
    return 0;
}

// Инициализация файлового объекта LCD
FILE lcd_file = FDEV_SETUP_STREAM(lcd_file_putc, 0, _FDEV_SETUP_WRITE);

// Для удобства
#define flcd (&lcd_file)     
Где-то в lcd.h определены строки с кодами символов в пользовательском знакогенераторе, как-то так:
Код:
// Символ градусов цельсия ° занесён в знакогенератор по адресу 0, он же 8
#define LCD_CELSIUS_STR "\x08"     
Теперь можно так -- никаких промежуточных строк и завершающих нулей, пойдёт посимвольно прямо на индикатор.
Код:
    lcd_goxy(1,3);
    fprintf_P( flcd, PSTR("t=%3d" LCD_CELSIUS_STR "C"), temperature); 
Или вообще к первому фрагменту кода добавляем
Код:
#include <stdrag.h> 

void lcd_printf_P(uint8_t x, uint8_t y, const prog_char * fmt, ...)
{
    lcd_goxy(x,y);
    va_list va;
    va_start(va, fmt);
    vfprintf_P(flcd, fmt, va);
    va_end(va);
}
 
И пишем одной строкой переход к координатам и вывод:
Код:
    lcd_printf_P(1, 3, PSTR("t=%3d" LCD_CELSIUS_STR "C"), temperature); 

Примечание:
В языке C запись "t=%3d" LCD_CELSIUS_STR "C" даёт склеивание фрагментов строк в одну строку "t=%3d\x08C", но не нужно помнить, какой символ на каком номере и не будет проблем, если после \x08 идут опять цифры, в виде подстрок они точно не приклеятся к \x08

По поводу размера кода можно не беспокоиться, так как в библиотеке avr-libc функция sprintf сама сделана через порождение файлового объекта с флагами вывода в массив символов и с полнім набором va_start/vfprintf/va_end:
Код:
int sprintf(char *s, const char *fmt, ...)
{
    va_list ap;
    FILE f;
    int i;

    f.flags = __SWR | __SSTR;
    f.buf = s;
    f.size = INT_MAX;
    va_start(ap, fmt);
    i = vfprintf(&f, fmt, ap);
    va_end(ap);
    s[f.len] = 0;

    return i;
}
 

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2195 ]     ... , , , 63, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y