Например TDA7294

Форум РадиоКот :: Просмотр темы - ATmega8+1602(CVAVR)-некорректное отображение первой строки
Форум РадиоКот
https://radiokot.ru/forum/

ATmega8+1602(CVAVR)-некорректное отображение первой строки
https://radiokot.ru/forum/viewtopic.php?f=57&t=143691
Страница 1 из 1

Автор:  _abk_ [ Вт мар 28, 2017 12:16:32 ]
Заголовок сообщения:  ATmega8+1602(CVAVR)-некорректное отображение первой строки

В недоумении.
Простой проектик (CVAVR 3/12): значение АЦП отображается в первой строке (16 знакомест).
По этой величине вычисляется другая и отображается во второй строке (16 знакомест).
Зацикливаемся. При изменении напряжения на входе АЦП - на LCD меняются показания ТОЛЬКО во второй строке!
Значение в первой строке стоит, как вкопанное. Если сделать сброс, оно обновится.
Работает так, как в Протеусе, так и в железе. Сто раз лепил такое не задумываясь, - и никаких проблем...
Насоветуйте, может, чего...
Под спойлером фрагмент кода, во вложении - проект CVAVR и Протеус

Спойлер...
#include <alcd.h>

// Declare your global variables here
unsigned int v_in, dlit, dlit_max = 1000;
char string_out[16];

...


while (1)
{
//lcd_clear(); // без этого сброса отображение работает некорректно!
v_in=get_adc();

// вывести напряжение в 1 строке
lcd_gotoxy(0,0);
sprintf(string_out," input: %1u.%02u V ", v_in/100, (v_in-(v_in/100)*100));
lcd_puts(string_out);

// вычислить dlit по входному напряжению
dlit = (unsigned long int)dlit_max*v_in/500;

// вывести длительность во 2 строке
lcd_gotoxy(0,1);
sprintf(string_out," impuls: %4u us", dlit);
lcd_puts(string_out);

// выдать импульс на выход
out_impuls(dlit);

// разрядить емкость
RES_OUT = 1;
delay_us(10);
RES_OUT = 0;

delay_us(200);

}


Вложения:
Комментарий к файлу: проекты CVAVR и Протеус
CVAVR & Proteus.zip [136.58 KiB]
Скачиваний: 158

Автор:  Hardegen [ Вт мар 28, 2017 12:45:03 ]
Заголовок сообщения:  Re: ATmega8+1602(CVAVR)-некорректное отображение первой стро

А с другим дисплеем то же самое? Бывает китайские идут с глюками

Автор:  pyzhman [ Вт мар 28, 2017 13:06:49 ]
Заголовок сообщения:  Re: ATmega8+1602(CVAVR)-некорректное отображение первой стро

...

Автор:  _abk_ [ Ср мар 29, 2017 02:53:30 ]
Заголовок сообщения:  Re: ATmega8+1602(CVAVR)-некорректное отображение первой стро

Hardegen писал(а):
А с другим дисплеем то же самое?...

Дык в Протеусе так же криво отображается.
Так что вряд ли в дисплее дело. Ну попробовать-то можно.
Может, с настройками проекта в CVAVR что-то не так?
А то код я всяко уже вертел и - сплошной неадекват.
Например, если выводить одну строку дважды по gotoxy(0,0) - она и во второй строке отобразится!
И обе будут правильно ослеживать - показывать!
Я и в string_out[32] обе объединял с одним выводом, - тоже криво, первая строка так же "замерзает" - не меняется.
Весна, что ли действует? :(

Автор:  Rtmip [ Ср мар 29, 2017 07:03:44 ]
Заголовок сообщения:  Re: ATmega8+1602(CVAVR)-некорректное отображение первой стро

_abk_ писал(а):
Весна, что ли действует? :(
Несомненно! Но и задумываться надо хоть раз из ста :))
Ошибка здесь:
Код:
char string_out[16]
"просто добавь воды" и магия случится:
Код:
char string_out[17]
Это хорошо, что Вы весь проект показали! :idea:

Автор:  ARV [ Ср мар 29, 2017 07:51:56 ]
Заголовок сообщения:  Re: ATmega8+1602(CVAVR)-некорректное отображение первой стро

Rtmip писал(а):
char string_out[16]
сам с подозрением на эту строчку смотрел, но в моей практике подобные ошибки приводили не к "замерзанию" строки, а к выводу странного мусора на ЖКИ... потому и смолчал.
а проект целиком смотреть не стал, ибо CVAVR не уважаю...

Автор:  _abk_ [ Ср мар 29, 2017 08:07:09 ]
Заголовок сообщения:  Re: ATmega8+1602(CVAVR)-некорректное отображение первой стро

Rtmip писал(а):
... Но и задумываться надо хоть раз из ста :)) ...
Дык чо думать, - трясти же надо! :))
Rtmip писал(а):
... и магия случится...

Спасибо Вам большое! Ну и раскройте уж секрет фокуса, а?
:beer:

Автор:  ARV [ Ср мар 29, 2017 08:18:39 ]
Заголовок сообщения:  Re: ATmega8+1602(CVAVR)-некорректное отображение первой стро

_abk_ писал(а):
Ну и раскройте уж секрет фокуса, а?
можно я, можно я?!

массив-строку вы сделали из 16 позиций, как размер дисплея, так? а терминирующий ноль, обязательный для строк, куда писать? вот и начинаются чудеса на виражах...

Автор:  _abk_ [ Ср мар 29, 2017 08:30:10 ]
Заголовок сообщения:  Re: ATmega8+1602(CVAVR)-некорректное отображение первой стро

ARV писал(а):
...можно я, можно я?!...

Можно! :)))
Ну тады и Вам большое спасибо!
Что-то это знание меня стороной обошло. Как только не наступил ни разу на эти грабли прежде, - вот где магия!
Пойду-ка покопаюсь в старых проектах, прям любопытно очень...
Спасибо всем, кто читал и думал!

Автор:  ARV [ Ср мар 29, 2017 08:49:00 ]
Заголовок сообщения:  Re: ATmega8+1602(CVAVR)-некорректное отображение первой стро

У вас в sprintf используется формат с "фиксированным" числом разрядов и, как я понял, вы пробелами догоняете длину формата до 16 позиций. Но не забывайте, что sprintf плюет на ограничение числа разрядов, если выводимое число не умещается в заданное количество позиций! Если у вас перед точкой должно выводиться числ 10, оно и займет 2 позиции, хотя в формате выделена одна... и в этом случае итоговая длина строки будет не 16, а 17 позиций, что уже не поместится в буфер. а еще и нолик в конце...

со строками в Си надо очень осторожным быть...

Автор:  _abk_ [ Ср мар 29, 2017 10:02:52 ]
Заголовок сообщения:  Re: ATmega8+1602(CVAVR)-некорректное отображение первой стро

ARV писал(а):
...пробелами догоняете длину формата до 16 позиций. Но не забывайте, что sprintf плюет на ограничение числа разрядов, если ...

Спасибо, это я помню. Заполняю 16 позиций здесь, чтобы, не очищая весь LCD, стереть предыдущий текст. По размерности здесь все прогнозируемо, пример очень простой.
Оттого траблы совсем не ожидались. А нужен был источник условно одиночного импульса регулируемой длительности для тестирования другой схемы, что успешно проделал и с "кривой" индикацией. Собственно, 2-я строка и нужна была только. Индикацию делал для наглядности, так-то она нафиг не нужна.
Нашел в литературе про 0х00 - необходимый символ конца строки. Не попадал на это до сих пор, так как обычно использовал строковые переменные большей, чем 16 длины для использования их в программе в разных целях, вот и хватало всегда для LCD.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/