Board logo

标题: 版主请看啊,.s19文件的下载问题,我怀疑是p&e的软件bug [打印本页]

作者: 陈远征    时间: 2005-7-11 17:34     标题: 版主请看啊,.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]
作者: strongchen    时间: 2005-7-12 11:52

这个问题真是非常奇怪。

怀疑是芯片没有完全擦空。你可以试试先用Cyclone Pro将芯片完全擦空,然后再用会出错的软件和工具试试。
作者: 天涯倦客    时间: 2005-7-12 21:56

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

今天换了个小测试软件.下载成功,运行也正常.
作者: strongchen    时间: 2005-7-13 11:41

天涯倦客,你的问题全解决了吗?

另外,你们的晶振频率是多少?
作者: 天涯倦客    时间: 2005-7-13 13:01

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

Multilink。
作者: 陈远征    时间: 2005-7-13 16:38

我是用它来做具体的产品,这个问题实际很早的时候就发现了,但是当时没时间来管它,就采取了不重要的中断就查询的办法,
   版主说的方法现在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,最好是下午,因为我们是弹性工作制,上午来的比较晚。
作者: 陈远征    时间: 2005-7-13 16:55

另外我用的晶振是外部4M,内部总线运行8M,但是下载仿真的时候不都是强制的2M吗?天涯,GZ8跟GZ16差不多,你也可以帮忙试一下,同时开个串口的收发中断编个简单的程序,看看下载怎么样。
      如果你的程序下载出错不是因为中断引起的,建议你用我说的上面的方法,加几条无用的代码,重新编译下载,要多试几次,肯定会成功。
     如果怕麻烦就还是买开发工具吧,有现货最好,要是订货就时间太长了
作者: 天涯倦客    时间: 2005-7-14 16:19

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

下面是我的源码,在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; } }
作者: strongchen    时间: 2005-7-15 09:54

不知你们注意没有,GZ16/GZ8监控模式下晶振必须是8M或4M,而且与PTB4脚的电平有关。
作者: 天涯倦客    时间: 2005-7-15 11:47

这样应该都已经有注意到了
我用的是8M晶振.用的是normal monitor mode
进入监控ROM条件:
IRQ---9v左右
PTA0,PTB4,PTB0---高电平
PTA1,PTB1--低电平

现在看来,程序是否能正确下载好像和编写的软件有关系.如果下载成功的软件,一般下载多次也会成功.但是如果没有下载成功.多次下载仍然是不成功.如同上面的代码.我把最下面那个中断函数改成查询后.下载就能成功.如果用中断方式.下载多次了,没有成功过一次.
版主如果你有条件的话可试试看(XP操作系统).
作者: 陈远征    时间: 2005-7-15 15:34

2000,98我都用过自制的工具很稳定的,XP没试过
作者: tgw_smile    时间: 2005-7-19 13:06

应该是成功的吧,你把原理图给我看下,你的接法可能有问题
PTB4=0时候应该是14400BPS。ptb4=1时是7200
你可以重新DOWN下软件,PROG08SZ,都可以做到的。
我在XP下用过烧写过GZ16,没问题的
作者: catia1    时间: 2005-7-19 13:32

我在2003下,烧gz16正常,
作者: 陈远征    时间: 2005-7-19 16:39

天涯你的试验更坚定了我的信心哈,那个中断向量表的地方现在我估计BUG的可能性高达99%
作者: 天涯倦客    时间: 2005-7-21 10:25

把这个贴子再顶起来吧,我能我用的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
作者: strongchen    时间: 2005-7-21 11:32

有bug是可能的。所以要经常去MetroWerks看看有什么新的补丁公布。
作者: 陈远征    时间: 2005-7-21 16:15

好的我去下载来看看,谢谢天涯先
作者: 陈远征    时间: 2005-7-27 15:22

没解决:-(,再多试试
作者: 陈远征    时间: 2005-7-28 13:57

谢谢版主和天涯的大力支持,问题已解决,这些天老是出差,没静下心来仔细研究,我后来把3.0的删除,重新装了个3.1的,再升级一下就ok 拉.
作者: mickeys_wu    时间: 2006-3-10 21:33

可以請問一下嗎?
為什麼CYCLONE PRO在DEBUG的時候,執行RUN後,STOP住,為什麼需要去PING或RESET呢?
真的這麼麻煩嗎?[em16]
作者: mickeys_wu    时间: 2006-3-10 21:44

附上我剛出爐的工具板GZ60.
IO全都拉出來囉~
還滿好用的.
作者: mickeys_wu    时间: 2006-3-10 21:46

對了,我上傳的圖片,怎麼顯示啊?
作者: mickeys_wu    时间: 2006-3-10 22:19

[upload=image/pjpeg]uploadImages/gz60-1.jpg[/upload]
作者: guantingwei    时间: 2006-3-11 12:59

与codewarrior版本,操作系统,机器,下载板都有关系。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0