基于EPM7128設(shè)計的數(shù)據(jù)合并轉(zhuǎn)換器
2.3 幀長計數(shù)器的部分
兩個74161設(shè)計長1/64的分頻器,也叫幀長計數(shù)器,此計數(shù)器的時鐘為FRAMECLK,計數(shù)器的輸出最高兩位邏輯與為中斷INT7,把與門輸出與次高位邏輯異或為中斷INT5。這樣,INT7比INT5在時序上早半個周期。開始復(fù)位后,INT7脈沖首先產(chǎn)生,觸發(fā)中斷,COU中斷后在服務(wù)程序中把64個字節(jié)數(shù)據(jù)寫到FIFO,然后屏蔽中斷INT7,半個周期后,F(xiàn)IFO中還剩32個字節(jié)數(shù)據(jù)(因此FIFO的讀脈沖和FRAMECLK反相同頻)。然后中斷INT5到來,CPU響應(yīng)后,再寫64個字節(jié)數(shù)據(jù)給FIFO,使FIFO中一直保持有數(shù)據(jù)的狀態(tài)(可避免讀FIFO正好落在兩個寫FIFO之間,F(xiàn)IFO因無數(shù)據(jù)而讀死)。這樣,每當(dāng)中斷INT5到來,都寫64字節(jié)給FIFO,周而復(fù)始,所以把64字節(jié)定為幀長。
3 軟件設(shè)計
outp(0x303,0x36);//方式3,方波。//
outp(0x300,0x50);//timer0,分頻比為80。//
outp(0x300,0x00);
outp(0x303,0x74);//方式2,脈沖。//
outp(0x301,0x08);//timer1,分頻比為8。//
outp(0x301,0x00);
數(shù)據(jù)合并:
if((com1_count%24)= =0) ;//串行口1的24字節(jié)數(shù)據(jù)放在數(shù)組Frame的4~27的位置。//
{
com_buf1[com1_count++]=db1; //串行口1接收數(shù)據(jù)//
int Original_Counter;
Original_Counter=com1_count/24;
memcpy(Frame[Original_Counter-1]+4,com_buf1[com1_count-24],24);
}
if((com2_count%24)= =0); //串行口2的24字節(jié)數(shù)據(jù)放在數(shù)組Frame的28~51的位置。//
{
com_buf2[com2_count++]=db2 ;//串行口2接收數(shù)據(jù)//
int Original_Counter;
Original_Counter=com2_count/24;
Memcpy(Frame[Original_Counter-1]+28,com_buf2[com2_count-24],24) ;//合并后的數(shù)據(jù)放在Frame數(shù)組中。//
寫FIFO:
void Send_To_Fifo(int number); //Send_To_Fifo函數(shù)為中斷服務(wù)程序的一部分。//
{
for(int i=0;i64;i++)
outp(WFIFO,Frame[number][i]); //數(shù)組送給FIFO,實現(xiàn)數(shù)據(jù)合并//
評論