Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12864
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
На плате на выходе mcp602t стоят конденсаторы перед атмегой, какого они номинала?
Не волшебник. просто учусь.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
Смотрите на схему, а не на плату. На плате это просто невостребованный задел под разные эксперименты.
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
Понял, значит ничего не ставлю.
Не волшебник. просто учусь.
-
mixa232323
- Прорезались зубы
- Сообщения: 217
- Зарегистрирован: Вт окт 01, 2013 01:04:31
- Откуда: Гомель
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
Файлик от LS020 поправил.
А зачем там так часто сигнал CS дергать?
А зачем там так часто сигнал CS дергать?
- Вложения
-
- ls020.c
- (7.42 КБ) 219 скачиваний
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
Где часто?
Мне кажется, Ваше изменение сильно замедлит работу с дисплеем из-за постоянных установок/сбросов RS, и переноса цикла while() в конец ls020WriteData(). В своё время я, переделывал что-то в стиле "наоборот": https://github.com/WiseLord/ampcontrol/commit/dc886eb
Но у меня ls020 никогда не было, поэтому насчёт того как оно на реальном железе работает, я не в курсе. Просто знаю, что работает.
Мне кажется, Ваше изменение сильно замедлит работу с дисплеем из-за постоянных установок/сбросов RS, и переноса цикла while() в конец ls020WriteData(). В своё время я, переделывал что-то в стиле "наоборот": https://github.com/WiseLord/ampcontrol/commit/dc886eb
Но у меня ls020 никогда не было, поэтому насчёт того как оно на реальном железе работает, я не в курсе. Просто знаю, что работает.
-
mixa232323
- Прорезались зубы
- Сообщения: 217
- Зарегистрирован: Вт окт 01, 2013 01:04:31
- Откуда: Гомель
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
ну да с RS я поспешил но с остальным вроде правильно
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
По поводукоторый Вы переделали наВот здесь-то и будет самое большое замедление. В изначальном варианте мы сразу же выскакиваем из функции (что тоже занимает какое-то время) и обрабатываем код дальше. А в это время параллельно и аппаратно идёт передача по 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, как и положено. Не знаю, почему Вам показалось, что часто.
-
mixa232323
- Прорезались зубы
- Сообщения: 217
- Зарегистрирован: Вт окт 01, 2013 01:04:31
- Откуда: Гомель
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
переписал под LPH9157-2 запустился но не правильно. Любые манипуляции с поворотом не дают нужного эффекта. Скрин прилагаю
- Вложения
-
- 1.rar
- (35.28 КБ) 221 скачивание
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
Я бы попробовал поиграть с заменой x и y местами в ls020SetWindow()
-
mixa232323
- Прорезались зубы
- Сообщения: 217
- Зарегистрирован: Вт окт 01, 2013 01:04:31
- Откуда: Гомель
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
поиграл не выиграл.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
А что произойдёт, если поменятьнаОбратите внимание, 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);-
mixa232323
- Прорезались зубы
- Сообщения: 217
- Зарегистрирован: Вт окт 01, 2013 01:04:31
- Откуда: Гомель
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
опечатку заметил когда проверял монитором 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);- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
Это потому что символы отрисовываюься в другом направлении. Тут надо или этот параметр обхода окна менять при инициализации, или в другом порядке биты символа выводить
-
mixa232323
- Прорезались зубы
- Сообщения: 217
- Зарегистрирован: Вт окт 01, 2013 01:04:31
- Откуда: Гомель
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
[uquote="WiseLord",url="/forum/viewtopic.php?p=3190228#p3190228"]Это потому что символы отрисовываюься в другом направлении. Тут надо или этот параметр обхода окна менять при инициализации, или в другом порядке биты символа выводить[/uquote]
в этом файле?
в этом файле?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
Да. Либо инициализацию попробовать подправить: - поиграться с 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);
}
}
}
}
}Верхний цикл - проход по высоте шрифта. В нашем случае три раза - k = 0, 1, 2.
Дальше, вложенный шрифт - проходим по ширине символа, и вычитываем в массив pgmData текущую "линию"
А уже затем - пробегаемся по битам (i = 0..7) шрифта и выводим либо цветом шрифта (1), либо цветом фона (0). При этом, если фонт масштабированный, то делается это два раза подряд.
В Вашем случае надо просто разобраться с направлением вывода. Можно просто вставить задержку здесь и смотреть на дисплей. Должны поочерёдно выводиться вертикальные столбики шрифта снизу вверх (а если мысленно дисплей повернуть на 90 градусов по часовой стрелке, к его "родному" портретному режиму, получится просто последовательный вывод горизонтальных строк - ровно как и мы пишем в тетради).
-
mixa232323
- Прорезались зубы
- Сообщения: 217
- Зарегистрирован: Вт окт 01, 2013 01:04:31
- Откуда: Гомель
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
в вашем варианте заполнение с право налево вверх
а в моем сверху в низ направо
а в моем сверху в низ направо
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
Вот как происходит отрисовка символа на 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) {
Вообще идеально - проверить с разными вариантами Memory Access Control.
А если ещё и на видео снимете, как это происходит с разными его вариантами, тогда будет понятнее, что и как менять.
И ещё: проблема только в шрифтах? Вся прочая графика отрисовывается нормально или не очень? Подозреваю, что прогрессбары должны быть ОК, столбики всякие тоже, потому что это просто сплошной заливки прямоугольники, а вот иконки тоже должны отрисовываться аналогично шрифтам.
-
mixa232323
- Прорезались зубы
- Сообщения: 217
- Зарегистрирован: Вт окт 01, 2013 01:04:31
- Откуда: Гомель
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
в дисплее косяк он с изначальным кодом рисует правильно но не дорисовывает в конце 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
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
Тогда нужно для начала, путём манипуляций с шириной-высотой-x-y добиться того, чтобы
- дисплей умел закрашивался целиком;
- сплошные прямоугольники рисовались там где нужно.
А уже потом разбираться "внутри" прямоугольников, в каком порядке в них подавать биты шрифта или иконки.
- дисплей умел закрашивался целиком;
- сплошные прямоугольники рисовались там где нужно.
А уже потом разбираться "внутри" прямоугольников, в каком порядке в них подавать биты шрифта или иконки.
-
mixa232323
- Прорезались зубы
- Сообщения: 217
- Зарегистрирован: Вт окт 01, 2013 01:04:31
- Откуда: Гомель
Re: Темброблок/спектроанализатор на ATmega16, TDA7439 и SG12
в моем последнем варианте всё закрашивается норм надо чтобы шрифты заполнялись по принципу иконок или переделать шрифты.