版主请看啊,.s19文件的下载问题,我怀疑是p&e的软件bug

- UID
- 115025
- 性别
- 男
|
把这个贴子顶起来,我碰到的问题不知道是否有些相似,我用的单片机是GZ8,下载程序是按照DATASHEET自制的工具,当编写程序的时候,我是选择CLASS 3 ,COM1,波特率为7200,忽略发送密码。在下载的过程中,居然还要给CPU断电(低于0.1v).这样好不容易进入程序的下载,但是在下载的过程中,也会出错,也是到了0xffxx(大约)就ERROR。我现在很急想解决啊,老板给的时间有限,请问这是什么原因啊?我上面说的过程有错吗?请指教啊!谢谢! |
|
|
|
|
|

- UID
- 115025
- 性别
- 男
|
|
|
|
|
|

- UID
- 115025
- 性别
- 男
|
是这样:我选择用的晶振是8M的,这些都是根据DATASHEET上的要求作的.我自己做一块小板来下载程序.我现在编写小软件测试都正常.但是上次出现问题的稍大一点的软件的烧写问题还没有时间去琢磨.
感觉这样的烧写方法实在太烦琐了.而且感觉不是很稳定.不知道版主能否推荐一种开发工具(HC08单片机). |
|
|
|
|
|

- UID
- 115025
- 性别
- 男
|
从我这几天的烧写程序来看,用自制的编写工具很不稳定.我有点怀疑是操作系统的问题.当我出现程序不能下载时.我重新启动系统,大多数情况下能烧写成功.我用的是XP系统,我想是不是应该换个2000的系统看看!
请问版主.在程序烧写时对系统有要求吗?
在烧写程序时.总会有这样一句提示:Windows NT detected.
因为以前用51系列的时候.有些编程器确实只支持2000系统. |
|
|
|
|
|

- UID
- 115025
- 性别
- 男
|

下面是我的源码,在codewarrior中可以编译通过.但是在用自制的MON08工具中不能下载.请有心的朋友分析一下.我用的单片机是GZ8.操作系统是XP,编译器是CODEWARRIOR 3.1 16K限制版.
#include //for EnableInterrupts macro
#include //include peripheral declarations
#define IBufSERIAL_RECI 10 //接受缓冲区最大的缓冲长度
uchar iBuf_Reci[IBufSERIAL_RECI]; //串口0队列
uchar *Seri_ReadReciPoint=iBuf_Reci;
uchar *Seri_WriteReciPoint=iBuf_Reci;
uchar Seri_ReciNum=0;
uchar break_count; //计算break field所需要的时间以区别0x00字节
uchar data_rec;
uchar data_flag;
uchar fe_flag=0;
void reg_init(void); //配置寄存器初始化
void cgm_init(void); //选择外部晶振作为时钟源
//void breaktime_init(void);
void esci_init(void);
void escirev_init(void);
void io_init(void);
void hc595(uint i);
void send_char(uchar c);
void lin_send(uchar linid,uchar lindata1,uchar lindata2,uchar chksum);
uchar Seri_PopReci(void);
unsigned char a,b;
void main(void) {
//a=0;
b=0;
a=1;
//b=1;
EnableInterrupts;
reg_init(); //配置寄存器初始化
cgm_init();
//breaktime_init();
esci_init();
escirev_init();
io_init();
PTA_PTA6=1;
for(;;) {
if(SCIACTL_AFIN==1){
SCIACTL=0x30; //写SCIACTL寄存器可清除SCIADAT以重新计数.
break_count=SCIADAT; //计算从Rx低电平到Rx上升沿的时间
}
while(Seri_ReciNum!=0){ //如果有接受到数据
data_rec=Seri_PopReci();
data_flag=33;
if(data_rec==0x55)
PTA_PTA6=1;
}
//else
//PTA_PTA6=1;
if(PTB_PTB7){
lin_send(0xc1,0x05,0x06,0x0b);
PTA_PTA6=0;
PTA_PTA7=0;
hc595(0x0000);
}
else{
lin_send(0x42,0x07,0x08,0x0f);
PTA_PTA7=1;
hc595(0xffff);
}
}
}
/*配置寄存器初始化*/
void reg_init(void){
CONFIG1=0x39; //不启用5V LVI,STOP为非法指令,不启用看门狗
//CONFIG1=0x38; //300ms左右看门狗复位
CONFIG2=0x01; //不启用CAN总线,时基不128预分频,在STOP方式晶振不用,内部总线时钟作为SCI时钟源.
}
/*CGM初始化*/
void cgm_init(void){
PCTL=0x00; //选择外部晶振作为时钟,关闭PLL
}
/*I/O口的初始化*/
void io_init(void){
DDRA=0xff; //端口A作为输入口,输入8路可中断的开关信息
DDRB=0x00;
DDRD=0xff;
DDRE=0xff;
}
/*把一个整型数据通过595输出*/
void hc595(uint i){
uchar bitcnt;
for(bitcnt=0;bitcnt<16;bitcnt++){
if(i&0x8000) //确定Ds电平
PTD_PTD1=1; //PTD1=Ds
else
PTD_PTD1=0;
PTD_PTD3=0; //PTD3=SH,在SH的上升沿数据移入到移位寄存器
asm nop;
asm nop;
PTD_PTD3=1;
asm nop;
asm nop;
i=i<<1; //数据左移1位
}
PTD_PTD2=0; //PTD2=ST,在ST的上升沿数据移出锁存器
asm nop;
asm nop;
PTD_PTD2=1;
asm nop;
asm nop;
}
/********************************************
以下为LIN总线的一些函数,主要是操作
ESCI模块的Registers
*********************************************/
/*初始化ESCI模块*/
void esci_init(void){
SCBR=0xc0; //波特率为8K/S,LIN发生和接受break field使能.
SCPSC=0x5d; //设置波特率预分频
SCC1=0x44; //启用SCI且8位数据位无奇偶校验.在停止位后开始计算空闲位,空闲唤醒.
SCC2=0x2c; //发送用查询方式,接受用中断.发送接受使能,不传输break field.
SCC3=0x02; //屏蔽噪声,奇偶,数据溢出中断,打开帧错误中断.
}
/*检测LIN break field time的初始化*/
//void breaktime_init(void){
//SCIACTL=0x30; //写SCI 仲裁控制器,频率为波特率的2倍,用了测量break field时间存储在SCIADAT中
//SCIACTL_AM1=0;
//SCIACTL_AM0=1;
//SCIACTL_ACLK=1;
//}
void escirev_init(void){
Seri_ReadReciPoint=iBuf_Reci;
Seri_WriteReciPoint=iBuf_Reci;
Seri_ReciNum=0;
}
/*发送一个字符*/
void send_char(uchar c){
uchar tmp;
tmp=SCS1; //通过读SCS1接着写SCDR清除SCTE位表示正在发送字符
SCDR=c;
while(SCS1_SCTE==0){ //reset后SCTE位为1,当为0时表示正在传输的过程中
asm nop;
}
}
/*发送一帧LIN信息*/
void lin_send(uchar linid,uchar lindata1,uchar lindata2,uchar chksum){
asm nop; //SCTE=1后稍加延时,准备发送break field.
asm nop;
asm nop;
asm nop;
asm nop;
SCC2_SBK=1; //通过SBK=1接着SBK=0发送break field.
SCC2_SBK=0;
asm nop; //发送break field后稍加延时,接着发送完整的LIN信息帧.
asm nop;
asm nop;
asm nop;
asm nop;
while(SCS1_SCTE==0){ //reset后SCTE位为1,当为0时表示正在传输的过程中
asm nop;
}
asm nop; //发送break field后稍加延时,接着发送完整的LIN信息帧.
asm nop;
asm nop;
asm nop;
asm nop;
send_char(0x55); //发送同步字符0x55.
send_char(linid); //发送id其中数据字节为2字节.
send_char(lindata1); //发送数据1.
send_char(lindata2); //发送数据2.
send_char(chksum); //发送校验和.
}
/**************************************************
弹出串口0接收队列单数据
**************************************************/
uchar Seri_PopReci(void){
unsigned char i;
i=*Seri_ReadReciPoint;
if(Seri_ReadReciPoint==(iBuf_Reci+IBufSERIAL_RECI-1))
Seri_ReadReciPoint=iBuf_Reci;
else
Seri_ReadReciPoint++;
Seri_ReciNum--;
return i;
}
/*ESCI接受中断,把接受缓冲区中的数据压入队列*/
void interrupt 13 scirev_int(void) {
uchar tmp;
if(fe_flag==0x55){
tmp=SCS1;
*Seri_WriteReciPoint=SCDR;
if(Seri_WriteReciPoint==(iBuf_Reci+IBufSERIAL_RECI-1))
Seri_WriteReciPoint=iBuf_Reci;
else
Seri_WriteReciPoint++;
Seri_ReciNum++;
}
}
/*当SCI接受发生帧错误时的中断*/
void interrupt 12 fe_int(void) {
uchar tmp;
if(SCS1_FE){
tmp=SCS1; //清除FE和SCRF标志位.
tmp=SCDR;
if(tmp==0x00) //表示接受到break field
fe_flag=0x55;
}
} |
|
|
|
|
|

- UID
- 115025
- 性别
- 男
|
这样应该都已经有注意到了
我用的是8M晶振.用的是normal monitor mode
进入监控ROM条件:
IRQ---9v左右
PTA0,PTB4,PTB0---高电平
PTA1,PTB1--低电平
现在看来,程序是否能正确下载好像和编写的软件有关系.如果下载成功的软件,一般下载多次也会成功.但是如果没有下载成功.多次下载仍然是不成功.如同上面的代码.我把最下面那个中断函数改成查询后.下载就能成功.如果用中断方式.下载多次了,没有成功过一次.
版主如果你有条件的话可试试看(XP操作系统). |
|
|
|
|
|

- UID
- 115025
- 性别
- 男
|
把这个贴子再顶起来吧,我能我用的codewarrior3.1真的有bug,几天我下载了补丁.到现在为止,程序下载都蛮成功的.下载地址:
http://www.metrowerks.com/MW/download/updates.asp?date_op=on+or+after&year=95&month=01&day=1&did=find&vers=CWHC08 |
|
|
|
|
|