Обсуждаем цифровые устройства...
Ответить

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 13:31:29

Совпадает ли инициализация с примером?


Диаграмму инициализации для различных типов карт я где-то приводил в этой теме. Там несколько посложнее, чем в статье. Разные типы инициализируются по-разному и определение их типов тоже отдельное веселье. Но карта у вас инициализирована, иначе не выдала бы размер.

Вот она:

Изображение

Я не вижу где CRC 0х95?


Его там нет. Поскольку я решил реализовать всё честно, то CRC считается автоматически.

И всегда одинаковый при любых экспериментах. 29 МБ


Это и есть её истинный размер.

eb 0 ef


То есть, сектор считался верно первый раз, но слетел на втором чтении. Интересно.

А впишите-ка вот такое в fat.c:

uint32_t GetByte(uint32_t offset)
{
offset+=FATOffset;
uint32_t s=offset>>8UL;//делим на 256
if (s!=LastReadSector)
{
LastReadSector=s;
bool first=true;
if ((offset&0x1ffUL)>=256) first=false;
if (SD_ReadBlock(s>>1UL,Sector,first)==false)
{
sprintf(String,"E:%lu O:%lu",offset,s>>1UL);
WH1602_SetTextDownLine(String);
_delay_ms(5000);
WH1602_SetTextDownLine("");
}

//ошибки не проверяем, всё равно ничего сделать не сможем - либо работает, либо нет
}
return(Sector[offset&0xFFUL]);
}

Посмотрим, нет ли моментов, где ошибка чтения.

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 14:08:23

Ну что ж!... Это победа! :beer:
Я не знаю, что эта проверка делает, но карта 32 МБ заработала без проблем.
Эта прошивка с буфером 256 байт и программным SPI? Попробуем вернуть на аппаратный SPI и буфер 512?

А заодно скрыть бы эту папку Systev Volume…? Глаза мозолит

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 14:52:07

Я не знаю, что эта проверка делает, но карта 32 МБ заработала без проблем.


Это, вообще говоря, скверно. Потому что эта проверка ничего не даёт в плане чтения карты. Как я понимаю, сообщений об ошибках чтения не было? :?

Попробуем вернуть на аппаратный SPI и буфер 512?


Буфер 512 лучше не возвращать. :) Я решил штатную сделать на 256, чтобы наверняка памяти хватало. На скорость-то это почти не влияет. А аппаратный SPI можно вернуть, да.

Я подозреваю, что карта не готова так быстро принимать команды.

Вот версия с задержкой, аппаратным SPI и 256-байтным буфером.
Попробуйте её (переделав под себя).

Firmware.zip
(142.52 KiB) Скачиваний: 207

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 15:34:13

da-nie писал(а):Как я понимаю, сообщений об ошибках чтения не было?

Не было :))
da-nie писал(а):Вот версия с задержкой, аппаратным SPI и 256-байтным буфером.

Меня тут нервный тик накрыл :)) :)) :)) . Все сломалось, шеф!

Короче отписываюсь по результатам.
Вначале думал скорость SPI большая. Снизил до clk/128. Не помогло.
Посмотрел fat.c, забыли задержку поставить. Прописал вначале 10 мкс. Не работает. 50 мкс, 100 мкс, 1 мс! Не работает!
Вернул Ваш код
Код:
uint32_t GetByte(uint32_t offset)
{
offset+=FATOffset;
uint32_t s=offset>>8UL;//делим на 256
if (s!=LastReadSector)
{
LastReadSector=s;
bool first=true;
if ((offset&0x1ffUL)>=256) first=false;
if (SD_ReadBlock(s>>1UL,Sector,first)==false)
{
sprintf(String,"E:%lu O:%lu",offset,s>>1UL);
WH1602_SetTextDownLine(String);
_delay_ms(5000);
WH1602_SetTextDownLine("");
}
//ошибки не проверяем, всё равно ничего сделать не сможем - либо работает, либо нет
}
return(Sector[offset&0xFFUL]);
}

Не работает! При этом вывел индикатор Е:510 0:0
Пригляделся, а эта проверка заменяет прежнюю строчку
Код:
SD_ReadBlock(s>>1UL,Sector,first);

которая раньше у меня была не затерта. Я по невнимательности пропустил, что в Вашем коде ее уже нет.
Вернул ее после этого условия. Заработало!
Вернул SPI на clk/2 - работает :kill:

В итоге, сейчас вот такой костыль и он работает. Почему - думать Вам
Код:
uint32_t GetByte(uint32_t offset)
{
 offset+=FATOffset;
 uint32_t s=offset>>8UL;//делим на 256
 if (s!=LastReadSector)
 {
  LastReadSector=s;
  bool first=true;
  if ((offset&0x1ffUL)>=256) first=false; 

  /* ТУТ КОСТЫЛЬ */
  SD_ReadBlock(s>>1UL,Sector,first);
  SD_ReadBlock(s>>1UL,Sector,first);  // и повторяем
 
  //ошибки не проверяем, всё равно ничего сделать не сможем - либо работает, либо нет
 }
 return(Sector[offset&0xFFUL]);
}

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 16:07:54

Посмотрел fat.c, забыли задержку поставить


Нет, я её перенёс в sd.c.
Судя по всему, ошибка при чтении имеет место быть.

В итоге, сейчас вот такой костыль и он работает. Почему - думать Вам


Давайте попробуем увеличить задержку. В sd.c есть функция SD_SendCommand. Там в самом начале стоит _delay_us(10). Попробуйте заменить на _delay_ms(10); (обращаю внимание - на 10 мс! Не мкс!).

Если не поможет, давайте вместо задержки поставим SD_TransmitData(0xff); Может быть, даже несколько таких SD_TransmitData(0xff); И посмотрим, как себя поведёт карта.

Если же и это не поможет, тогда в SD_ReadBlock попробуйте выяснить, какой из return(false) срабатывает (можно рядом с каждым вывести на экран сообщение и узнать, какой срабатывает).

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 16:19:07

da-nie писал(а):Попробуйте заменить на _delay_ms(10); (обращаю внимание - на 10 мс! Не мкс!).

Так не заработало...
da-nie писал(а):Если не поможет, давайте вместо задержки поставим SD_TransmitData(0xff);

А так все работает без проблем. Вставил только одну строчку. _delay_us(10); закомментировал

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 16:31:42

А так все работает без проблем.


Отлично! Значит, надо просто перед посылкой команды послать 0xff. Все карты заработали и корректно работают?
Сейчас скоро сделаю новую прошивку и обновлю репозиторий. :)

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 16:36:03

da-nie писал(а):Все карты заработали и корректно работают?

Остальные и до этого работали нормально. Вот 32 МБ артачилась...
Сейчас тестирую вместе со Спектрумом на загрузку. 2-3 файла загружу и проверю в работе
da-nie писал(а):Сейчас скоро сделаю новую прошивку и обновлю репозиторий.

Там будут отличия от той прошивки, что я тестирую?

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 16:36:57

Там будут отличия от той прошивки, что я тестирую?


Думаю, нет. Но мало ли. :)

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 17:13:46

Думаю, нет. Но мало ли. :)

Ну только если уберете скрытые и системные папки :)

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 19:12:35

Хорошо, вот финальный релиз. Скрытые и системные файлы и папки не показывает.
Репозиторий на github обновлён.

Firmware.zip
(264.53 KiB) Скачиваний: 252

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 20:14:21

Отлично, работает!
А можно сделать так, чтобы после выбора файла, после нажатия кнопки CENTER, можно было выбирать загружаемые блоки? Сейчас блоки перебираются только после начала воспроизведения. При этом уже идет воспроизведение файла. Мне пока не на чем попробовать такую подгрузку файлов, но что-то мне подсказывает, что если на ходу переключать блоки, то Спектруму башку снесет.
А так выбранный файл как бы встанет на паузу, а после выбора нужного блока начнется нормальное его воспроизведение.

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 20:24:44

А можно сделать так, чтобы после выбора файла, после нажатия кнопки CENTER, можно было выбирать загружаемые блоки?


Да сделать-то можно, только там уже все 16 кб почти под завязку. И CENTER там была выбор файла и выход из воспроизведения файла.

но что-то мне подсказывает, что если на ходу переключать блоки, то Спектруму башку снесет.


Там достаточно длинный пилот-тон, так что вы всяко успеете переключить на нужный блок при воспроизведении. На время пилот-тона спектруму наплевать, что там что-то меняется. А вообще, я не припомню, чтобы часто надо было переключать блоки вообще.

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 21:01:59

da-nie писал(а):И CENTER там была выбор файла и выход из воспроизведения файла.

CENTER у меня только как ПАУЗА работает при воспроизведении файла. Остановка воспроизведения SELECT.
da-nie писал(а):там уже все 16 кб почти под завязку.

Если поставить оптимизацию -s, то у меня 86,7% получается. Так что место есть
da-nie писал(а):А вообще, я не припомню, чтобы часто надо было переключать блоки вообще.

Я сейчас не припомню, в каких играх это надо, надо кума спросить. Но ему с подгрузкой уже попадались.
Я спек недавно собрал, считайте на этих карантинах.... Ностальгирую :)

Добавлено after 17 minutes 4 seconds:
Посмотрел в исходниках. По идее в void TapeMenu(void); Кнопка CENTER должна выполнять какую-то функцию. Но у меня по факту не реагирует. Работает только как ПАУЗА при воспроизведении. Сейчас только что проверил.
Если подразумевалось, что она должна выбрасывать в корневой каталог, то, предлагаю, освободить ее от этой задачи и в void TapeMenu(void); сделать перебор блоков внутри файла.

Re: Эмулятор магнитофона для ZX-Spectrum

Вс май 03, 2020 22:27:33

У этого эмулятора 4 кнопки: UP, DOWN, CENTER, SELECT. У них есть сочетания.
В меню магнитофона: при нажатой CENTER и UP/DOWN - прокрутка файлов по 10 вверх или вниз.
Во время воспроизведения файла: CENTER - пауза при воспроизведении блоков, UP/DOWN - смена блока, SELECT - выход в меню магнитофона.


Попробуйте пока поэксплуатировать в том виде перемотку, как сейчас, а там уже по результатам посмотрим, нужна ли перемотка при паузе.

Re: Эмулятор магнитофона для ZX-Spectrum

Ср май 06, 2020 16:50:48

А подскажите,почему листать файл и блок в разные стороны?В чём удобство?

Re: Эмулятор магнитофона для ZX-Spectrum

Ср май 06, 2020 17:08:47

Что вы имеете в виду? :dont_know: Листать файл и блок в разные стороны? :roll:

Re: Эмулятор магнитофона для ZX-Spectrum

Ср май 06, 2020 17:13:51

Если как у меня влево нарастание файла, той же кнопкой убывание блока.Я как то переназначал, но забыл где.Перемотка файла и блока в разные стороны.Хочется переназначить кнопки перемотки в файле блока, а то не удобно .

Re: Эмулятор магнитофона для ZX-Spectrum

Ср май 06, 2020 19:33:50

Это потому, что у меня эти кнопки не лево-право, а вверх (вперёд) и вниз (назад). Тогда всё получается логично - для файлов вверх-вниз, для блоков вперёд-назад.
Поменять можно в te.c:

В void OutputImage(void)
Код:
 if (BUTTON_UP_PIN&(1<<BUTTON_UP))
     {
      _delay_ms(200);
      new_block=block+1;
      break;
     }
     if (BUTTON_DOWN_PIN&(1<<BUTTON_DOWN))
     {
      _delay_ms(200);
      if (block>0) new_block=block-1;
      break;
}
Последний раз редактировалось da-nie Чт май 07, 2020 08:54:00, всего редактировалось 1 раз.

Re: Эмулятор магнитофона для ZX-Spectrum

Чт май 07, 2020 07:28:34

Спасибо!Поменял местами кнопки,увеличил задержки для китайца,перевёл на английский.Может кому понадобится.
Вложения
Firmwareпосл eng.rar
(220 KiB) Скачиваний: 256
Ответить