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

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

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

问题:
我软件用CodeWarrior CW08_V3.0,芯片用MC68HC908GZ16,C编程
当我的软件中用到这种情况的时候
interrupt 13 void SCIRX_ISR (void)
{
//.....
}
interrupt 14 void SCITX_ISR (void)
{
//.....
}
编译正常,当下载.s19文件的时候,到了0xffe2就出错了,下载软件分别是CodeWarrior CW08_V3.0自带的(HIWIVE),和PROG08SZ V2.05,选择CLASS 1方式7200波特率连接,用的下载工具是freescale ics board(T3接口)还有自己制作的class 3那种方式下载的工具,我借用了P&E cyclone pro 下载工具下载那个.s19文件就不会出错。还有如果我只用这两个中断的任何一个就不会出错。
因为下载的是同一个.s19文件,所以我怀疑是不是class 1,2,3,4那几种下载方式有BUG呢还是我那里的配置不对啊。
同样的问题还出现在我同时用interrupt 19 void CAN_ERROR(void)和interrupt 20 void CANRX_ISR(void) 的时候,其它的我没有实验过。



[em07]
这个问题真是非常奇怪。

怀疑是芯片没有完全擦空。你可以试试先用Cyclone Pro将芯片完全擦空,然后再用会出错的软件和工具试试。
海纳百川  有容乃大
把这个贴子顶起来,我碰到的问题不知道是否有些相似,我用的单片机是GZ8,下载程序是按照DATASHEET自制的工具,当编写程序的时候,我是选择CLASS 3 ,COM1,波特率为7200,忽略发送密码。在下载的过程中,居然还要给CPU断电(低于0.1v).这样好不容易进入程序的下载,但是在下载的过程中,也会出错,也是到了0xffxx(大约)就ERROR。我现在很急想解决啊,老板给的时间有限,请问这是什么原因啊?我上面说的过程有错吗?请指教啊!谢谢!
立志做个专业的工程师
今天换了个小测试软件.下载成功,运行也正常.
立志做个专业的工程师
天涯倦客,你的问题全解决了吗?

另外,你们的晶振频率是多少?
海纳百川  有容乃大
是这样:我选择用的晶振是8M的,这些都是根据DATASHEET上的要求作的.我自己做一块小板来下载程序.我现在编写小软件测试都正常.但是上次出现问题的稍大一点的软件的烧写问题还没有时间去琢磨.
感觉这样的烧写方法实在太烦琐了.而且感觉不是很稳定.不知道版主能否推荐一种开发工具(HC08单片机).
立志做个专业的工程师
Multilink。
海纳百川  有容乃大
我是用它来做具体的产品,这个问题实际很早的时候就发现了,但是当时没时间来管它,就采取了不重要的中断就查询的办法,
   版主说的方法现在cyclone pro 不在我手上,但是我用软件读取向量表的地址,出错的时候所有的中断的地方的数据都是FF,证明的确是擦除了。我用GZ16,32差不多1年了,最初买了个Multilink可惜烧坏了,后来就用自制的工具来下载,现在新订购的USB的还要估计1--2个月才到手呢
  实际上还有个小小的问题就是比如我做的程序不管是5K还是18K的,经常会有这种情况,编译通过下载出错,只要你头一次下载出错,那么无论你下多少次都是同一个地址的地方出错,但是如果我添加几个没用的代码,将它重新编译通过,经常就可以下了,例如我在程序中有这么几行就是干这个用的
  //unsigned char a,b;
//  a=0;
//b=0;
// a=1;
//b=1;
如果编译通过下载不过就将这几个屏蔽的地方打开部分,经常就可以下载了。

   但是中断的这个问题,这招是没用的
   我们现在的部分产品用的是hc08的芯片,还好现在还可以应付过来,不过我的一个朋友跟我说用Multilink应该没有这个下载的问题。而且这个下载出错的可重复性特别好。所以我觉得应该是这几个下载方式算法的问题。
  版主是北京的吗,要是的话哪天来我公司给你演示下。
  现在我在等freescale的邮件呢。
  也可以打我的办公电话010-82647110-606,最好是下午,因为我们是弹性工作制,上午来的比较晚。
另外我用的晶振是外部4M,内部总线运行8M,但是下载仿真的时候不都是强制的2M吗?天涯,GZ8跟GZ16差不多,你也可以帮忙试一下,同时开个串口的收发中断编个简单的程序,看看下载怎么样。
      如果你的程序下载出错不是因为中断引起的,建议你用我说的上面的方法,加几条无用的代码,重新编译下载,要多试几次,肯定会成功。
     如果怕麻烦就还是买开发工具吧,有现货最好,要是订货就时间太长了
从我这几天的烧写程序来看,用自制的编写工具很不稳定.我有点怀疑是操作系统的问题.当我出现程序不能下载时.我重新启动系统,大多数情况下能烧写成功.我用的是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; } }
立志做个专业的工程师
不知你们注意没有,GZ16/GZ8监控模式下晶振必须是8M或4M,而且与PTB4脚的电平有关。
海纳百川  有容乃大
这样应该都已经有注意到了
我用的是8M晶振.用的是normal monitor mode
进入监控ROM条件:
IRQ---9v左右
PTA0,PTB4,PTB0---高电平
PTA1,PTB1--低电平

现在看来,程序是否能正确下载好像和编写的软件有关系.如果下载成功的软件,一般下载多次也会成功.但是如果没有下载成功.多次下载仍然是不成功.如同上面的代码.我把最下面那个中断函数改成查询后.下载就能成功.如果用中断方式.下载多次了,没有成功过一次.
版主如果你有条件的话可试试看(XP操作系统).
立志做个专业的工程师
2000,98我都用过自制的工具很稳定的,XP没试过
应该是成功的吧,你把原理图给我看下,你的接法可能有问题
PTB4=0时候应该是14400BPS。ptb4=1时是7200
你可以重新DOWN下软件,PROG08SZ,都可以做到的。
我在XP下用过烧写过GZ16,没问题的
签名: 最多300字节 文字将出现在您发表的文章的结尾处。体现您的个性。
返回列表