線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3638
推到 Plurk!
推到 Facebook!

8052的第二個serial port該如何使用呢?(在keil C開發環境下)

缺席
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-29 15:06:35 IP:61.30.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-30 13:19:04 IP:61.30.xxx.xxx 未訂閱
順便說一下,小弟我是使用winbond的w77e58 http://www.winbond.com/PDF/Sheet/w77e58.pdf 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-01 11:52:45 IP:61.30.xxx.xxx 未訂閱
我現在可以使用第二個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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-08 17:48:07 IP:61.219.xxx.xxx 未訂閱
8051..8052....只有一組UART.... 而且在8051只有Time0 Time1 8052才有Time2 然後serial port 要選擇是用Time0、1、2來當baud rate產生器。 8051、52只有一個serial port... 更正: 忘了看你提供的單晶片資料就發言^^" 嗯這顆mcu是有提供2組serial port 發表人 - liangnet 於 2004/12/08 17:55:15
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-08 17:59:08 IP:61.219.xxx.xxx 未訂閱
用Time1計算BaudRate的公式跟用Time2計算的公式不同哦! 如果你原本正常的程式是用Time2,那是不可直接套用在Time1。
leeli
初階會員


發表:57
回覆:55
積分:27
註冊:2003-06-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-13 09:10:25 IP:61.30.xxx.xxx 未訂閱
最近測試下來,發現我之前的問題是出在我的連接線的問題。因為,我是使用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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-24 11:02:17 IP:61.30.xxx.xxx 未訂閱
引言: 最近測試下來,發現我之前的問題是出在我的連接線的問題。因為,我是使用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的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
這個問題在Keil C下一直都無法解決,可是我換到IAR環境後,同樣的程式碼卻都正常工作。當然,有修改一些宣告來符合IAR的語法。不知道是什麼原因,有沒有人有發生這樣的問題呢? 小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
------
小弟我是BCB的新手,若有發問一些蠢問題,敬請見諒。
對於各位的大力協助,感激不盡!

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-01-25 01:01:22 IP:218.165.xxx.xxx 未訂閱
引言: 最近測試下來,發現我之前的問題是出在我的連接線的問題。因為,我是使用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的新手,若有發問一些蠢問題,敬請見諒。 對於各位的大力協助,感激不盡!
看了一下你的前列code,請參考一下那顆MCU的datasheet,確定你兩個serial port 都有中斷致能,且serial port1的中斷優先權比serial port0高. 詳情參考datasheet中IE (中斷致能)與 IP(中斷優先權)的設定. P.S:個人覺得kiel C比較好用 ^_^ ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-01-25 01:08:23 IP:218.165.xxx.xxx 未訂閱
引言: 看了一下你的前列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
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
系統時間:2024-04-29 14:03:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!