ATmega8+1602(CVAVR)-некорректное отображение первой строки

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб мар 05, 2011 09:19:01

Сообщение _abk_ »

В недоумении.
Простой проектик (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 & Proteus.zip
проекты CVAVR и Протеус
(136.58 КБ) 165 скачиваний
Реклама
Родился
Сообщения: 16
Зарегистрирован: Вт мар 28, 2017 12:32:15

Сообщение Hardegen »

А с другим дисплеем то же самое? Бывает китайские идут с глюками
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

...
Docendo discimus
Контактная информация:
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб мар 05, 2011 09:19:01

Сообщение _abk_ »

Hardegen писал(а):А с другим дисплеем то же самое?...
Дык в Протеусе так же криво отображается.
Так что вряд ли в дисплее дело. Ну попробовать-то можно.
Может, с настройками проекта в CVAVR что-то не так?
А то код я всяко уже вертел и - сплошной неадекват.
Например, если выводить одну строку дважды по gotoxy(0,0) - она и во второй строке отобразится!
И обе будут правильно ослеживать - показывать!
Я и в string_out[32] обе объединял с одним выводом, - тоже криво, первая строка так же "замерзает" - не меняется.
Весна, что ли действует? :(
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Сообщение Rtmip »

_abk_ писал(а):Весна, что ли действует? :(
Несомненно! Но и задумываться надо хоть раз из ста :))
Ошибка здесь:

Код: Выделить всё

char string_out[16]
"просто добавь воды" и магия случится:

Код: Выделить всё

char string_out[17]
Это хорошо, что Вы весь проект показали! :idea:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб мар 05, 2011 09:19:01

Сообщение _abk_ »

Rtmip писал(а):... Но и задумываться надо хоть раз из ста :)) ...
Дык чо думать, - трясти же надо! :))
Rtmip писал(а):... и магия случится...
Спасибо Вам большое! Ну и раскройте уж секрет фокуса, а?
:beer:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб мар 05, 2011 09:19:01

Сообщение _abk_ »

ARV писал(а):...можно я, можно я?!...
Можно! :)))
Ну тады и Вам большое спасибо!
Что-то это знание меня стороной обошло. Как только не наступил ни разу на эти грабли прежде, - вот где магия!
Пойду-ка покопаюсь в старых проектах, прям любопытно очень...
Спасибо всем, кто читал и думал!
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб мар 05, 2011 09:19:01

Сообщение _abk_ »

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

Вернуться в «AVR»