广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 20570 个阅读者
 
<< 上页  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.023518 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言