Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12864
- Сообщения: 13
- Зарегистрирован: Чт июн 29, 2017 20:46:43
На плате на выходе mcp602t стоят конденсаторы перед атмегой, какого они номинала?
Не волшебник. просто учусь.
- Реклама
Смотрите на схему, а не на плату. На плате это просто невостребованный задел под разные эксперименты.
- Сообщения: 13
- Зарегистрирован: Чт июн 29, 2017 20:46:43
Понял, значит ничего не ставлю.
Не волшебник. просто учусь.
Файлик от LS020 поправил.
А зачем там так часто сигнал CS дергать?
А зачем там так часто сигнал CS дергать?
- Вложения
-
- ls020.c
- (7.42 КБ) 219 скачиваний
Где часто?
Мне кажется, Ваше изменение сильно замедлит работу с дисплеем из-за постоянных установок/сбросов RS, и переноса цикла while() в конец ls020WriteData(). В своё время я, переделывал что-то в стиле "наоборот": https://github.com/WiseLord/ampcontrol/commit/dc886eb
Но у меня ls020 никогда не было, поэтому насчёт того как оно на реальном железе работает, я не в курсе. Просто знаю, что работает.
Мне кажется, Ваше изменение сильно замедлит работу с дисплеем из-за постоянных установок/сбросов RS, и переноса цикла while() в конец ls020WriteData(). В своё время я, переделывал что-то в стиле "наоборот": https://github.com/WiseLord/ampcontrol/commit/dc886eb
Но у меня ls020 никогда не было, поэтому насчёт того как оно на реальном железе работает, я не в курсе. Просто знаю, что работает.
- Реклама
ну да с RS я поспешил но с остальным вроде правильно
По поводукоторый Вы переделали наВот здесь-то и будет самое большое замедление. В изначальном варианте мы сразу же выскакиваем из функции (что тоже занимает какое-то время) и обрабатываем код дальше. А в это время параллельно и аппаратно идёт передача по SPI.
А в Вашем варианте Вы зачем-то перед выходом из функции ждёте окончания передачи. Это сильно уменьшает скорость вывода, поскольку именно запись данных тут основная операция.
Единственное в моём случае - когда передаётся "пачка" данных (заполняется какой-то прямоугольник, например), то в конце нужно ещё один раз сделать while(!(SPSR & (1<<SPIF))); перед дёрганьем CS.
А CS у меня дёргается редко - перед отправкой большой пачки данных уходит в 0, по окончании - в 1, как и положено. Не знаю, почему Вам показалось, что часто.
Код: Выделить всё
static void ls020WriteData(uint8_t data) {
while(!(SPSR & (1<<SPIF)));
SPDR = data;
}Код: Выделить всё
static void ls020WriteData(uint8_t data) {
SPDR = data;
while(!(SPSR & (1<<SPIF)));
}А в Вашем варианте Вы зачем-то перед выходом из функции ждёте окончания передачи. Это сильно уменьшает скорость вывода, поскольку именно запись данных тут основная операция.
Единственное в моём случае - когда передаётся "пачка" данных (заполняется какой-то прямоугольник, например), то в конце нужно ещё один раз сделать while(!(SPSR & (1<<SPIF))); перед дёрганьем CS.
А CS у меня дёргается редко - перед отправкой большой пачки данных уходит в 0, по окончании - в 1, как и положено. Не знаю, почему Вам показалось, что часто.
переписал под LPH9157-2 запустился но не правильно. Любые манипуляции с поворотом не дают нужного эффекта. Скрин прилагаю
- Вложения
-
- 1.rar
- (35.28 КБ) 224 скачивания
Я бы попробовал поиграть с заменой x и y местами в ls020SetWindow()
А что произойдёт, если поменятьнаОбратите внимание, LS020_HEIGHT, похоже, опечатка (у меня в коде в том числе)
Теоретически, это как-то должно развернуть на 90 градусов. Символы шрифта будут при этом рисоваться неправильно, и тут уже можно поиграть параметрами направления отрисовки окна при инициализации дисплея:
Код: Выделить всё
#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Теоретически, это как-то должно развернуть на 90 градусов. Символы шрифта будут при этом рисоваться неправильно, и тут уже можно поиграть параметрами направления отрисовки окна при инициализации дисплея:
Код: Выделить всё
ls020WriteCommand(0x36);
ls020WriteData(0xe0);опечатку заметил когда проверял монитором SPI
Добавлено after 45 minutes 17 seconds:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12864
правильнее так но вместо символов краказябры
Добавлено 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);Это потому что символы отрисовываюься в другом направлении. Тут надо или этот параметр обхода окна менять при инициализации, или в другом порядке биты символа выводить
[uquote="WiseLord",url="/forum/viewtopic.php?p=3190228#p3190228"]Это потому что символы отрисовываюься в другом направлении. Тут надо или этот параметр обхода окна менять при инициализации, или в другом порядке биты символа выводить[/uquote]
в этом файле?
в этом файле?
Да. Либо инициализацию попробовать подправить: - поиграться с 0xE0 согласно тому, что там у Вас в комментариях для этой команды прописано.
Это самый простой вариант, если получится - повезло.
Либо с выводом символа ls020WriteChar() поиграть. Тут уже посложнее, придётся немного подумать и, во первых, понять, как вывод символа происходит.
Вот сам символ, например, 'A':Легко понять, как он построен. Это массив из 10 * 3 (ширина на высоту) байтов:

Теперь смотрим, в коде как реализован вывод символа после того, как сформировано "окно" (для наглядности убрал дефайн LS020_ROTATE_180:
Верхний цикл - проход по высоте шрифта. В нашем случае три раза - k = 0, 1, 2.
Дальше, вложенный шрифт - проходим по ширине символа, и вычитываем в массив pgmData текущую "линию"
А уже затем - пробегаемся по битам (i = 0..7) шрифта и выводим либо цветом шрифта (1), либо цветом фона (0). При этом, если фонт масштабированный, то делается это два раза подряд.
В Вашем случае надо просто разобраться с направлением вывода. Можно просто вставить задержку здесь и смотреть на дисплей. Должны поочерёдно выводиться вертикальные столбики шрифта снизу вверх (а если мысленно дисплей повернуть на 90 градусов по часовой стрелке, к его "родному" портретному режиму, получится просто последовательный вывод горизонтальных строк - ровно как и мы пишем в тетради).
Код: Выделить всё
ls020WriteCommand(0x36);
ls020WriteData(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 */
Теперь смотрим, в коде как реализован вывод символа после того, как сформировано "окно" (для наглядности убрал дефайн 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);
}
}
}
}
}Дальше, вложенный шрифт - проходим по ширине символа, и вычитываем в массив pgmData текущую "линию"
А уже затем - пробегаемся по битам (i = 0..7) шрифта и выводим либо цветом шрифта (1), либо цветом фона (0). При этом, если фонт масштабированный, то делается это два раза подряд.
В Вашем случае надо просто разобраться с направлением вывода. Можно просто вставить задержку здесь и смотреть на дисплей. Должны поочерёдно выводиться вертикальные столбики шрифта снизу вверх (а если мысленно дисплей повернуть на 90 градусов по часовой стрелке, к его "родному" портретному режиму, получится просто последовательный вывод горизонтальных строк - ровно как и мы пишем в тетради).
в вашем варианте заполнение с право налево вверх
а в моем сверху в низ направо
а в моем сверху в низ направо
Вот как происходит отрисовка символа на LS020 (эмуляция в Proteus):
Наложите на свои исходники такой же патч, чтобы посмотреть, в каком месте рисуется символ и в каком направлении идёт его отрисовка в Вашем случае.
Вообще идеально - проверить с разными вариантами Memory Access Control.
А если ещё и на видео снимете, как это происходит с разными его вариантами, тогда будет понятнее, что и как менять.
И ещё: проблема только в шрифтах? Вся прочая графика отрисовывается нормально или не очень? Подозреваю, что прогрессбары должны быть ОК, столбики всякие тоже, потому что это просто сплошной заливки прямоугольники, а вот иконки тоже должны отрисовываться аналогично шрифтам.
Наложите на свои исходники такой же патч, чтобы посмотреть, в каком месте рисуется символ и в каком направлении идёт его отрисовка в Вашем случае.
Спойлер
Код: Выделить всё
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) {
А если ещё и на видео снимете, как это происходит с разными его вариантами, тогда будет понятнее, что и как менять.
И ещё: проблема только в шрифтах? Вся прочая графика отрисовывается нормально или не очень? Подозреваю, что прогрессбары должны быть ОК, столбики всякие тоже, потому что это просто сплошной заливки прямоугольники, а вот иконки тоже должны отрисовываться аналогично шрифтам.
в дисплее косяк он с изначальным кодом рисует правильно но не дорисовывает в конце 4 часть экрана.
там просто обрезок с мусором
иконки отображаются правильно
Добавлено after 9 hours 28 minutes 37 seconds:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12864
а вот тут упоминание сего косяка http://cxem.net/mc/mc221.php
там просто обрезок с мусором
иконки отображаются правильно
Добавлено after 9 hours 28 minutes 37 seconds:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12864
а вот тут упоминание сего косяка http://cxem.net/mc/mc221.php
Тогда нужно для начала, путём манипуляций с шириной-высотой-x-y добиться того, чтобы
- дисплей умел закрашивался целиком;
- сплошные прямоугольники рисовались там где нужно.
А уже потом разбираться "внутри" прямоугольников, в каком порядке в них подавать биты шрифта или иконки.
- дисплей умел закрашивался целиком;
- сплошные прямоугольники рисовались там где нужно.
А уже потом разбираться "внутри" прямоугольников, в каком порядке в них подавать биты шрифта или иконки.
в моем последнем варианте всё закрашивается норм надо чтобы шрифты заполнялись по принципу иконок или переделать шрифты.


