Где то вот так отлавливает 176 кгц 192 и т.д...
Код:
#include <htc.h>
#include "main.h"
#include "wm8804.h"
#include "VFD.h"
__CONFIG(FOSC_INTRC_NOCLKOUT & WDTE_OFF & PWRTE_ON & MCLRE_ON & LVP_OFF & BOREN_ON);
__CONFIG(BOR4V_BOR21V);
volatile unsigned char wmval;
volatile unsigned char i;
/*=====================INTERRUPT==============================*/
void interrupt isr()
{
if (RBIF) //разбор прерьіваний на изменение состояния пина
{
Led3=GPO0;
WM_SPDIFSTATE();
WM_INTSTATE();
if (bSPDSTAT.UNLOCK==1)
{
if (T_192) T_192 = 0; else T_192 = 1;
};
RBIF = 0;
}
if (T0IF) // разбор таймерного прерьівания
{
if (Led4) Led4=0;else Led4=1;
if (GPO0==0)
{
WM_SPDIFSTATE();
WM_INTSTATE();
}
TMR0 = 0;
T0IF = 0;
};
} ;
/*=========================================M A I N======================================*/
void main()
{
TRISB = 0b00000010; // Порт В на выход
PORTB = 0x00; // Выключаем все выходы порта В
IOCB = 0x00; // прерьівания отключеньі пока по PB1
TRISA = 0b01010000; // Порт A на выход
PORTA = 0x00; // Выключаем все выходы порта A
ANSEL=0; //вход порт А аналог
ANSELH=0;
CCP1CON=0;
RBIE = 1; //прерьівание на портБ
PSA = 0; //прескалер на клок
PS0 = 1; //прескалер на 256
PS2 = 1;
PS1 = 1;
T0CS = 0; //таймер на сист клок
T0IE = 1; //преривание по переполнению таймера
TMR0 = 255;
Led1 = 0;
Led2 = 0;
Led3 = 0;
Led4 = 0;
CSB = 1;
STB = 1;
WM_INIT();
WM_WRITE(PWRDN, 0x08);
VFD_INIT();
VFD_WRITE(2,"wm8804");
ei(); //прерьівания разрешил
/*========================================= основной цикл ======================================*/
while(1)
{ // Запускаем бесконечный цикл
if (bINTSTAT.UPD_UNLOCK) VFD_WRITE_CH(30,0x75);
if (bINTSTAT.UPD_REC_FREQ) VFD_WRITE_CH(31,0x66);
if (bINTSTAT.UPD_NON_AUDIO) VFD_WRITE_CH(32,0x61);
if (bINTSTAT.UPD_CPY_N) VFD_WRITE_CH(33,0x63);
if (bINTSTAT.INT_TRANS_ERR) VFD_WRITE_CH(34,0x65);
if (bINTSTAT.INT_INVALID) VFD_WRITE_CH(35,0x69);
if (bSPDSTAT.UNLOCK==1)
VFD_WRITE_CH(21,0x55); // "U" unlock
else
VFD_WRITE_CH(21,0x4C); // "L" lock
if (bINTSTAT.INT_TRANS_ERR==1)
{
VFD_WRITE_CH(23,0x45); // "E" Trans error
if (bSPDSTAT.REC_FREQ==mode1)
{
if (T_192)
{
bPLL.PLL_K_7_0 = 0xBA;
bPLL.PLL_K_15_8 = 0x49;
bPLL.PLL_K_21_16 = 0x0C;
bPLL.PLL_N_3_0 = 0x08;
bPLL.F_192 = 1;
}
else
{
bPLL.PLL_K_7_0 = 0x21;
bPLL.PLL_K_15_8 = 0xFD;
bPLL.PLL_K_21_16 = 0x36;
bPLL.PLL_N_3_0 = 0x07;
bPLL.F_192 = 1;
};
}
else
{
bPLL.PLL_K_7_0 = 0x21;
bPLL.PLL_K_15_8 = 0xFD;
bPLL.PLL_K_21_16 = 0x36;
bPLL.PLL_N_3_0 = 0x07;
bPLL.F_192 = 1;
};
}
else
{
VFD_WRITE_CH(23,0x4E); // "N" Trans OK
};
if (bPLL.F_192)
{
di();
WM_WRITE (PLL1,PLL1_Data);
WM_WRITE (PLL2,PLL2_Data);
WM_WRITE (PLL3,PLL3_Data);
WM_WRITE (PLL4,PLL4_Data);
VFD_WRITE_HX (12,PLL1_Data);
VFD_WRITE_HX (14,PLL2_Data);
VFD_WRITE_HX (16,PLL3_Data);
VFD_WRITE_HX (19,PLL4_Data);
bPLL.F_192 = 0;
ei();
};
switch (bSPDSTAT.REC_FREQ)
{
case (mode1)://192khz
{
VFD_WRITE(25,"192");
};
break;
case (mode2)://88.2-96KHz
{
VFD_WRITE(25,"96 ");
};
break;
case (mode3)://44.1-48KHz
{
VFD_WRITE(25,"48 ");
};
break;
case (mode4)://32khz
{
VFD_WRITE(25,"32 ");
};
};
}
}
Чистьій бьідлокод - но пашет.
По хорошему таймером читать состояние WM ки не надо, и обрабатьівать все желательно в прерьівании по изменению состояния порта.
Социальные закладки