8052的第二個serial port該如何使用呢?(在keil C開發環境下) |
缺席
|
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
Dears:
在8051下只要
TMOD = 0x00; T2CON = 0x30; RCAP2L = BAUDRATE % 256; RCAP2H = BAUDRATE / 256; //COM Initial PCON&=0x7f; SCON=0x50; ES=1; EA=1; //Enable Time2 ET2 = 1; TR2 = 1;這樣就能使用原本的serial port。 然後小弟我都用以下的方式來讀取以及傳送資料: void SCON_int(void) interrupt 4 { char InputBuffer1; if(TI==1) { TI=0; } else if(RI==1) { InputBuffer1=SBUF; RBuf[(head counta)%buf_size]=InputBuffer1; counta ; RI=0; } }請問各位先進:在8052的架構下,我如果要同時使用兩個serial port來傳送資料跟接收資料,我該如何宣告,以及該如何使用?有什麼地方需要注意的? 麻煩各位大大,提供一下寶貴的意見嘍~感恩~ 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! |
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
順便說一下,小弟我是使用winbond的w77e58
http://www.winbond.com/PDF/Sheet/w77e58.pdf 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! |
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
我現在可以使用第二個serial port了,不過送出來的資料時常有錯。似乎是在我的鮑率的算法有問題。
下面是我的8052的起始設定:
void Start_8051(void) small { T2CON = 0x30; RCAP2L = BAUDRATE % 256; RCAP2H = BAUDRATE / 256; //COM0 Initial PCON&=0x7f; SCON0=0x50; //Enable Time2 TR2 = 1; // delay(30000); //COM1 Initial TMOD=0x21; TH1=246; TR1=1; SCON1=0xD0; IE=0xD0; }這裡是我的標頭檔定義: #ifndef __REG54_H__ #define __REG54_H__ /* BYTE Registers */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8; sfr IP = 0xB8; sfr SCON0 = 0x98; sfr SBUF = 0x99; /* 8052 Extensions */ sfr SCON1 = 0xC0; sfr SBUF1 = 0xC1; sfr T2CON = 0xC8; sfr T2MOD = 0xC9; sfr RCAP2L = 0xCA; sfr RCAP2H = 0xCB; sfr TL2 = 0xCC; sfr TH2 = 0xCD; /* WinBond extension */ sfr P4 = 0xD8; sfr XICON = 0xC0; sfr AUXR = 0x8E; /* BIT Registers */ /* PSW */ sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0; //8052 only /* TCON */ sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0; /* IE */ sbit EA = IE^7; sbit ES1 = IE^6; sbit ET2 = IE^5; //8052 only sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0; /* IP */ sbit PT2 = IP^5; sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0; /* P3 */ sbit RD = P3^7; sbit WR = P3^6; sbit T1 = P3^5; sbit T0 = P3^4; sbit INT1 = P3^3; sbit INT0 = P3^2; sbit TXD = P3^1; sbit RXD = P3^0; /* SCON0 */ sbit SM0 = SCON0^7; sbit SM1 = SCON0^6; sbit SM2 = SCON0^5; sbit REN = SCON0^4; sbit TB8 = SCON0^3; sbit RB8 = SCON0^2; sbit TI = SCON0^1; sbit RI = SCON0^0; /* SCON1 */ sbit SM0_1 = SCON1^7; sbit SM1_1 = SCON1^6; sbit SM2_1 = SCON1^5; sbit REN_1 = SCON1^4; sbit TB8_1 = SCON1^3; sbit RB8_1 = SCON1^2; sbit TI_1 = SCON1^1; sbit RI_1 = SCON1^0; /* P1 */ sbit T2EX = P1^1; // 8052 only sbit T2 = P1^0; // 8052 only /* T2CON */ sbit TF2 = T2CON^7; sbit EXF2 = T2CON^6; sbit RCLK = T2CON^5; sbit TCLK = T2CON^4; sbit EXEN2 = T2CON^3; sbit TR2 = T2CON^2; sbit C_T2 = T2CON^1; sbit CP_RL2 = T2CON^0; /* XICON */ sbit PX3 = XICON^7; sbit EX3 = XICON^6; sbit IE3 = XICON^5; sbit IT3 = XICON^4; sbit PX2 = XICON^3; sbit EX2 = XICON^2; sbit IE2 = XICON^1; sbit IT2 = XICON^0; /* P4 */ sbit INT2 = P4^3; sbit INT3 = P4^2; sbit P0_0 = 0x80; sbit P0_1 = 0x81; sbit P0_2 = 0x82; sbit P0_3 = 0x83; sbit P0_4 = 0x84; sbit P0_5 = 0x85; sbit P0_6 = 0x86; sbit P0_7 = 0x87; sbit P1_0 = 0x90; sbit P1_1 = 0x91; sbit P1_2 = 0x92; sbit P1_3 = 0x93; sbit P1_4 = 0x94; sbit P1_5 = 0x95; sbit P1_6 = 0x96; sbit P1_7 = 0x97; sbit P2_0 = 0xA0; sbit P2_1 = 0xA1; sbit P2_2 = 0xA2; sbit P2_3 = 0xA3; sbit P2_4 = 0xA4; sbit P2_5 = 0xA5; sbit P2_6 = 0xA6; sbit P2_7 = 0xA7; sbit P3_0 = P3^0; sbit P3_1 = P3^1; sbit P3_2 = P3^2; sbit P3_3 = P3^3; sbit P3_4 = P3^4; sbit P3_5 = P3^5; sbit P3_6 = P3^6; sbit P3_7 = P3^7; #endif這邊是我第二個serial port中斷處理 void SCON1_int(void) interrupt 6 { if(TI_1==1) { TI_1=0; } else if(RI_1==1) { RI_1=0; } }我的工作頻率是36.864MHz。第一個serial port是使用Timer2計算鮑率56000。 第二個serial port是使用Timer1(因為只能使用Timer1來計算)計算鮑率為9600。煩請各位大大,能否幫小弟我check一下,是否是哪裡有問題,還是什麼地方沒有注意到的?感恩~ 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! |
liangnet
中階會員 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
|
liangnet
中階會員 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
|
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
最近測試下來,發現我之前的問題是出在我的連接線的問題。因為,我是使用USB轉COM的連接線。而我的連接線太長了,所以導致訊號有錯誤。換過傳輸線之後,現在兩個serial port傳輸都很正常了。
不過,我也發現:如果你在第一個serial port中斷裡面同時去用第二個serial port送資料會有問題。ex:
void SCON_int(void) interrupt 4 { char InputBuffer1; if(TI==1) { TI=0; } else if(RI==1) { InputBuffer1=SBUF; SBUF1=InputBuffer1; RI=0; } }線上面這樣。當serial port0收到資料的時候,我希望他同時可以由serial port1送出。可是,如果我把他寫到中斷源裡面,他卻不會從另外一個serial port送出。不知道這是為何?看看有哪為大大能解答小弟的疑惑~感恩~ 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! |
leeli
初階會員 發表:57 回覆:55 積分:27 註冊:2003-06-25 發送簡訊給我 |
引言: 最近測試下來,發現我之前的問題是出在我的連接線的問題。因為,我是使用USB轉COM的連接線。而我的連接線太長了,所以導致訊號有錯誤。換過傳輸線之後,現在兩個serial port傳輸都很正常了。 不過,我也發現:如果你在第一個serial port中斷裡面同時去用第二個serial port送資料會有問題。ex:這個問題在Keil C下一直都無法解決,可是我換到IAR環境後,同樣的程式碼卻都正常工作。當然,有修改一些宣告來符合IAR的語法。不知道是什麼原因,有沒有人有發生這樣的問題呢? 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!void SCON_int(void) interrupt 4 { char InputBuffer1; if(TI==1) { TI=0; } else if(RI==1) { InputBuffer1=SBUF; SBUF1=InputBuffer1; RI=0; } }線上面這樣。當serial port0收到資料的時候,我希望他同時可以由serial port1送出。可是,如果我把他寫到中斷源裡面,他卻不會從另外一個serial port送出。不知道這是為何?看看有哪為大大能解答小弟的疑惑~感恩~ 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡! |
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
引言: 最近測試下來,發現我之前的問題是出在我的連接線的問題。因為,我是使用USB轉COM的連接線。而我的連接線太長了,所以導致訊號有錯誤。換過傳輸線之後,現在兩個serial port傳輸都很正常了。 不過,我也發現:如果你在第一個serial port中斷裡面同時去用第二個serial port送資料會有問題。ex:看了一下你的前列code,請參考一下那顆MCU的datasheet,確定你兩個serial port 都有中斷致能,且serial port1的中斷優先權比serial port0高. 詳情參考datasheet中IE (中斷致能)與 IP(中斷優先權)的設定. P.S:個人覺得kiel C比較好用 ^_^ ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------void SCON_int(void) interrupt 4 { char InputBuffer1; if(TI==1) { TI=0; } else if(RI==1) { InputBuffer1=SBUF; SBUF1=InputBuffer1; RI=0; } }線上面這樣。當serial port0收到資料的時候,我希望他同時可以由serial port1送出。可是,如果我把他寫到中斷源裡面,他卻不會從另外一個serial port送出。不知道這是為何?看看有哪為大大能解答小弟的疑惑~感恩~ 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!? |
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
引言: 看了一下你的前列code,請參考一下那顆MCU的datasheet,確定你兩個serial port 都有中斷致能,且serial port1的中斷優先權比serial port0高. 詳情參考datasheet中IE (中斷致能)與 IP(中斷優先權)的設定. P.S:個人覺得kiel C比較好用 ^_^看過了datasheet IE與IP分別在page 20與page 21. 你前面的程式都沒有設定到IP吧. ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------ 發表人 - ㊣ 於 2005/01/25 01:10:08
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |