Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12864

Вопросы и замечания по статьям и схемам, представленным на нашем сайте

При поддержке РадиоКОТструктор.ру


Ответить
Родился
Сообщения: 13
Зарегистрирован: Чт июн 29, 2017 20:46:43

Сообщение ansid1979 »

На плате на выходе mcp602t стоят конденсаторы перед атмегой, какого они номинала?
Не волшебник. просто учусь.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Смотрите на схему, а не на плату. На плате это просто невостребованный задел под разные эксперименты.
Контактная информация:
Реклама
Родился
Сообщения: 13
Зарегистрирован: Чт июн 29, 2017 20:46:43

Сообщение ansid1979 »

Понял, значит ничего не ставлю.
Не волшебник. просто учусь.
Прорезались зубы
Сообщения: 217
Зарегистрирован: Вт окт 01, 2013 01:04:31
Откуда: Гомель

Сообщение mixa232323 »

Файлик от LS020 поправил.
А зачем там так часто сигнал CS дергать?
Вложения
ls020.c
(7.42 КБ) 219 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Где часто?
Мне кажется, Ваше изменение сильно замедлит работу с дисплеем из-за постоянных установок/сбросов RS, и переноса цикла while() в конец ls020WriteData(). В своё время я, переделывал что-то в стиле "наоборот": https://github.com/WiseLord/ampcontrol/commit/dc886eb
Но у меня ls020 никогда не было, поэтому насчёт того как оно на реальном железе работает, я не в курсе. Просто знаю, что работает.
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 217
Зарегистрирован: Вт окт 01, 2013 01:04:31
Откуда: Гомель

Сообщение mixa232323 »

ну да с RS я поспешил но с остальным вроде правильно
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

По поводу

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

static void ls020WriteData(uint8_t data) {
	while(!(SPSR & (1<<SPIF)));
	SPDR = data;
}
который Вы переделали на

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

static void ls020WriteData(uint8_t data) {
	SPDR = data;
	while(!(SPSR & (1<<SPIF)));
}
Вот здесь-то и будет самое большое замедление. В изначальном варианте мы сразу же выскакиваем из функции (что тоже занимает какое-то время) и обрабатываем код дальше. А в это время параллельно и аппаратно идёт передача по SPI.

А в Вашем варианте Вы зачем-то перед выходом из функции ждёте окончания передачи. Это сильно уменьшает скорость вывода, поскольку именно запись данных тут основная операция.

Единственное в моём случае - когда передаётся "пачка" данных (заполняется какой-то прямоугольник, например), то в конце нужно ещё один раз сделать while(!(SPSR & (1<<SPIF))); перед дёрганьем CS.

А CS у меня дёргается редко - перед отправкой большой пачки данных уходит в 0, по окончании - в 1, как и положено. Не знаю, почему Вам показалось, что часто.
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Вт окт 01, 2013 01:04:31
Откуда: Гомель

Сообщение mixa232323 »

переписал под LPH9157-2 запустился но не правильно. Любые манипуляции с поворотом не дают нужного эффекта. Скрин прилагаю
Вложения
1.rar
(35.28 КБ) 224 скачивания
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Я бы попробовал поиграть с заменой x и y местами в ls020SetWindow()
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Вт окт 01, 2013 01:04:31
Откуда: Гомель

Сообщение mixa232323 »

поиграл не выиграл.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

А что произойдёт, если поменять

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

#ifdef LS020_ROTATE_180
    ls020WriteCommand(0x2a);
    ls020WriteData(x0);
    ls020WriteData(x1);
    ls020WriteCommand(0x2b);
    ls020WriteData(LS020_WIDTH - 1 - y1);
    ls020WriteData(LS020_HEIGHT - 1 - y0);
#else
на

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

#ifdef LS020_ROTATE_180
    ls020WriteCommand(0x2a);
    ls020WriteData(y0);
    ls020WriteData(y1);
    ls020WriteCommand(0x2b);
    ls020WriteData(LS020_WIDTH - 1 - x1);
    ls020WriteData(LS020_WIDTH - 1 - x0);
#else
Обратите внимание, LS020_HEIGHT, похоже, опечатка (у меня в коде в том числе)
Теоретически, это как-то должно развернуть на 90 градусов. Символы шрифта будут при этом рисоваться неправильно, и тут уже можно поиграть параметрами направления отрисовки окна при инициализации дисплея:

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

ls020WriteCommand(0x36);
ls020WriteData(0xe0);
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Вт окт 01, 2013 01:04:31
Откуда: Гомель

Сообщение mixa232323 »

опечатку заметил когда проверял монитором SPI

Добавлено after 45 minutes 17 seconds:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12864
правильнее так но вместо символов краказябры

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

#ifdef LS020_ROTATE_180
    ls020WriteCommand(0x2a);
    ls020WriteData(y0);
    ls020WriteData(y1);
    ls020WriteCommand(0x2b);
    ls020WriteData(LS020_HEIGHT - 1 - x1);
    ls020WriteData(LS020_HEIGHT - 1 - x0);
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Это потому что символы отрисовываюься в другом направлении. Тут надо или этот параметр обхода окна менять при инициализации, или в другом порядке биты символа выводить
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Вт окт 01, 2013 01:04:31
Откуда: Гомель

Сообщение mixa232323 »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3190228#p3190228"]Это потому что символы отрисовываюься в другом направлении. Тут надо или этот параметр обхода окна менять при инициализации, или в другом порядке биты символа выводить[/uquote]

в этом файле?
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Да. Либо инициализацию попробовать подправить:

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

ls020WriteCommand(0x36);
ls020WriteData(0xe0);
- поиграться с 0xE0 согласно тому, что там у Вас в комментариях для этой команды прописано.
Это самый простой вариант, если получится - повезло.
Либо с выводом символа ls020WriteChar() поиграть. Тут уже посложнее, придётся немного подумать и, во первых, понять, как вывод символа происходит.
Вот сам символ, например, 'A':

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

0xE0, 0xF0, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF8,
0xFF, 0xFF, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xFF, 0xFF,
0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 65  A */
Легко понять, как он построен. Это массив из 10 * 3 (ширина на высоту) байтов:
Изображение
Теперь смотрим, в коде как реализован вывод символа после того, как сформировано "окно" (для наглядности убрал дефайн LS020_ROTATE_180:

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

for (k = 0; k < fp[FONT_HEIGHT]; k++) {
    for (j = 0; j < swd; j++) {
        pgmData[j] = pgm_read_word(_font + oft + ((fp[FONT_HEIGHT] - k - 1)) * swd + j);
    }
    for(i = 0; i < 8; i++) {
        for (my = 0; my < fp[FONT_MULT]; my++) {
            for (j = 0; j < swd; j++) {
                if (pgmData[j] & (128>>i)) {
                    for (mx = 0; mx < fp[FONT_MULT]; mx++)
                        ls020WriteData(fp[FONT_COLOR]);
                } else {
                    for (mx = 0; mx < fp[FONT_MULT]; mx++)
                        ls020WriteData(COLOR_BCKG);
                }
            }
        }
    }
}
Верхний цикл - проход по высоте шрифта. В нашем случае три раза - k = 0, 1, 2.
Дальше, вложенный шрифт - проходим по ширине символа, и вычитываем в массив pgmData текущую "линию"
А уже затем - пробегаемся по битам (i = 0..7) шрифта и выводим либо цветом шрифта (1), либо цветом фона (0). При этом, если фонт масштабированный, то делается это два раза подряд.
В Вашем случае надо просто разобраться с направлением вывода. Можно просто вставить задержку здесь и смотреть на дисплей. Должны поочерёдно выводиться вертикальные столбики шрифта снизу вверх (а если мысленно дисплей повернуть на 90 градусов по часовой стрелке, к его "родному" портретному режиму, получится просто последовательный вывод горизонтальных строк - ровно как и мы пишем в тетради).
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Вт окт 01, 2013 01:04:31
Откуда: Гомель

Сообщение mixa232323 »

в вашем варианте заполнение с право налево вверх
а в моем сверху в низ направо
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Вот как происходит отрисовка символа на LS020 (эмуляция в Proteus):


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

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

diff --git a/display/ls020.c b/display/ls020.c
index ed0fed2..b2a249c 100644
--- a/display/ls020.c
+++ b/display/ls020.c
@@ -319,8 +319,9 @@ void ls020WriteChar(uint8_t code)
 							ls020WriteData(fp[FONT_COLOR]);
 					} else {
 						for (mx = 0; mx < fp[FONT_MULT]; mx++)
-							ls020WriteData(COLOR_BCKG);
+							ls020WriteData(COLOR_GRAY);
 					}
+					_delay_ms(50);
 				}
 			}
 		}
diff --git a/main.c b/main.c
index d27fb13..d720272 100644
--- a/main.c
+++ b/main.c
@@ -11,6 +11,7 @@
 #include "tuner/tuner.h"
 #include "temp.h"
 #include "actions.h"
+#include "display/ls020.h"
 
 static uint8_t extFunc;
 
@@ -56,6 +57,15 @@ int main(void)
 	// Init hardware
 	hwInit();
 
+
+	ls020LoadFont(font_ks0066_ru_24, COLOR_CYAN, 1);
+	while(1)
+	{
+		ls020SetXY(10, 30);
+		ls020WriteChar('A');
+		ls020Clear();
+	}
+
 	while (1) {
 		// Control temperature
 		if (extFunc == USE_DS18B20) {
Вообще идеально - проверить с разными вариантами Memory Access Control.
А если ещё и на видео снимете, как это происходит с разными его вариантами, тогда будет понятнее, что и как менять.

И ещё: проблема только в шрифтах? Вся прочая графика отрисовывается нормально или не очень? Подозреваю, что прогрессбары должны быть ОК, столбики всякие тоже, потому что это просто сплошной заливки прямоугольники, а вот иконки тоже должны отрисовываться аналогично шрифтам.
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Вт окт 01, 2013 01:04:31
Откуда: Гомель

Сообщение mixa232323 »

в дисплее косяк он с изначальным кодом рисует правильно но не дорисовывает в конце 4 часть экрана.
там просто обрезок с мусором
иконки отображаются правильно

Добавлено after 9 hours 28 minutes 37 seconds:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12864
а вот тут упоминание сего косяка http://cxem.net/mc/mc221.php
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Тогда нужно для начала, путём манипуляций с шириной-высотой-x-y добиться того, чтобы
- дисплей умел закрашивался целиком;
- сплошные прямоугольники рисовались там где нужно.
А уже потом разбираться "внутри" прямоугольников, в каком порядке в них подавать биты шрифта или иконки.
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Вт окт 01, 2013 01:04:31
Откуда: Гомель

Сообщение mixa232323 »

в моем последнем варианте всё закрашивается норм надо чтобы шрифты заполнялись по принципу иконок или переделать шрифты.
Ответить

Вернуться в «Статьи»