廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 20556 個閱讀者
 
<< 上頁  1   2   3  下頁 >>(共 3 頁)
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

RS232 的訊號為 Logic 0 = +12V, Logic 1 = -12V (不過一般只有 7V 左右而已)
你可以量量看電壓對不對就知道MAX232有沒有正常?
T1OUT, R1IN 應該可以量到 -7V 以下(代表 Logic 1), 這裡都是沒在送資料並且跟PC有接線的情況.
pin 2, 6 應該也可以量到正負 7V


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

剛測試了
8051有回傳0到pc端

但燒回七段顯示器的那個程式又不能用
對接收有反應
就是按了傳送
七段會很怪的亮暗亮暗(不是很亮)
一陣子又停
按了才會這樣
這是否代表pc端的資料有傳送過去?


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

你按一次傳送應該只會送一個 byte 吧!
那你的意思是按一次傳送七段會亮暗亮暗一直變化, 然後幾秒後才恢復全暗或最後的狀態嗎?
由你貼的程式看來不可能會這樣, 除非收到很多 bytes.

8051 送資料給PC會正確原則上也一定可以正確接到資料(只要MAX232沒問題)
但綜合你給的資訊有點奇怪, PC送資料給51但回傳的資料不是一對一而且還是錯的.
這實在不合理! 你做這些測試的環境及軟體都一樣嗎? 有因為做測試而將某些環境改變嗎?


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

我記得你有 ICE 啊! 為何不用 ICE 來 debug?
你可設斷點在 buf = SBUF; 之後, 這樣就可以知道收到什麼資料, 然後用單步執行來看程式怎麼跑.


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

用ice模擬後…是正常的…我感動的差點落淚了= =
為什麼會這樣??
會是振盪器壞掉了嗎?
因為我幾乎所有的零件都換過一次了
只剩振盪器沒換…= =
而ICE好像自已有振盪器的樣子...

那我接下來剩loader的部份了
我已經將hex檔看過了
但有些地方不太懂
就是每行程式起始位置的那個地方
當讀進來時
分成high跟low add
那這個位置需要儲存起來嗎?
因為當真正jmp到程式碼的地方的時候
他不就是以機械碼來依序讀取嗎?
那這個位置是用來做??
我現在打算是將loader燒在內部的rom
將下載的機械碼存在外部的ram
因此外部記憶體的起始位置應該是0x0000
而將資料存在外部記憶體的程式碼是參考第三波「8051專題製作--使用C語言」
書有點舊了…1995年出版的
而大大之前說有關中斷向量的部份
若是像這樣子的使用方法
還需要考慮到中斷向量嗎?
我將我的程式碼貼在下面
其中checksum的部分還要再修改

#include <reg52.h>
#include <stdio.h>

#define add (char *)0x0000;

volatile char *pCode;
volatile unsigned char getChar;
unsigned int carry;
unsigned char Reg0;
int dataNum;                             //資料總數目
unsigned char checkSum;
unsigned char dataSum;

extern void DONE();
void init();
void inchar();
void atoh();
void swap();
void loader();
void getHex();
//void error();
unsigned int HexToDec( char );


main()
{
loader();
}

void loader()
{
    init();
    pCode = add;


    while( getChar != 0x1a )
    {
REload:        
        inchar();
        if( getChar != 0x3a )
        {
              RI = 0;
              goto REload;
        }
        else if( getChar == 0x1a ) goto Done;

        getHex();
        dataNum = HexToDec( getChar );           //資料總數目
   
        getHex();
        *((unsigned char *)&pCode + 0 ) = getChar;     // high address
        getHex();
        *((unsigned char *)&pCode + 1 ) = getChar;     // low address
        getHex();                                           //讀取檢查碼
   
        for( dataNum; dataNum > 0; dataNum--)
        {
              getHex();
              *pCode++= getChar;                             //讀取並儲存data
              dataSum = getChar + dataSum;
        }    
   
        getHex();                                           //讀取checkSum
        checkSum = getChar;    

//         if( dataSum + checkSum != 0 ) error();
    }
Done:
    DONE();
}

void init()
{
    SCON = 0X50;
    TMOD = 0X20;
    TH1 = 0XFD;
    TR1 = 1;
    TI = 1;
    return;
}


void inchar()
{
    while( 1 ) if( RI ) break;
    getChar = SBUF;        
    RI = 0;
    return;
}


void getHex()
{
    inchar();
    atoh();
    swap();
    Reg0 = getChar;
    inchar();
    atoh();
    getChar = Reg0 | getChar;
}
void atoh()
{
    carry = 0;
    if( getChar < 0x3a ) carry = 1;

    if( carry != 1 ) getChar += 9;
   
   
    getChar = getChar & 0x0f;

    return;
}

void swap()
{
    unsigned char high,low;

    high = getChar & 0xF0;
    high = high >> 4;
    low = getChar & 0x0F;
    low = low << 4;
    getChar = high | low;
}

/*void error()
{
    while(1);
}

*/


unsigned int HexToDec( char m )  
{  
  int mid;
    unsigned char high,low;

    high = m & 0xF0;
    high = high >> 4;
    low = m & 0x0F;


    if( high > 0x00 && high <= 0x09 )  
      mid = high + 15;  
    else   if( high >= 0x0a && high <= 0x0f )  
      mid = high - 0x0a + 10;  

    if( low >= 0x00 && low <= 0x09 )  
      mid = mid + low;  
    else   if( low >= 0x0a && low <= 0x0f )  
      mid = mid + low - 0x0a + 10;

 
    return mid;  
}


[ 此文章被ken0127在2007-03-15 23:39重新編輯 ]


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

那個位址就是後面程式碼要放的開始位址.
HEX 檔案放資料的順序不一定從頭到尾, 所以都用前面的位址來告訴燒錄器什麼位址放什麼內容.

看你的線路沒有將 PSEN 接到 SRAM, 那怎麼執行???


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

為何還要有 HexToDec? HEX 檔案的所有內容都是 16 進制.
大部分 HEX 檔案都沒有 0x1A 來結尾, 你應該判別檢查碼是否為 01 來當結束

    if( getChar != 0x3a )
    {
        RI = 0;   // <---- 這個 RI 應該不需要吧!?
        goto REload;
    }


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

下面是引用cmovies於2007-03-15 23:39發表的 :
那個位址就是後面程式碼要放的開始位址.
HEX 檔案放資料的順序不一定從頭到尾, 所以都用前面的位址來告訴燒錄器什麼位址放什麼內容.

看你的線路沒有將 PSEN 接到 SRAM, 那怎麼執行???


因為那部份將原本的外部rom拆掉了
就沒接回去
書上有一個是接32k的sram
接法是psen空接
然後ea接地耶

但這跟大大說的不一樣
所以若是只接一個外部sram的話
是照您說的接?


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

下面是引用cmovies於2007-03-15 23:54發表的 :
為何還要有 HexToDec? HEX 檔案的所有內容都是 16 進制.
大部分 HEX 檔案都沒有 0x1A 來結尾, 你應該判別檢查碼是否為 01 來當結束

    if( getChar != 0x3a )
    {
.......

要以01當做結束碼
我了解了
之所以用0x1a來結尾是之前的外國朋友寫的
我查了0x1a是ESC
我以為所有的都是以ESC來結尾…

而您列的程式碼
當RI = 1時是傳資料進來
要把他設為0,之後資料才會再傳不是嗎?
因為第一個讀進來的不是都是冒號「:」嗎?


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

那如果我在HEX後自行加入一個結束字元呢?
因為以我的流程來寫的話
若是以0X01來判斷結尾的話
好像行不通
因為有些行程式開頭是0X01開頭...
若是這樣子呢?


獻花 x0 回到頂端 [19 樓] From:未知地址 | Posted:2007-03-16 00:09 |

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