廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 10148 個閱讀者
 
<<   1   2   3  下頁 >>(共 3 頁)
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
ken0127
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C/C++][求助] 有關KEIL C上RS232傳輸接收的問題及debug時的問題
小弟我現在正在寫一個8051上的LOADER程式
主要是從pc端由RS232傳送程式的hex檔,由loader來存入外接sram,並執行傳送過來的程式

但還是新手的我碰到了許多問題
想向站上的高手們求救

我的程式碼片段如下

void inchar()
{
REload:
while( 1 ) if( RI ) break;

getChar = SBUF;
if( getChar == 0x3a )
{
RI = 0;
goto REload;
}

RI = 0;
return;
}

以上getChar定義為unsigned char
想問大家我的這段程式碼有沒有錯
因為我用debug單步執行時
一直會跳過if判斷式
我在單步執行時的步驟不知有沒有錯
因為我在rs232輸入的部份
是選debug session時由peripherals那邊的serial
在執行到while( 1 ) if( RI ) break;時
我手動將SBUF設為0x3a,RI打勾, ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容




獻花 x0 回到頂端 [樓 主] From:未知地址 | Posted:2007-02-28 23:10 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

SBUF 本身為 input/output 特殊暫存器.
所以你直接改變 SBUF 並不會影響收到的內容.
你應該修改執行 getChar = SBUF 後 getChar 的內容
如果這行被最佳化而不見, 可以在宣告改成 volatile unsigned char getChar; 就可以了

為何要用 unsigned char xdata *DPTR = 0x82; 還有 loader 的寫法也很奇怪???


獻花 x0 回到頂端 [1 樓] From:台灣中華電信 | Posted:2007-03-01 00:13 |
ken0127
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用cmovies於2007-03-1 00:13發表的 :
SBUF 本身為 input/output 特殊暫存器.
所以你直接改變 SBUF 並不會影響收到的內容.
你應該修改執行 getChar = SBUF 後 getChar 的內容
如果這行被最佳化而不見, 可以在宣告改成 volatile unsigned char getChar; 就可以了

.......

謝謝大大
至於DPTR定義的部分
因為我想說把他定義為外部RAM的位址(因為LOADER是燒在8051內部ROM,下載的程式存在外部RAM)
但不知道這樣定義是不是對的
整個LOADER的寫法
之前有在國外網站找到兩個版本的組語
我是採用比較簡單的那個
我把他的CHECKSUM跟BYTECOUNT的部分去掉
其於的部份是由組語改過來的
但不知道這樣子改對不對= =
小弟我對8051還不是很熟
也很少有書在說明串列埠的部分
還有寫到外部記憶體的部份
因為如果想以後再增加BIT ERROR部份的除錯程式

至於您說在修改執行 getChar = SBUF 後 getChar 的內容
這個我不太清楚要怎麼用
不知道要怎麼叫出監看一個變數
請問是在VIEW=>WATCH & CALL STACK WINDOW那邊增加嗎?


獻花 x0 回到頂端 [2 樓] From:未知地址 | Posted:2007-03-01 00:31 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

對! 用 Watch & Call Stack Windows 按 F2 加入 getChar 變數, 然後再修改內容

你宣告的 *DPTR 跟 51 內部的 DPTR 暫存器同名, 但 KEIL 不會把它們當成一樣的變數.
所以 DPH, DPL 的內容跟你宣告的 *DPTR 是兩個無關的東西!
一般我們的寫法是:
char xdata *pCode;

        inchar();
        atoh();
        swap();
        Reg0 = getChar;
        *((unsigned char *)&pCode + 0) = getChar; // high address
        inchar();
        atoh();
        *((unsigned char *)&pCode + 1) = getChar; // low address
        // 這邊好像還少一個接收字元
        inchar();
        atoh();
        *pCode = getChar;
不曉的你要的是不是這樣?


獻花 x0 回到頂端 [3 樓] From:台灣中華電信 | Posted:2007-03-01 00:45 |
ken0127
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用cmovies於2007-03-1 00:45發表的 :
對! 用 Watch & Call Stack Windows 按 F2 加入 getChar 變數, 然後再修改內容

你宣告的 *DPTR 跟 51 內部的 DPTR 暫存器同名, 但 KEIL 不會把它們當成一樣的變數.
所以 DPH, DPL 的內容跟你宣告的 *DPTR 是兩個無關的東西!
一般我們的寫法是:
.......

嗯嗯,應該就是這個了
因為這寫法跟寫入內部記憶體的一樣
之前學長寫的也有跟這個類似的

那請問我最後當程式下載完,要去執行下載的程式時
進入的位置是08000H嗎?
因為我在DONE的程式碼如下
_DONE SEGMENT CODE
      RSEG   _DONE
PUBLIC DONE

ram      set      08000h
DONE:
     ljmp      ram
     RET
             
     END                  
就是很簡單的JMP到那個位置
這個位置是之前參考外國的程式碼裡
他最後也是跳到這個位置
如果大大要這程式碼我可以貼上來給您

對了,想問你之前說的定義getChar的部份
volatile   <=這個是什麼意思?因為好像不常看到...

不好意思提了這麼多問題~~~~


獻花 x0 回到頂端 [4 樓] From:未知地址 | Posted:2007-03-01 00:59 |
ken0127
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用cmovies於2007-03-1 00:45發表的 :
對! 用 Watch & Call Stack Windows 按 F2 加入 getChar 變數, 然後再修改內容

你宣告的 *DPTR 跟 51 內部的 DPTR 暫存器同名, 但 KEIL 不會把它們當成一樣的變數.
所以 DPH, DPL 的內容跟你宣告的 *DPTR 是兩個無關的東西!
一般我們的寫法是:
.......

還好
為什麼在接收了high跟low之後
還要
    inchar();
    atoh();
    *pCode = getChar;

因為那外國人也是有寫多一次
但我參不透....


獻花 x0 回到頂端 [5 樓] From:未知地址 | Posted:2007-03-01 01:07 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

這跟你的硬體有關係!
只是你從內部ROM到外部ROM可以直接用 jmp 嗎? 不用管 EA 腳嗎???
一般 51 當 EA 為 High 時會從內部 ROM 開始執行而且不會執行外部ROM的程式.
你確定國外網站也是說可以直接從內部ROM跳到外部ROM嗎?
還是說你都是用外部ROM, 只是一棵為ROM, 另一棵為RAM, 而且 EA 都為 Low

volatile 告訴 KEIL 不要將這個變數的存取最佳化而不見


獻花 x0 回到頂端 [6 樓] From:台灣中華電信 | Posted:2007-03-01 01:10 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

為什麼在接收了high跟low之後
還要
  inchar();
  atoh();
  *pCode = getChar;

因為那外國人也是有寫多一次
但我參不透....

因為PC送來的資料格式為 <Addr_H><Addr_L><Code Byte)
不可能 Addr_L 就是 Code Byte 吧!?


獻花 x0 回到頂端 [7 樓] From:台灣中華電信 | Posted:2007-03-01 01:11 |
ken0127
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用cmovies於2007-03-1 01:10發表的 :
這跟你的硬體有關係!
只是你從內部ROM到外部ROM可以直接用 jmp 嗎? 不用管 EA 腳嗎???
一般 51 當 EA 為 High 時會從內部 ROM 開始執行而且不會執行外部ROM的程式.
你確定國外網站也是說可以直接從內部ROM跳到外部ROM嗎?
還是說你都是用外部ROM, 只是一棵為ROM, 另一棵為RAM, 而且 EA 都為 Low
.......

我是用一個內部的rom,加一顆外部的ram
內部的ROM是放LOADER
外部的RAM是放由PC端下載的程式
主要程式流程是由PC端下載程式完,執行下載的程式
而之後還能呼叫原本的LOADER程式,用來更新下載的程式
我所想做的功能在現實上有可能實現嗎?

外國朋友的程式裡沒有特別提到說是不是跳到外部的ram
那要如何從內部的rom跳到外部的ram?
是要在jmp之前將EA腳致能嗎?

謝謝大大的解答了
因為這些問題困擾了我好久了~~~


獻花 x0 回到頂端 [8 樓] From:未知地址 | Posted:2007-03-01 01:23 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我印象中沒看過有人做過從內部ROM跳到外部ROM/RAM.
因為EA一旦拉為Low就會執行外部程式, 根本不會執行接下來的jmp指令
我也不確定EA可不可以動態改變!
除非外部硬體配合, 由軟體啟動後硬體會自動將 EA 拉Low, 並自動Reset, 這樣應該可以做到.

內部ROM指的是 8751 內部的 Flash ROM, 不曉的你指的內部ROM也是這個嗎?
你現在硬體的EA接 High 還是 Low?


獻花 x0 回到頂端 [9 樓] From:台灣中華電信 | Posted:2007-03-01 01:33 |

<<   1   2   3  下頁 >>(共 3 頁)
首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.021990 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言