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