А подскажите,почему листать файл и блок в разные стороны?
Я тоже, поначалу, менял кнопки местами. Они у меня горизонтально в ряд расположены Собственно сейчас назначение кнопок как на картинке и совпадает с авторской прошивкой. Привык как-то... А поначалу пробовал и SELECT менять с крайнего левого положения на крайнее правое. И кнопки UP/DOWN местами. В последнем случае тоже приходилось дополнительно файл te.c править.
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Кстати! От подобного эмулятора есть еще одна приятная особенность. Дело в том, что в моей версии платы на входе стоит компаратор TL712. Вернее должен там стоять. Но он в наших краях жутко дефицитный, а с али никак не приедет (хотя по отзывам они там глючные, но я рискнул заказать). Чтобы был вход магнитофона я собрал схему на К561ЛН2. А сегодня, чего-то, подумалось, что на выходе эмулятора то TTL сигнал! В общем выкинул я К561ЛН2 совсем и поставил перемычку со входа TL712 на выход. Обвязка на входе собрана, там по сути делитель и конденсатор по постоянному току. В разъем магнитофона подоткнул эмулятор магнитофона и проверил на работоспособность. Все шикарно грузится
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Так в этом и дело. С настоящего магнитофона еще подбери уровень сигнала. Наша К561ЛН2 там еще и как усилитель работала, в отличии от оригинальных схем с компаратором на входе. А тут с эмулятором уже получается сигнал нужного уровня
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
С настоящего магнитофона еще подбери уровень сигнала.
Как не покажется странным, у спектрума к реальному магнитофону было важнейшее требование (при достаточном уровне сигнала, разумеется) - коэффициент детонации. Вот это параметр крайне критичен, ибо порождает сбой при частотной модуляции сигнала. Эмулятор же выдаёт чёткий и точный частотно-модулированный сигнал. Поэтому реальный исправный спектрум с него не загрузиться просто не может.
А вообще, мне тоже позавчера было нечем заняться, а "отпуск" плавно подходит к концу, поэтому из интереса (да и пригодится дочкам игры запускать) я решил попробовать загрузить имеющуюся у меня амигу 500 с stm32, а то мой ранее разработанный эмулятор дисковода требует большого времени на передачу данных в 2 МБ динамического ОЗУ. Взял я stm32f103c8t6 - всеми любимую китайскую плату. У него ОЗУ 20 кб, частота 72 МГц. Дорожка у амиги 12800 в MFM. Влезает в ОЗУ целиком. На atmega16 с внешним динамическим ОЗУ у меня когда-то не получилось быстро менять дорожки, но вдруг получится на stm32? Вместо своего модуля чтения FAT16 я взял уже освоенный fatfs. Для вывода дорожки задействовал SPI с DMA. Ну и кубик для разработки для ускорения процесса. Собрал всё это за день. Исправил ошибки платы и наброска программы вчера. А сегодня утром уже ух ты, Dizzy-6 загрузилась сходу! Пробуем Fast Food. Фигу. Вылетает частая ошибка чтения (такая беда для всех игр, показывающих синий экран DOS при загрузке). Боролся весь сегодняшний день, придумывая хитрые алгоритмы вычитывания блоков. Ускорил SPI у карты до нештатного значения (в 2 раза ускорил, поменяв делитель - до 36 МГц). Замерил время смены дорожки - 425 мс! Ого. Поменял карту памяти с 16 Мб ( ) на современную. Ого, 125 мс! А меньше, интересно, можно? А что там у меня в модуле SD.C, нет ли пауз? Точно, есть миллисекундные задержки. Выкидываем нафиг. Отлично! Всё грузится без ошибок. Осталось сделать работу с выбором файлов (сейчас я гружу прямо с заданным именем с карты) на валяющемся у меня китайском экранчике от Nokia 5110 (мда, хреновый экранчик, конечно) и можно выпускать в продакшн и делать статью для желающих. Никаких планок памяти, лишь два буфера К561ПУ4 (3.3->5 и 5<-3.3) или импортного аналога HEF4050 (которые у вас стоят), плата с микроконтроллером, экранчик, SD-карта и мелочевка вроде стабилизатора питания.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
da-nie, будет интересная версия. Ждем! Но нутром чую, что придется к этой версии Вам и добавлять чтение других файлов, кроме tap А дисплей 5110 действительно убогий. Во-первых, не регулируется контраст. Во-вторых, постоянный неконтакт с резинкой. И ничем не лечится. С модулем Nokia 1202 c али тоже беда с контрастностью. Вот и получается, что лепить либо TFT дисплей потом придется, либо недорогой IPS. OLED лучше вообще не рассматривать. За ту же цену IPS 1,6" смотрится выгодней. Благо контроллер позволяет такие дисплеи использовать
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Да я в курсе, что программно. Но у меня на эту команду не реагировал. Хотя могу и с 1202 путать. Это просто последний монохромник, который я пытался приручить.
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Покопался в памяти, да, скорее всего с 1202 перепутал. Дело в том, что был у меня дисплей такой из магазина Профи. Подключил к МК, вывел текст, а он серый и блёклый. Пробовал контрастность поменять, не реагирует. Купил на али такой же дисплей, но уже на плате в виде модуля. Тоже не реагирует на контрастность. Потом на работе у коллеги случайно увидел оригинальный дисплей, подключил и … небо и земля, короче. Очень контрастное отображение. А от 5110 у меня стоит в тестере LAN с vrtp. Так с ним я намучался. Несколько дисплеев поменял, у всех одна беда. После включения нет изображения. Для его появления передвключением надо сделать легкий массаж дисплею в районе резинки.
PS. https://aliexpress.ru/item/32969298268.html я вот про такой дисплей говорил. С STM32 стоит его использовать, на мой взгляд. По цене не дороже OLED, но не выгорает хотя бы.
PS2.
da-nie писал(а):
Взял я stm32f103c8t6 - всеми любимую китайскую плату.
Тут подумалось, что наверняка можно это все на модулях и собрать. Модуль с МК, модуль с картой микро SD и буфером 74LVC125 на борту. Дисплей, опять же, модулем... Получится конкурент TzxDuino Вот только не понял, зачем там два буфера К561ПУ4? Один, допустим, для карты. А второй? Да и вообще, STM32 от 3,3 В питается. Там по идее вообще не нужны ни буферы, ни стабилизаторы 5->3.3 V на платах модулей. Дисплей сразу 3,3 В требует
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
теперь исчезла. Видимо мучения, описанные на последних страницах этой темы не прошли даром и это радует
3. Вопрос. Пауза во время воспроизведения по кнопке CENTER, с какой целью сделана? Каково практическое применение этой фичи?
4. Вопрос по логике работы.
1. Вставляем, пустую карту, включаем эмулятор. 2. Видим сообщения о поддержке/не поддержке различных FAT. 3. Предлагается выбрать скорость эмулятора. 4. И вот тут-то мы увидим сообщение о том, что на карте нет TAP файлов.
По логике это сообщение должно быть между п.2 и п.3. Ну а по большому счету эта фича не имеет особого смысла, ибо если вставить карту хотя бы с одной пустой папкой, то сообщения о том, что на карте нет TAP файлов мы не получим и при этом на карте не будет ни одного TAP файла.
А тест такой нудный/долгий специально оставили или по ошибке?
Специально. Он нужен ровно один раз - сразу после сборки, а там лучше протестировать тщательнее. И больше он не нужен.
Цитата:
Ошибка, которая устойчиво воспроизводилась и о которой я сообщал вот здесь
Это очень хорошо.
Цитата:
Пауза во время воспроизведения по кнопке CENTER, с какой целью сделана? Каково практическое применение этой фичи?
Внутри блока? Это побочный эффект.
Цитата:
По логике это сообщение должно быть между п.2 и п.3.
Просто все предыдущие этапы однократные и их сделать проще до момента выяснения, что же там на карте есть.
Цитата:
то сообщения о том, что на карте нет TAP файлов мы не получим и при этом на карте не будет ни одного TAP файла.
Строго говоря, это сообщение правильнее было бы назвать как "На карте вообще нет файлов и папок". Но из последнего логично вытекает, что tap-файлов там тоже нет, поэтому я написал так. Но вы можете изменить надпись на любую другую.
Пауза во время воспроизведения по кнопке CENTER, с какой целью сделана? Каково практическое применение этой фичи?
Внутри блока? Это побочный эффект.
1. Тогда может быть избавится от этого побочного эффекта, а заодно отображать на дисплее изменение состояния эмулятора (Pause/Play)?
2. А заодно удалить кусок кода обрабатывающий нажатие кнопок UP, DOWN во время паузы между блоками? Кстати, какой функционал задумывался на эти нажатия кнопок?
Код:
//---------- // Запуск образа //---------- void OutputImage(void) { _delay_ms(500); // повторяем для каждого блока tap-файла uint16_t block=0; while(1) { if (FAT_WriteBlock(&BlockSize,block)==false) break; // блоки файла закончились
// выводим номер блока файла sprintf(String,"Block:%u [%u]",block+1,BlockSize); WH1602_SetTextUpLine(String);
// запускаем таймер и регенерируем память TCNT0=0; // начальное значение таймера LeadToneCounter=6000<<Speed; TapeOutMode=TAPE_OUT_LEAD; TapeOutVolume=false; DataCounter=0; uint16_t dl=0; sei(); while(1) { cli(); DRAM_Refresh();
if (TapeOutMode==TAPE_OUT_STOP) { sprintf(String,"Block:%u [0]",block+1); WH1602_SetTextUpLine(String); uint16_t new_block=block+1;
//формируем паузу int delay=200; if (BlockSize>0x13) delay=500; // файл передавался for(uint16_t n=0;n<delay;n++) { _delay_ms(10); if (BUTTON_SELECT_PIN&(1<<BUTTON_SELECT)) // SELECT - выход { TAPE_OUT_PORT&=0xff^(1<<TAPE_OUT); return; }
if (BUTTON_CENTER_PIN&(1<<BUTTON_CENTER)) // CENTER - пауза { _delay_ms(200); sprintf(String,"Block:%u [Pause]",block+1); // [PAUSE] WH1602_SetTextUpLine(String); while(1) { // нажатие на CENTER во время PAUSE - продолжить воспроизведение if (BUTTON_CENTER_PIN&(1<<BUTTON_CENTER)) { sprintf(String,"Block:%u [Play]",block+1); // [PLAY] WH1602_SetTextUpLine(String); break; } } _delay_ms(200); }
///////////////////////////////////////////////////////////////////////////////////// // зачем этот код, что делает эмулятор при нажатии UP, DOWN во время паузы? /*if (BUTTON_UP_PIN&(1<<BUTTON_UP)) // UP - на блок назад { _delay_ms(200); if (block>0) new_block=block-1; break; }
if (BUTTON_DOWN_PIN&(1<<BUTTON_DOWN)) // DOWN - на блок вперёд { _delay_ms(200); new_block=block+1; break; }*/ ///////////////////////////////////////////////////////////////////////////////////// } block=new_block; break; }
uint16_t dc=BlockSize-DataCounter; uint16_t tm=TapeOutMode; sei(); if (tm==TAPE_OUT_DATA) { if (dl==30000) { sprintf(String,"Block:%u [%u]",block+1,dc); WH1602_SetTextUpLine(String); dl=0; } else dl++; } _delay_us(10); if (BUTTON_SELECT_PIN&(1<<BUTTON_SELECT)) // SELECT - выход { cli(); TAPE_OUT_PORT&=0xff^(1<<TAPE_OUT); return; }
if (BUTTON_UP_PIN&(1<<BUTTON_UP)) // UP - на блок назад { _delay_ms(200); if (block>0) block--; break; } if (BUTTON_DOWN_PIN&(1<<BUTTON_DOWN)) // DOWN - на блок вперёд { _delay_ms(200); block++; break; } } cli(); } TAPE_OUT_PORT&=0xff^(1<<TAPE_OUT); }
1. Тогда может быть избавится от этого побочного эффекта, а заодно отображать на дисплее изменение состояния эмулятора (Pause/Play)?
А зачем? Этот эффект позволяет когда промотал не на тот уровень и увидел, что уровень отказался грузиться тут же остановить блок и промотать куда надо.
Цитата:
А заодно удалить кусок кода обрабатывающий нажатие кнопок UP, DOWN во время паузы между блоками? Кстати, какой функционал задумывался на эти нажатия кнопок?
А зачем? Этот эффект позволяет когда промотал не на тот уровень и увидел, что уровень отказался грузиться тут же остановить блок и промотать куда надо. ... Переход к нужным уровням.
Во время паузы эмулятор не реагирует ни на одну кнопку кроме CENTER (пауза), т.е. снять с паузы.
Во время паузы эмулятор не реагирует ни на одну кнопку кроме CENTER (пауза), т.е. снять с паузы.
Я уже не помню. Пауза там нужна была для того, чтобы приостановить воспроизведение в любой момент, как на магнитофоне. А работает ли при неё перемотка - не помню.
da-nie, нет, не работает. Во время паузы ни одна кнопка не работает (в том числе и SELECT) что, в общем-то, и следует из приведенного кода.
Ну и как было сказано выше - пауза бессмысленна во время воспроизведения. Таким образом, можно два куска кода заремарить в целях экономии памяти ATMEGA.
Легче перейти на atmega32 и не так дорого.Пауза нужна для остановки загрузки следующего блока.MSM514400D-60SJ работать не будет?Сигналы совпадают кроме A9.
Сейчас этот форум просматривают: JBJohny и гости: 36
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения