Re: 利用8051撰寫AT command 的問題
改這樣試看看~~~
※ 引述《maxwellyann (不彥其煩)》之銘言:
: init_rs232() //初始化RS232通訊介面 <<這裡怪怪的 分號的部份>>
: { //通訊協定:<9600 N 8 1>
: SCON=0x50; //設定串列界面工作模式1,接收資料致能
SCON=0xD8; <- 改為 mode 3, 並把TB8設為1
這樣才有正確的stop bit
: TMOD=0x20; //設定計時器1工作於模式2
: TH1=0xFD; //設定鮑率為9600BPS
: TR1=1; //啟動計時器1開始計數
: TI=1; //設定串列傳送中斷產生旗號
TI=0;
: }
: tx_char(unsigned char c) //傳送一位元組資料
: {
: while(1)
: if(TI)break; //等待傳送中斷旗號產生
上兩行改 while(TI) ;
: TI=0; //清除串列傳送中斷旗號
: SBUF=c; //由串列埠傳送資料出去
: }
: tx_str(char*str) //傳送字串資料
: {
: do{tx_char(*str++);}
: while(*str!='\0');
改 while(*str) tx_char(*str++); 可能好一點
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.68.71.218
※ 編輯: ksmrt0123 來自: 219.68.71.218 (12/14 23:24)
推
12/14 23:23, , 1F
12/14 23:23, 1F
推
12/15 12:07, , 2F
12/15 12:07, 2F
改掉上面
→
12/15 12:13, , 3F
12/15 12:13, 3F
不用, 這邊只是說明SCON=0xD8的效果
→
12/15 12:15, , 4F
12/15 12:15, 4F
改掉原來的 TI=1;
※ 編輯: ksmrt0123 來自: 219.68.71.218 (12/15 14:47)
推
12/15 22:34, , 5F
12/15 22:34, 5F
→
12/15 22:35, , 6F
12/15 22:35, 6F
用示波器或是邏輯分析儀看TxD的波形啊
這兩樣都沒有就有點麻煩了...
※ 編輯: ksmrt0123 來自: 219.68.71.218 (12/16 00:30)
→
12/16 17:10, , 7F
12/16 17:10, 7F
RS232? 還是51的serial port? 什麼東西的pin 2,3,4?
這兩個並不一樣
→
12/16 17:10, , 8F
12/16 17:10, 8F
怎樣的動作? 有看到波形嗎? 正確嗎?
→
12/16 17:15, , 9F
12/16 17:15, 9F
假如你用的標準的8051, 且crystal用的是 11.0592MHz,
那這麼baudrate應該是9600沒錯
※ 編輯: ksmrt0123 來自: 219.68.71.218 (12/16 20:38)
→
12/16 21:31, , 10F
12/16 21:31, 10F
rs232 pin.4是DTR, 你有用到DTR?
還有什麼叫"有電位差"?
→
12/16 21:47, , 11F
12/16 21:47, 11F
就說這兩個不一樣了...
把廠牌/型號寫出來啊
→
12/16 21:53, , 12F
12/16 21:53, 12F
你應該又把rs232 什麼又叫"有反應"?
跟51的serial port搞混了
※ 編輯: ksmrt0123 來自: 219.68.71.218 (12/16 23:03)
→
12/16 23:56, , 13F
12/16 23:56, 13F
→
12/17 00:09, , 14F
12/17 00:09, 14F
→
12/17 00:10, , 15F
12/17 00:10, 15F
→
12/17 00:12, , 16F
12/17 00:12, 16F
→
12/17 00:15, , 17F
12/17 00:15, 17F
→
12/17 00:16, , 18F
12/17 00:16, 18F
→
12/17 00:18, , 19F
12/17 00:18, 19F
→
12/17 00:19, , 20F
12/17 00:19, 20F
→
12/17 00:20, , 21F
12/17 00:20, 21F
→
12/17 00:21, , 22F
12/17 00:21, 22F
→
12/17 00:22, , 23F
12/17 00:22, 23F
→
12/17 00:23, , 24F
12/17 00:23, 24F
→
12/17 00:24, , 25F
12/17 00:24, 25F
→
12/17 00:31, , 26F
12/17 00:31, 26F
→
12/17 00:31, , 27F
12/17 00:31, 27F
推
12/17 01:55, , 28F
12/17 01:55, 28F
推
12/17 01:58, , 29F
12/17 01:58, 29F
推
12/17 02:02, , 30F
12/17 02:02, 30F
推
12/17 02:05, , 31F
12/17 02:05, 31F
→
12/17 02:05, , 32F
12/17 02:05, 32F
推
12/17 02:24, , 33F
12/17 02:24, 33F
→
12/17 13:12, , 34F
12/17 13:12, 34F
→
12/17 13:12, , 35F
12/17 13:12, 35F
→
12/17 13:13, , 36F
12/17 13:13, 36F
→
12/17 13:14, , 37F
12/17 13:14, 37F
→
12/17 13:15, , 38F
12/17 13:15, 38F
→
12/17 13:16, , 39F
12/17 13:16, 39F
推
12/17 14:06, , 40F
12/17 14:06, 40F
→
12/17 14:06, , 41F
12/17 14:06, 41F
→
12/17 15:35, , 42F
12/17 15:35, 42F
→
12/17 15:37, , 43F
12/17 15:37, 43F
→
12/17 15:38, , 44F
12/17 15:38, 44F
假如還在debug, 可照下列步驟做:
(0) 名詞定義
0.1 實驗板: 洋天 TE-51-UC
0.2 51: 8051 uP, 廠牌與型號未知, 可能是 Atmel 89S51
0.3 Serial port: 8051 IC 上的 serial io port, 包含
RxD (pin 10) 與 RxD (pin 11)
0.4 RS232: TE-51-UC板子上的 DE-9 接頭的那個介面.
RS232跟 51 serial port相關但不相同, 不要搞混
TE-51-UC板子應該是DCE端, TxD是pin3, RxD是pin 2
(1) 確認 8051 正確燒錄與執行
請先確定寫好的程式有正確的燒錄進8051,
並且有正確執行. 把下列程式燒進去51裡,
用示波器或電表量看看51的IO port輸出是否正確:
#include <reg51.h>
main()
{
P0 = 0x55;
P1 = 0x55;
P2 = 0x55;
P3 = 0x55;
}
(2) 確認 51 serial port 有正確輸出
#include <reg51.h>
main()
{
int c;
SCON=0xD8;
TMOD=0x20;
TH1=0xFD;
TR1=1;
TI=1;
TI=0;
c = 0;
while(1) {
SBUF = 0x00;
while(!TI) ;
TI = 0;
}
}
把上面的程式燒進 51 後, 用示波器量 51 的 TxD (pin 11),
會看到這樣的波形:
_ _ _ _ _
TxD: |_________| |_________| |_________| |_________| |___
(3) 確認 baudrate
假如8051用的是11.0592MHz的crystal, 那serial port輸出
會是 9600 bps. 輸出0x00, 包含1個start bit 跟8個data bits
均為 low, 所以TxD波形 low 的寬度是 9個 bit time, 約為
937.5 uS; high只佔1個bit time, 約104uS.
_ _
|_________| |____
^-937.5uS-^
^-^
104uS
(4) 先這樣看情況再說吧...
※ 編輯: ksmrt0123 來自: 219.68.71.218 (12/17 16:01)
推
12/17 16:17, , 45F
12/17 16:17, 45F
→
12/17 16:18, , 46F
12/17 16:18, 46F
→
12/17 16:57, , 47F
12/17 16:57, 47F
嗯, 這樣應該ok
→
12/17 16:59, , 48F
12/17 16:59, 48F
你的RS232有接東西嗎? 理論上沒接其他東西的話
RxD應該要維持 5V, TxD 因為送 0x00出去, 用電錶
量到 0V 應該ok...
你不是有示波器? 用示波器看比較準~
量量看有沒有我畫的那樣的波形
※ 編輯: ksmrt0123 來自: 219.68.71.218 (12/17 17:05)
→
12/17 17:11, , 49F
12/17 17:11, 49F
→
12/17 17:12, , 50F
12/17 17:12, 50F
推
12/17 17:59, , 51F
12/17 17:59, 51F
→
12/17 18:00, , 52F
12/17 18:00, 52F
推
12/17 18:17, , 53F
12/17 18:17, 53F
推
12/17 18:20, , 54F
12/17 18:20, 54F
→
12/17 18:20, , 55F
12/17 18:20, 55F
→
12/17 18:22, , 56F
12/17 18:22, 56F
還是先確定baudrate正確比較好, 1.7543KHz有點怪怪的.
不然你看一下板子上的 crystal 上面打多少?
假如不是 11.0592 的話 baudrate就不對, 要改 TH1.
示波器還是要學一下... 不會看示波器以後debug會很困難
你說的 CH1=5V是垂直(電壓)的區間(division)一格是5V, 在這不重要,
Time=0.2mS 表示水平一格是 0.2mS = 200uS,
假如TxD以9600bps送出 0x00, 那 low 的部份就會佔
937.5uS, 大約是4格多接近5格. 這樣可大約估出波形寬度了.
可配合 trigger position來調整波形在螢幕上的位置,
把前面的下降緣對齊格線, 這樣量就比較準確了.
現在的示波器都是DSO, 有遊標(cursors)做精確地量測,
把第一個cursor放在下降緣, 第二個放上升緣,
這樣low 的寬度 DSO 就自動量好顯示在螢幕上了.
(一般在右上方顯示 |A-B| 或是 一個三角形(delta)的就是了)
※ 編輯: ksmrt0123 來自: 219.68.71.218 (12/17 19:01)
推
12/17 19:45, , 57F
12/17 19:45, 57F
→
12/17 19:46, , 58F
12/17 19:46, 58F
不可以
推
12/17 19:51, , 59F
12/17 19:51, 59F
→
12/17 19:51, , 60F
12/17 19:51, 60F
不對
你應該要讀一下 8051 serial port跟baudrate的設定.
當baudrate固定, crystal頻率跟(0x100-TH1)成正比.
crystal 越快, 0x100-TH1 就要越大,
TH1 也就越小.
至於 keil c 設定的 11.0592 MHz 是供 simulator 計算時間用的,
跟實際一點關係都沒有. 你可試試把 keil 設成 generic 8052,
crystal 可設成 999 MHz, 燒錄看看跑起來有沒有不一樣~~~
※ 編輯: ksmrt0123 來自: 219.68.71.218 (12/17 20:24)
推
12/17 20:45, , 61F
12/17 20:45, 61F
這划不來吧 ^^
※ 編輯: ksmrt0123 來自: 219.68.71.218 (12/17 21:40)
推
12/17 22:42, , 62F
12/17 22:42, 62F
→
12/17 22:44, , 63F
12/17 22:44, 63F
推
12/17 22:46, , 64F
12/17 22:46, 64F
→
12/17 22:46, , 65F
12/17 22:46, 65F
→
12/17 22:47, , 66F
12/17 22:47, 66F
推
12/17 23:06, , 67F
12/17 23:06, 67F
推
12/17 23:08, , 68F
12/17 23:08, 68F
→
12/17 23:09, , 69F
12/17 23:09, 69F
推
12/26 02:15, , 70F
12/26 02:15, 70F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
ASM 近期熱門文章
PTT數位生活區 即時熱門文章