首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

把这个贴子顶起来,我碰到的问题不知道是否有些相似,我用的单片机是GZ8,下载程序是按照DATASHEET自制的工具,当编写程序的时候,我是选择CLASS 3 ,COM1,波特率为7200,忽略发送密码。在下载的过程中,居然还要给CPU断电(低于0.1v).这样好不容易进入程序的下载,但是在下载的过程中,也会出错,也是到了0xffxx(大约)就ERROR。我现在很急想解决啊,老板给的时间有限,请问这是什么原因啊?我上面说的过程有错吗?请指教啊!谢谢!
立志做个专业的工程师
今天换了个小测试软件.下载成功,运行也正常.
立志做个专业的工程师
是这样:我选择用的晶振是8M的,这些都是根据DATASHEET上的要求作的.我自己做一块小板来下载程序.我现在编写小软件测试都正常.但是上次出现问题的稍大一点的软件的烧写问题还没有时间去琢磨.
感觉这样的烧写方法实在太烦琐了.而且感觉不是很稳定.不知道版主能否推荐一种开发工具(HC08单片机).
立志做个专业的工程师
从我这几天的烧写程序来看,用自制的编写工具很不稳定.我有点怀疑是操作系统的问题.当我出现程序不能下载时.我重新启动系统,大多数情况下能烧写成功.我用的是XP系统,我想是不是应该换个2000的系统看看!
请问版主.在程序烧写时对系统有要求吗?
在烧写程序时.总会有这样一句提示:Windows NT detected.
因为以前用51系列的时候.有些编程器确实只支持2000系统.
立志做个专业的工程师
下面是我的源码,在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; } }
立志做个专业的工程师
这样应该都已经有注意到了
我用的是8M晶振.用的是normal monitor mode
进入监控ROM条件:
IRQ---9v左右
PTA0,PTB4,PTB0---高电平
PTA1,PTB1--低电平

现在看来,程序是否能正确下载好像和编写的软件有关系.如果下载成功的软件,一般下载多次也会成功.但是如果没有下载成功.多次下载仍然是不成功.如同上面的代码.我把最下面那个中断函数改成查询后.下载就能成功.如果用中断方式.下载多次了,没有成功过一次.
版主如果你有条件的话可试试看(XP操作系统).
立志做个专业的工程师
把这个贴子再顶起来吧,我能我用的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
立志做个专业的工程师
返回列表