版主请看啊,.s19文件的下载问题,我怀疑是p&e的软件bug
- UID
- 117527
- 性别
- 男
|
版主请看啊,.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] |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
这个问题真是非常奇怪。
怀疑是芯片没有完全擦空。你可以试试先用Cyclone Pro将芯片完全擦空,然后再用会出错的软件和工具试试。 |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
把这个贴子顶起来,我碰到的问题不知道是否有些相似,我用的单片机是GZ8,下载程序是按照DATASHEET自制的工具,当编写程序的时候,我是选择CLASS 3 ,COM1,波特率为7200,忽略发送密码。在下载的过程中,居然还要给CPU断电(低于0.1v).这样好不容易进入程序的下载,但是在下载的过程中,也会出错,也是到了0xffxx(大约)就ERROR。我现在很急想解决啊,老板给的时间有限,请问这是什么原因啊?我上面说的过程有错吗?请指教啊!谢谢! |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
天涯倦客,你的问题全解决了吗?
另外,你们的晶振频率是多少? |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
是这样:我选择用的晶振是8M的,这些都是根据DATASHEET上的要求作的.我自己做一块小板来下载程序.我现在编写小软件测试都正常.但是上次出现问题的稍大一点的软件的烧写问题还没有时间去琢磨.
感觉这样的烧写方法实在太烦琐了.而且感觉不是很稳定.不知道版主能否推荐一种开发工具(HC08单片机). |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 117527
- 性别
- 男
|
我是用它来做具体的产品,这个问题实际很早的时候就发现了,但是当时没时间来管它,就采取了不重要的中断就查询的办法,
版主说的方法现在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,最好是下午,因为我们是弹性工作制,上午来的比较晚。 |
|
|
|
|
|
- UID
- 117527
- 性别
- 男
|
另外我用的晶振是外部4M,内部总线运行8M,但是下载仿真的时候不都是强制的2M吗?天涯,GZ8跟GZ16差不多,你也可以帮忙试一下,同时开个串口的收发中断编个简单的程序,看看下载怎么样。
如果你的程序下载出错不是因为中断引起的,建议你用我说的上面的方法,加几条无用的代码,重新编译下载,要多试几次,肯定会成功。
如果怕麻烦就还是买开发工具吧,有现货最好,要是订货就时间太长了 |
|
|
|
|
|
- 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
- 104380
- 性别
- 男
|
不知你们注意没有,GZ16/GZ8监控模式下晶振必须是8M或4M,而且与PTB4脚的电平有关。 |
|
|
|
|
|
- UID
- 115025
- 性别
- 男
|
这样应该都已经有注意到了
我用的是8M晶振.用的是normal monitor mode
进入监控ROM条件:
IRQ---9v左右
PTA0,PTB4,PTB0---高电平
PTA1,PTB1--低电平
现在看来,程序是否能正确下载好像和编写的软件有关系.如果下载成功的软件,一般下载多次也会成功.但是如果没有下载成功.多次下载仍然是不成功.如同上面的代码.我把最下面那个中断函数改成查询后.下载就能成功.如果用中断方式.下载多次了,没有成功过一次.
版主如果你有条件的话可试试看(XP操作系统). |
|
|
|
|
|
- UID
- 117527
- 性别
- 男
|
2000,98我都用过自制的工具很稳定的,XP没试过 |
|
|
|
|
|
- UID
- 108548
- 性别
- 男
|
应该是成功的吧,你把原理图给我看下,你的接法可能有问题
PTB4=0时候应该是14400BPS。ptb4=1时是7200
你可以重新DOWN下软件,PROG08SZ,都可以做到的。
我在XP下用过烧写过GZ16,没问题的 |
签名:
最多300字节
文字将出现在您发表的文章的结尾处。体现您的个性。 |
|
|
|
|
|