Форум РадиоКот 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); }
|
Автор: | 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] Это хорошо, что Вы весь проект показали! ![]() |
Автор: | 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 писал(а): ... и магия случится... Спасибо Вам большое! Ну и раскройте уж секрет фокуса, а? ![]() |
Автор: | 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/ |