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