Страница 36 из 240
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Пн фев 02, 2015 20:46:59
Sergey212
smit69 писал(а):Офигеть, из Китая за 12 дней дисплюй на ST7920 приехал!

Я его если честно раньше конца февраля и не ждал!!!
Приветствую! А не подскажете более подробно как выписать из Китая дисплей. Я ссылку видел, но много непоняток. Вы какой заказали? Можно в личку
sergeyn22@gmail.com
Заранее благодарю
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Вт фев 03, 2015 22:22:59
Sergey212
Подскажите для кнопок S1-S5 подтягивающие резисторы нужны?
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Ср фев 04, 2015 01:12:15
WiseLord
Не обязательно. Используются встроенные в МК подтягивающие к питанию 50 кОм резисторы. Если поставить, хуже не будет.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Пт фев 06, 2015 20:20:27
cbam
Такой вопрос по обучению пульта. При обучении пульта на экране появляется код кнопки и он сохраняется, но усилитель не начинает реагировать на новую кнопку. В чем может быть проблема? И еще вылез такой баг: при быстром нажатии любой из кнопок примерно через 3 - 5 нажатий вместо кода кнопки считывается код 00. Это баг пульта или прошивки?
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Вт фев 10, 2015 21:29:42
Sergey212
Уважаемый WiseLord, подскажите пожалуйста вместо дисплея LS020 возможно применение типа LPH88? Пишут вроде аналог.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Вт фев 10, 2015 21:59:55
WiseLord
Думаю, нельзя. Не аналог.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 02:49:31
infinity19891
Доброго времени суток всем. Скажите автор, а реально ли реализовать вашу схему с прошивкой под дисплей от Нокиа или Сименса, ну или от китайца какого? Если да, можно краткий курс о том, что нужно добавить/изменить/удалить? Заранее благодарен
З.Ы. У меня ресивер Grundig hi-fi receiver 30, тюнер давно не работает, усилитель немного переделан/модернизирован, а на месте шкалы осталось пустое место. Хотелось бы собрать туда это устройство, с тюнером и с дисплеем по-больше. Правда, родной тембр блок прийдётся или отключить или не использовать цифровой...
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 13:31:25
WiseLord
Попытаюсь более-менее разъяснить, что к чему.
Изначально прошивка делалась на ATmega16 с 1кБ памяти. При этом поддерживались разные дисплеи - KS0108A/B (128x64), LS020 (176x132) и даже знакосинтезирующие. Естественно, что ввиду разного размера в пикселах любые экраны приходилось отрисовывать для каждого дисплея по-своему. Например, функция отображения информации от пульта (тестовый режим проверки пульта):
Спойлер
Код: Выделить всё
void showRC5Info(uint16_t rc5Buf)
{
#if defined(KS0108)
ks0108LoadFont(font_ks0066_ru_08, 1);
ks0108SetXY(0, 0);
ks0108WriteString((uint8_t*)"RC5:");
ks0108SetXY(5, 1);
ks0108WriteString((uint8_t*)"Raw = ");
ks0108WriteString(mkNumString(rc5Buf, 14, '0', 2));
ks0108SetXY(5, 2);
ks0108WriteString((uint8_t*)"Tog = ");
ks0108WriteString(mkNumString(((rc5Buf & 0x0800) > 0), 1, '0', 16));
ks0108SetXY(5, 3);
ks0108WriteString((uint8_t*)"Adr = ");
ks0108WriteString(mkNumString((rc5Buf & 0x07C0)>>6, 2, '0', 16));
ks0108SetXY(5, 4);
ks0108WriteString((uint8_t*)"Cmd = ");
ks0108WriteString(mkNumString(rc5Buf & 0x003F, 2, '0', 16));
ks0108SetXY(0, 6);
ks0108WriteString((uint8_t*)"Buttons:");
ks0108SetXY(5, 7);
ks0108WriteString(mkNumString(INPUT_PIN, 8, '0', 2));
#elif defined(KS0066) || defined(PCF8574)
ks0066SetXY(0, 0);
ks0066WriteString((uint8_t*)"R=");
ks0066WriteString(mkNumString(rc5Buf, 14, '0', 2));
ks0066SetXY(0, 1);
ks0066WriteString((uint8_t*)"TB=");
ks0066WriteString(mkNumString(((rc5Buf & 0x0800) > 0), 1, '0', 16));
ks0066WriteString((uint8_t*)",RC=");
ks0066WriteString(mkNumString((rc5Buf & 0x07C0)>>6, 2, '0', 16));
ks0066WriteString((uint8_t*)",CM=");
ks0066WriteString(mkNumString(rc5Buf & 0x003F, 2, '0', 16));
#elif defined(LS020)
ls020LoadFont(font_ks0066_ru_24, COLOR_CYAN, 1);
ls020SetXY(4, 0);
ls020WriteString(mkNumString(rc5Buf, 14, '0', 2));
ls020SetXY(5, 24);
ls020WriteString((uint8_t*)"Tog = ");
ls020WriteString(mkNumString(((rc5Buf & 0x0800) > 0), 1, '0', 16));
ls020SetXY(6, 48);
ls020WriteString((uint8_t*)"Adr = ");
ls020WriteString(mkNumString((rc5Buf & 0x07C0)>>6, 2, '0', 16));
ls020SetXY(4, 72);
ls020WriteString((uint8_t*)"Cmd = ");
ls020WriteString(mkNumString(rc5Buf & 0x003F, 2, '0', 16));
ls020SetXY(6, 104);
ls020WriteString((uint8_t*)"Btn = ");
ls020WriteString(mkNumString(INPUT_PIN, 8, '0', 2));
#elif defined(ST7920)
st7920LoadFont(font_ks0066_ru_08, 1);
st7920SetXY(0, 0);
st7920WriteString((uint8_t*)"RC5:");
st7920SetXY(5, 1);
st7920WriteString((uint8_t*)"Raw = ");
st7920WriteString(mkNumString(rc5Buf, 14, '0', 2));
st7920SetXY(5, 2);
st7920WriteString((uint8_t*)"Tog = ");
st7920WriteString(mkNumString(((rc5Buf & 0x0800) > 0), 1, '0', 16));
st7920SetXY(5, 3);
st7920WriteString((uint8_t*)"Adr = ");
st7920WriteString(mkNumString((rc5Buf & 0x07C0)>>6, 2, '0', 16));
st7920SetXY(5, 4);
st7920WriteString((uint8_t*)"Cmd = ");
st7920WriteString(mkNumString(rc5Buf & 0x003F, 2, '0', 16));
st7920SetXY(0, 6);
st7920WriteString((uint8_t*)"Buttons:");
st7920SetXY(5, 7);
st7920WriteString(mkNumString(INPUT_PIN, 8, '0', 2));
#endif
return;
}
И так, по большому счёту, написан
весь файл (и не только он) для вывода на экран. Сплошные #ifdef/#else и т.д. инструкции препроцессора. Это всё потому, что изначально планировался только один вариант железа, а уже потом пользователи стали просить добавить поддержку то того, то другого.
Это долго, сложно, громоздко. При добавлении новой функции, выводящей что-то на экран, приходилось реализовывать её для каждого дисплея по своему, учитывая его размеры и особенности работы.
После перехода проекта на ATmega32 решено было для ускорения вывода на экран использовать кадровый буфер и ограничиться размером экрана 128x64. Принцип простой - имеется массив 128x64 точек и мы рисуем картинку не в дисплей, а в этот массив. В частности, та же
функция для работы тестового режима начинает выглядеть уже так:
Спойлер
Код: Выделить всё
void showRC5Info(uint8_t **txtLabels)
{
uint16_t rc5Buf = getRC5Buf();
uint8_t btnBuf = getBtnBuf();
uint8_t encBuf = getEncBuf();
gdLoadFont(font_ks0066_ru_08, 1, FONT_DIR_0);
gdSetXY(0, 0);
writeStringEeprom(txtLabels[LABEL_IN_STATUS]);
gdSetXY(4, 9);
writeStringEeprom(txtLabels[LABEL_REMOTE]);
gdSetXY(45, 9);
gdWriteString(mkNumString(rc5Buf, 14, '0', 2));
gdSetXY(4, 18);
writeStringEeprom(txtLabels[LABEL_BUTTONS]);
gdSetXY(75, 18);
gdWriteString(mkNumString(btnBuf, 5, '0', 2));
gdSetXY(108, 18);
gdWriteString((uint8_t*)"/");
gdSetXY(117, 18);
gdWriteString(mkNumString(encBuf, 2, '0', 2));
gdSetXY(0, 30);
writeStringEeprom(txtLabels[LABEL_LEARN_MODE]);
gdSetXY(4, 39);
writeStringEeprom(txtLabels[LABEL_BUTTON]);
gdSetXY(48, 39);
writeStringEeprom(txtLabels[LABEL_RC5_STBY + rc5CmdInd]);
gdSetXY(8, 48);
writeStringEeprom(txtLabels[LABEL_ADDRESS]);
gdSetXY(64, 48);
rc5Addr = (rc5Buf & 0x07C0)>>6;
gdWriteString(mkNumString(rc5Addr, 2, '0', 16));
gdWriteString((uint8_t*)" => ");
gdWriteString(mkNumString(eeprom_read_byte(eepromRC5Addr), 2, '0', 16));
gdSetXY(8, 56);
writeStringEeprom(txtLabels[LABEL_COMMAND]);
gdSetXY(64, 56);
rc5Cmd = rc5Buf & 0x003F;
gdWriteString(mkNumString(rc5Cmd, 2, '0', 16));
gdWriteString((uint8_t*)" => ");
gdWriteString(mkNumString(eeprom_read_byte(eepromRC5Cmd + rc5CmdInd), 2, '0', 16));
return;
}
Гораздо короче, но, при этом, гораздо функциональнее.
Весь специфичный для дисплея код описан в соответствующих файлах -
ks0108.c и
st7920.c.
Всё, что нужно - это:
1. Реализовать кадровый буфер - массив fb[] - размером 1 кБайт (в случае ks0108 это массив 128x8, в случае st7920 это массив 32x32 - это с учётом организации пикселов в байты в этих дисплеях).
2. Написать функции для инициализации дисплея (init), очистки (clear) и для записи пиксела (drawPixel) в этот буфер.
3. За счёт таймера Timer0 организовать периодическую запись информации из буфера в дисплей.
Таймер настроен на вызов прерывания по переполнению 20000 в секунду (т.е., с периодом 50мкс). При каждом вызове он стартует АЦП, обеспечивая 10кГц анализ Фурье и пишет очередную пачку данных из кадрового буфера в дисплей. За 50 мкс дисплей вполне успевает обработать эту запись и быть готовым к следующей.
Итак, принцип такой:
а) любые функции пишут что-то в буфер (через функцию записи пиксела по нужным координатам), при этом не заморачиваясь по поводу экрана.
б) таймер, вызываясь 20000 раз в секунду, записывает очередной байт из буфера в экран. При размере буфера 1024 байта и небольших накладных расходах на позиционирование в начале строки весь экран обновляется около 18..19 раз в секунду.
Если нужно в эту систему добавить свой дисплей (свой файл myDisplay.c), нужно:
а) чтобы он имел те же размеры 128x64
б) завести 1кБ буфер для хранения картинки
в) написать обработчик прерывания таймера 0, записывающий очередной байт из буфера в дисплей и переходящий на следующий байт для будущей записи
В общем, архитектура проекта в плане работы с дисплеями, такова:
Код: Выделить всё
ks0108.h
/ ks0108.c
/
/
остальные ----- gdfb.c --- st7920.h
файлы gdfb.h st7920.c
проекта \
\
\ myDisplay.h
myDisplay.c
gdfb.c/gdfb.h - это своего рода абстрактный 128x64 дисплей, пробрасывающий графические функции дальше конкретному дисплею. И именно в него попиксельно рисуется картинка.
В принципе, подобным образом написаны и другие вещи (абстрактный тюнер + конкретные реализации, абстрактный аудиопроцессор + конкретные реализации), но там это не так сильно заметно, особенно по поводу аудиопроцессоров. Просто нет времени доделать это всё "красиво", да и, как говорится, работает - не трогай.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 16:35:01
infinity19891
Так, ну вроде со всем разобрался. Осталось дело за малым: Про фьюзы может кто-то подсказать на atmega32 и ls020?
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 16:50:47
WiseLord
В исходниках в
Makefile всё есть. Если настроить avrdude, то команда
make - соберёт прошивку
make flash - прошьёт
make eeprom_<lang> - зальёт eeprom с нужным языком
make fuse - зашьёт фьюзы
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 18:30:23
vasilijj
Уважаемый WiseLord, похоже я один кто повторил Ваш бюджетный вариант на ATmega 8. Все было прекрасно пока не собрал весь усилитель, не знаю, может так и задумано, но есть некоторые неудобства. В контролере управления, ATmega 8, все настройки (№ входа, настройки уровня громкости и тембров и т. д...), сохраняются. А вот аудиопроцессор, после отключения питания, возвращается в исходное состояние, то есть после включения приходится регулировать все по новому или же, не снимать питание с аудиопроцессора хотя бы в дежурном режиме. Можно ли сделать так что бы при включении ATmega отправляла в аудиопроцессор все сохраненные параметры, или может я что-то не так сделал. Заранее спасибо.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 18:41:01
infinity19891
WiseLord, понял, спасибо. Ещё такой интересный вопрос: SC7313S откопал на плате со старой магнитолы. По данным интернета - клон TDA7313. Но, если вдруг что-то не так будет, какие данные из даташита брать для написания под этот проц кода?
От этой же магнитолы есть тюнер на LA1787.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 19:01:18
WiseLord
Все параметры, в том числе и звуковые, сохраняются в EEPROM при выходе в ждущий режим. После этого питание с контроллера можно снимать.
При подаче питания на контроллер эти параметры снова вычитываются из EEPROM и по I²C-шине инициализируют аудиопроцессор.
Наблюдаемый Вами эффект не должен проявляться. Если, конечно, Вы при входе в ждущий режим по какой-то причине не обесточиваете аудиопроцессор. Естественно, потом, при подаче питания, он находится в некоем своём дефолтном состоянии.
На данный момент схема (не только ATmega8-вариант) рассчитана на то, что аудиопроцессор запитан постоянно, в том числе и в ждущем режиме.
Если у Вас схема сделана так, что в дежурном режиме питание аудиопроцессора пропадает, то такой эффект вполне может наблюдаться.
На всякий случай, последние на текущий момент прошивки для ATmega8.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 19:25:16
vasilijj
infinity19891 писал(а):Ещё такой интересный вопрос: SC7313S откопал на плате со старой магнитолы. По данным интернета - клон TDA7313.
В китайских магнитолах менял эту микросхему на TDA7313, все функции работали как и с родной.
WiseLord, питание с аудиопроцессора снимал специально выключением усилителя, переделать питание на аудиопроцессор, что-бы присутствовало постоянно не проблема.
При подаче питания на контроллер эти параметры снова вычитываются из EEPROM и по I²C-шине инициализируют аудиопроцессор.
А нельзя ли что-бы контролер инициализировал процессор и при выходе из дежурного режима.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 20:05:54
WiseLord
ОК, сделаю. Тем более, что так правильнее. Основную прошивку (для ATmega32) уже переделал - в ждущем режиме можно обесточивать тюнер, аудиопроцессор, в общем, всё, кроме контроллера. Сейчас доработаю и для других прошивок.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 20:20:52
vasilijj
Большое спасибо за понимание, буду ждать.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 21:33:32
infinity19891
А подскажет кто, как обучить прошивку принимать сигналы с другого пульта?
И можно ли файлики изготовить под микросхему тюнера TDA7540?
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 22:33:58
WiseLord
Обновление прошивок.
- Инициализация тюнера и аудиопроцессора не только на старте микроконтроллера, но и при выходе из ждущего режима. Теперь в ждущем режиме их можно обесточивать, уменьшая общее энергопотребление. Запитанным от дежурного источника должен оставаться только МК с часами.
- Косметические изменения в исходниках.
По поводу первого изменения - в железе проверено на основной прошивке с кадровым буфером (m32fb) и обычной (m32). В остальных правки аналогичные, поэтому должно работать и там.
infinity19891 писал(а):как обучить прошивку принимать сигналы с другого пульта?
Если прошивка с графическим дисплеем с кадровым буфером (m32fb, m64fb), доступен удобный режим обучения. В ждущем режиме одновременным нажатием кнопок 1 и 2 входим в этот режим. На экране отображается название функции. Жмём нужную кнопку на пульте, связывая её с этой функцией. Кнопкой 5 подтверждаем ввод и проделываем аналогично для других функций.
Если прошивка без кадрового буфера - аналогичным образом вызывается экран, на который выводятся hex-коды нажимаемых клавиш. Эти коды нужно hex-редактором внести в eeprom.bin файл, и зашить его.
Коды кнопок начинаются с адреса, определяемого макросом eepromRC5Cmd (см. eeprom.h), количество кодов и их порядок в eeprom определяются макросом RC5_CMD_COUNT и перечислением там же (см. input.h).
В любом случае, протокол пульта должен быть RC5. Другие протоколы не поддерживаются, по крайней мере, пока.
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Чт фев 12, 2015 23:08:14
FOLKSDOICH
А возможно ли сделать сохранение всех настроек при пропадании сети, например в 24C512?
Re: Темброблок/спектранализатор на ATmega16, TDA7439 и SG128
Добавлено: Пт фев 13, 2015 06:01:35
WiseLord
А зачем? Килобайта своего EEPROM достаточно, не так уж там их много, этих настроек.
Внешний EEPROm имел бы смысл для хранения, например, названий радиостанций.