У меня синхроимпульсы инверсные
Добавлено after 1 minute 18 seconds:
Код: Выделить всё
/**
* @brief This function handles TIM6 global interrupt, DAC1 and DAC2 underrun error interrupts.
*/
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 */
if (TapeOutMode==TAPE_OUT_STOP)
{
index16=16;//первоначальное значение бита
byte =0;//первоначальное значение байта
HAL_GPIO_WritePin(GPIOD, LD6_Pin, GPIO_PIN_RESET);//установка в ноль
//HAL_GPIO_TogglePin(GPIOD, LD6_Pin);
return;
}
if (TapeOutVolume==true)
{
HAL_GPIO_WritePin(GPIOD, LD6_Pin, GPIO_PIN_SET);
TapeOutVolume=false;
}
else
{
HAL_GPIO_WritePin(GPIOD, LD6_Pin, GPIO_PIN_RESET);
TapeOutVolume=true;
}
//выводим пилот-тон
if (TapeOutMode==TAPE_OUT_LEAD)
{
TIM6->PSC = 13011;//начальное значение таймера
if (tim6_countersec > 0) tim6_countersec--;
else
{
tim6_countersec = 3223;
TapeOutMode=TAPE_OUT_SYNCHRO_1;
return;
}
}
//выводим синхросигнал 1
if (TapeOutMode==TAPE_OUT_SYNCHRO_1)
{
TIM6->PSC =4700;//начальное значение таймера
TapeOutMode=TAPE_OUT_SYNCHRO_2;
return;
}
//выводим синхросигнал 2
if (TapeOutMode==TAPE_OUT_SYNCHRO_2)
{
TIM6->PSC = 4300;//начальное значение таймера
TapeOutMode=TAPE_OUT_DATA;
index16=16;
byte=0;
BytesCount=0;//обнуляем счетчик байт
return;
}
//передаём данные
if (TapeOutMode==TAPE_OUT_DATA)
{
if (index16>=16)
{
if (BytesCount>=sz)
{
TapeOutMode=TAPE_OUT_STOP;
//TapeOutMode=TAPE_OUT_PAUSE;//ставим паузу по оканчанию процесса
//sz=FioNextHead();//читаем размер блока
BytesCount = 0;
return;
}
byte=FioNextByte();//читаем байт из буфера
byte_temp = byte;
index16=0;//первоначальное значение бита
BytesCount++;//общий счетчик байт файла
}
printf("byte_temp %X\r\n", byte_temp);
//выдаём бит
if (byte&128) {
TIM6->PSC = 10265;//начальное значение таймера
printf("bit%u =1 byte %u\r\n", index16,BytesCount);
}
else {
TIM6->PSC = 5132;//начальное значение таймера
printf("bit%u =0 byte %u\r\n", index16,BytesCount);
}
if ((index16%2)==1) byte<<=1;
index16++;
return;
}
Добавлено after 3 minutes 49 seconds:

[/img]
Добавлено after 2 minutes 33 seconds:
Код: Выделить всё
/*----------------------------чтение файла tap-------------------------------------------------------*/
void read_tap(uint16_t id)
{
f_open(&file_tap, fm_curfiles[id]->text, FA_OPEN_EXISTING | FA_READ);
printf("Open tap\r\n");
sz=FioNextHead();
TapeOutMode=TAPE_OUT_LEAD;
//TapeOutVolume=0;
//printf("Read 0x13 bite tap\r\n");
while(1)
{
if (TapeOutMode==TAPE_OUT_STOP)
{
sz=FioNextHead();
HAL_Delay(500);
TapeOutMode=TAPE_OUT_LEAD;
//TapeOutVolume=0;
}
keyboard_update();
gui_draw();
//sys_start_threads();//опрос экрана и клавиатуры
}
}
Добавлено after 2 minutes 29 seconds:
Если поменять тут false на true
Код: Выделить всё
if (TapeOutVolume==true)
{
HAL_GPIO_WritePin(GPIOD, LD6_Pin, GPIO_PIN_SET);
TapeOutVolume=false;
}
else
{
HAL_GPIO_WritePin(GPIOD, LD6_Pin, GPIO_PIN_RESET);
TapeOutVolume=true;
}
то загрузка пойдет но на последнем блоке окончится ошибкой. Не хватит последнего бита
Добавлено after 2 hours 41 minute 59 seconds:
[youtube]
https://youtu.be/U96scn5DNL0
[/youtube]
вот если поставить
if (TapeOutMode==TAPE_OUT_STOP)
{
index16=16;//первоначальное значение бита
byte =0;//первоначальное значение байта
HAL_GPIO_WritePin(GPIOD, LD6_Pin, GPIO_PIN_SET);//установка в ноль
//HAL_GPIO_TogglePin(GPIOD, LD6_Pin);
return;
}