Да я так и подумал. В этом случае проверку на наличие TAP файлов было бы логично сделать, перед тем как отображать основное меню. И еще один момент. Если вставить SD карту большого объема, то инициализация занимает некоторое время при этом на индикаторе ничего не отображается и может сложиться впечатление что с магнитофоном что-то не то. Поэтому имело бы смысл перед всякими инициализациями вывести на индикатор сообщение.
//---------- //основная функция программы //---------- int main(void) { InitAVR(); DRAM_Init(); WH1602_Init(); WH1602_SetTextProgmemUpLine(Text_Main_Init); WH1602_SetTextProgmemDownLine(Text_Main_Wait); SD_Init(); FAT_Init();
// Проверить на наличие TAP файлов if (FAT_BeginFileSearch()==false) { WH1602_SetTextProgmemUpLine(Text_Tape_Menu_No_Image); WH1602_SetTextDownLine(""); _delay_ms(2000); while(1);//нет ни одного TAP файла }
В этом случае проверку на наличие TAP файлов было бы логично сделать, перед тем как отображать основное меню.
Для этого придётся сперва обегать все каталоги. А файлов (каталог тоже ведь файл) может быть десятки тысяч. Вам не понравится ждать реакции в этом случае.
Логично, что это делается в обратном порядке по отношению к выдаче. Считаете такты между перепадами уровней входного сигнала и сравниваете с некоторым окном допуска для пилот-тона, синхросигнала, единицы и нуля. Сперва ждёте длительный пилот-тон. Потом синхросигнал, если пилот-тон был достаточной длины. А потом переходите к приёму данных и до окончания сигнала (пауза превысила допуск). То, что набрали - сохраняете в файл. Всё.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Там даже ЦАП не нужен, если брать сигнал со спектрума - достаточно цифрового порта с возможностью входа в 5 В (ну или делитель, или диоды чтобы понизить до 3 В). А считать просто - заводите таймер и смотрите, сколько отсчётов между перепадами сигнала. Сравниваете с таблицей для сигналов и делаете вывод о том, какой сигнал принимаете сейчас. Таблицу же строите исходя из длительности сигналов в тактах Z80. Частота же спектрума 3.5 МГц.
void TIM6_DAC_IRQHandler(void) { /* USER CODE BEGIN TIM6_DAC_IRQn 0 */
/* USER CODE END TIM6_DAC_IRQn 0 */ HAL_TIM_IRQHandler(&htim6); /* USER CODE BEGIN TIM6_DAC_IRQn 1 */ static uint16_t tim6_countersec=3293; //счетчик секунд static uint32_t tim6_counterbit=0; //счетчик загрузки bit /********************определяем пилот-тон***********************************************************/ if (TapeInMode>=TAPE_IN_STOP){ //tim6_counterbit=0; //счетчик загрузки bit return;}
if (TapeInMode==TAPE_IN_LEAD){ TIM6->ARR = 2168*2;//начальное значение таймера if (tim6_countersec > 0) { tim6_countersec--; if (HAL_GPIO_ReadPin(T_IN_GPIO_Port, T_IN_Pin) == GPIO_PIN_SET){ tim6_counterbit++; }; }
else{ #if Debug_TIM SEGGER_RTT_printf(0,"\nTAPE_IN_LEAD END tim6_counterbit=%u\n", tim6_counterbit); #endif tim6_countersec = 3223;//Время воспроизведения пилот тона 2 сек. tim6_counterbit=0; //счетчик загрузки bit TapeInMode=TAPE_IN_STOP; return;}}
/* USER CODE END TIM6_DAC_IRQn 1 */ }
Добавлено after 3 minutes 53 seconds: Попробовал сделать в обработчике прерываний для TIM6 подсчет импульсов пилот-тона. Получается в условии 2 сек крутится проверка на установку PIN_SET в единицу и счетчик. Протестировал получается 1614..1610 когда как. Я так понимаю это 3223/2 в точности должно быть 1646
Как выявить синхро сигналы?
P.S. Так как пока нет обвязки для входного сигнала со звуковой карты я запустил PWM (800Гц %50) от логического анализатора. Хочу продолжить тестирование подав сигнал от ПК через звуковую карту (ПК будет воспроизводить waw с записью выгрузки, я перекомпилировал tap --> waw, нет железа под рукой (zx-spectrum, все в эмуляции ))
void EXTI15_10_IRQHandler(void) { /* USER CODE BEGIN EXTI15_10_IRQn 0 */
/* USER CODE END EXTI15_10_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
/* USER CODE BEGIN EXTI15_10_IRQn 1 */ /********************переменные*********************************************************************/ static uint16_t exti15_countersec=3293; //счетчик секунд static uint32_t exti15_counterbit=0; //счетчик загрузки bit
/********************определяем пилот-тон***********************************************************/ if (TapeInMode==TAPE_IN_LEAD){ TIM6->ARR = 2168*2;//начальное значение таймера if (HAL_GPIO_ReadPin(T_IN_GPIO_Port, T_IN_Pin) == GPIO_PIN_SET) exti15_counterbit++; if (exti15_countersec > 0) exti15_countersec--; else{ #if Debug_TIM SEGGER_RTT_printf(0,"\nTAPE_IN_LEAD exti15_counterbit=%u\n", exti15_counterbit); #endif TapeInMode = TAPE_IN_STOP; exti15_counterbit = 0; exti15_countersec = 3223;//Время воспроизведения пилот тона 2 сек. return;} } /* USER CODE END EXTI15_10_IRQn 1 */ }
Добавлено after 49 minutes 40 seconds: Вот пробую через прерывание по входу. Пока тестовый сигнал 800гц подаю работает. Думаю таймер тут совсем не нужен. На входе идёт сигнал с установленной частотой. Так же нет смысла его ожидать во времени. У меня тут условия что идёт декримент числа и должно две секунды пройти. Думаю убрать это. Пусть идёт счёт пока есть на входе сигнал. Теперь момент, я ещё не решил как синхроимпульс определю. По хорошему я считаю некую последовательность на частоте 800гц и легко могу пропустить синхронизацию посчитав её за пилот. Ведь как только у меня нет ни чего на входе то прерывание завершается.
Заметил такие детали. Регистр ARR установлен 2168*2 как по даташиту что бы 807 Гц пилот формировал. В сообщении: #if Debug_TIM SEGGER_RTT_printf(0,"\n counterbit %u\n", counterbit); #endif Получается все правильно 4336 Если на вход будет подана частота пилота 800 то мы получил 74 Если 810 то 4303 Вопрос, какое лучше число использовать в регистре.
/********************читаем синхросигнал 2******************************************************/ if (TapeInMode==TAPE_IN_SYNCHRO_2){
TIM6->ARR = syn2_ARR;//начальное значение таймера 4761Гц //EXTI->FTSR |= 0x15;
if (TapeIn==true){ TIM6->CNT = 0; //начальное значение для отсчета HAL_TIM_Base_Start (&htim6); HAL_TIM_Base_Start_IT (&htim6); //включить таймер TapeIn=false; //переключатель на выкл. таймера //EXTI->PR |= (0x15); //Очищаем флаг и останавливаем прерывание
return; } else { HAL_TIM_Base_Stop (&htim6); HAL_TIM_Base_Stop_IT (&htim6); //выключить таймер counterbit = __HAL_TIM_GET_COUNTER(&htim6); //взять значение отсчета таймера TapeInMode = TAPE_IN_STOP; //стоп прием EXTI->PR |= (0x15); //Очищаем флаг и останавливаем прерывание EXTI->RTSR |= 0x15; //по нарастающему фронту
В общем попробовал дальше продолжить написание обработчика. Вход 807Гц держит, определяет. С этим все понятно. Теперь нужно синхроимпульсы отработать. Первый по высокому фронту, а второй по низкому. Пока не получилось, может, что пропустил ?
Обновление версии ПО. Теперь поддерживаются SDHC-карты.
Все забываю сказать Практически сразу как вышла эта версия прошивки, я ее попробовал и столкнулся с глюком, который легко воспроизводится. На карте создаем папку, в которую кладем файл. Вставляем карту в магнитофон, заходим в папку, выбираем файл и его загружаем. Выходим в корень папки и видим на экране абракадабру. Нажимая кнопки вниз/вверх видим еще десятка два какой-то абракадабры опознанных как папка, т.е. появляется десятка два каких-то папок.
Жаль. Значит, придётся разбираться. Но вроде бы я там ничего такого не менял, кроме способа адресации... И ещё вопросы: 1) А старые версии (без SDHC) таким не страдали? 2) Какой объём карты? 3) На картах меньшего объёма глюк тоже есть? 4) Может быть, карте не хватает питания и она просто "теряется" со временем?
Использую версию 2.00 и такого не замечал (правда, пользуюсь не активно, ибо в основном использую эмулятор дисковода). Во всех последующих версиях что-то да глючило. В том числе и в версии о которой был разговор начиная с сообщения Ср мар 01, 2017 08:20:11 и далее, у меня этот глюк с абракадаброй в имени одного файла так и остался. Так что я остановился на версии 2.00.
2) Какой объём карты? 3) На картах меньшего объёма глюк тоже есть?
Карта объемом 1Гб, отформатирована стандартным образом. Карты бОльшего объема не использовал, ибо весь этот гимор с подготовкой карты считаю ненужным, т.е. овчинка выделки не стоит.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения