|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
STC 疑似BUG報(bào)告 |
| 作者:xihulu_r 欄目:單片機(jī) |
以下是經(jīng)過初步測試及對照W77E58測試發(fā)現(xiàn)的差異,還望各位DX幫忙確認(rèn),如果是程序的問題,也請幫忙提出改進(jìn)辦法,謝謝! 測試內(nèi)容:在大編譯模式下,測試串口緩沖隊(duì)列的收發(fā),及數(shù)據(jù)識(shí)別。 測試方式: 1. 在xdata區(qū)建立串口收發(fā)緩沖隊(duì)列,收發(fā)隊(duì)列各32 Byte 2. 通訊格式定義:57600,8,N,1 3. 程序功能:識(shí)別收到的'A'后置標(biāo)識(shí)位,之后收到0x0d,發(fā)送字符串"TEST\r\n",并清除標(biāo)識(shí)位 現(xiàn)象: 1. 小模式下正常; 2. 大模式下,少量數(shù)據(jù)正常; 3. 大模式下,先發(fā)送'A',之后連續(xù)發(fā)送0x55,(如用鍵盤控制串口調(diào)試助手,持續(xù)發(fā)送2秒以上,累計(jì)大于1000 Byte),再發(fā)送0x0d,程序無法識(shí)別;之后再發(fā)送4-9 Byte數(shù)據(jù),程序識(shí)別到先前發(fā)送的0x0d, 并給出字符串TEST\r\n; 對照試驗(yàn):W77E58,同等條件下測試均正常。 特別說明:startup.a51設(shè)置為 IDATALEN EQU 0FFH+1 ; the length of IDATA MEMORY in bytes. ; XDATASTART EQU 0H ; the absolute start-address of XDATA MEMORY XDATALEN EQU 03FFH+1 ; the length of XDATA MEMORY in bytes. 在其中定義W77E58的PMR,并添加 STARTUP1: ORL PMR, #01 ; W77E58 XDATA enable ...... 附一:主程序 #include "define.h" sbit LIGHT = P3^4; sbit DOG = P3^5; uchar Time100ms; uchar Time1s; bit Flag100ms; bit Flag1s; /************************************************** 串口隊(duì)列 **************************************************/ uchar xdata RcvBuf[SerialRCV]; uchar xdata SendBuf[SerialSEND]; uchar *RcvRead = RcvBuf; uchar *RcvWrite = RcvBuf; uchar RcvNum; uchar *SendRead = SendBuf; uchar *SendWrite = SendBuf; uchar SendNum; bit FlagSendOK; void InitialCPU (void); void PushSend (uchar byte); uchar PopRcv (void); main() { InitialCPU (); while(1) { if(Flag100ms) { Flag100ms = 0; DOG = ~DOG; } if(Flag1s) { Flag1s = 0; LIGHT = ~LIGHT; } while(RcvNum) { DealSerial(PopRcv()); } } } /************************************************** 初始化CPU資源 **************************************************/ void InitialCpu(void) { SCON = 0x50; PCON |= 0x80; // SMOD = 1; TMOD = 0x21; TH1 = 0xff; TL1 = 0xff; TR1 = 1; TH0 = - 2320 / 256; TL0 = - 2320 % 256; TR0 = 1; EA = 1; ET0 = 1; ES0 = 1; } /************************************************** 時(shí)間片 1ms **************************************************/ void time_chip() interrupt 1 using 1 { TH0 = - 2320 / 256; TL0 = - 2320 % 256; if(++Time100ms % 100 == 0) { Flag100ms = 1; if(++Time1s % 10 == 0) { Time1s = 0; Flag1s = 1; } } } /************************************************** 壓入單數(shù)據(jù)串口0發(fā)送隊(duì)列 **************************************************/ void PushSend(uchar byte) { *SendWrite = byte; if(SendWrite == (SendBuf + SerialSEND - 1)) { SendWrite = SendBuf; } else { SendWrite++; } SendNum++; if(!FlagSendOK) { FlagSendOK = 1; TI = 1; } } /************************************************** 彈出串口0接收隊(duì)列單數(shù)據(jù) **************************************************/ uchar PopRcv(void) { uchar i; i = *RcvRead; if(RcvRead == (RcvBuf + SerialRCV - 1)) { RcvRead = RcvBuf; } else { RcvRead++; } RcvNum--; return (i); } /************************************************** &n |
| 2樓: | >>參與討論 |
| 作者: wincpu 于 2005/9/19 19:15:00 發(fā)布:
關(guān)注 |
|
| 3樓: | >>參與討論 |
| 作者: chunyang 于 2005/9/19 20:49:00 發(fā)布:
應(yīng)是程序結(jié)構(gòu)有問題 MCU本身只要串口能夠受控收發(fā)即可證明該部分基本無誤,從你的現(xiàn)象看應(yīng)是存儲(chǔ)器操作有誤。 |
|
| 4樓: | >>參與討論 |
| 作者: xihulu_r 于 2005/9/20 8:48:00 發(fā)布:
程序都貼出來了,您覺得是哪兒有問題呢? 這段程序在小模式下是可以的,W77E58在大模式/小模式下都可以正常,您覺得結(jié)構(gòu)應(yīng)該怎么改進(jìn)呢? 其實(shí)我也希望是程序的問題,一方面已經(jīng)有很多STC在用了,另一方面對俺也是一次提高。 不過芯片有時(shí)候是說不清楚的,上個(gè)月剛測試完新茂的SM89T16R1,雙串口的那個(gè),結(jié)果新茂的工程師承認(rèn)目前版本的芯片在操作xdata時(shí)如果產(chǎn)生中斷,CPU會(huì)死機(jī)復(fù)位..... 希望能有好結(jié)果吧,呵呵 :) |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號 |