请教马老师,关于can128的twi中断编译出现的错误提示问题!
在编辑中只要使用了#pragma interrupt_handler TWI_isr:iv_TWI就会出现以下错误,请问是怎么回事?我用的是iccavr6.31a,芯片选择atmega128/can128
!E debug.o(79): Code address 0x8e already contains a value
!E debug.o(79): Code address 0x8f already contains a value
!E debug.o(81): Code address 0x8c already contains a value
!E debug.o(93): Code address 0x8c already contains a value
以下是源程序
#include <ioCAN128v.h>
#include <macros.h>
unsigned char T0=0;
// 延时子程序
void delay (int time)//0.25*(7*ticks+18)us for 4MHz
{
while(time--)WDR();//喂狗;
}
//定时器1初始化
void InitT1(void)
{
TCCR1A=0x00;
TCCR1B=0x03;//set T1's clock=CK/64,8uS 4MHz
//1,2,3,4,5分别为1,8,64,256,1024分频6,7由T0引入,下降沿/上升沿触发
TIMSK1|=(1<<TOIE1);//T1中断使能
TCNT1=64285;//加1250则溢出
}
#pragma interrupt_handler TWI_isr:iv_TWI
void TWI_isr(void)
{
WDR();
}
//T1中断
#pragma interrupt_handler T1IntServer:iv_TIMER1_OVF
void T1IntServer(void)//0.01s%0
{
TCNT1=64285;//加1250则溢出
T0++;//定时器T0计时器,用于闪灯时间定时
}
//初始化硬件子程序
void InitDevicd(void)
{
DDRD=0XFF;
}
//运行处理程序
void RunProcess(void)
{
if(T0>50)//0.5s后变换输出
{
T0=0;//定时器T0计时器,用于闪灯时间定时
DDRD^=0XFF;
}
}
//主函数
void main(void)
{
InitDevicd();//初始化硬件子程序
InitT1();//初始化定时器1
WDTCR=0x1f; //看门狗定时器为2048K周期(每周期为1uS),共2.1s
SEI();//enable interrupts=> enable UART interrupts
while(1)
{
RunProcess();//运行处理程序
}
} !E debug.o(79): Code address 0x8e already contains a value
!E debug.o(79): Code address 0x8f already contains a value
!E debug.o(81): Code address 0x8c already contains a value
!E debug.o(93): Code address 0x8c already contains a value
这里不是有提示的吗? 但是这个地方究竟是什么东西占据了呢?
如果我把这个中断去掉就不会了。 你用的是ICC吧?
首先,你确认你的版本已经破解了。(你的问题可能不在这里)
其次,确认你在Compiler Option里面选择了正确的芯片型号。 79,81,93处是什么语句? 马老师的问题提醒了我,好像你的错误提示,不是成串而连续的。——姜还是老的辣哈
我也想知道“9,81,93处是什么语句? ” 作者自己删除掉. 其实我也很想知道究竟里面是什么东西,但是不知道在debug.o里面怎么看,没研究过 现在的程序已经最简,芯片选择atmega128/can128,其余的都是默认的,编译时还是出现以下错误,不知道究竟是什么东西占据了这个区域。我以为你们研究毕竟深入,所以提问,谢谢回答。
以下是我的程序,希望碰到过的朋友知会一下,非常感谢!
其实在can128中不止是TWI中断会出现类似的错误,还有最后几个中断都是这样,只要将下面的中断向量更改就会出现类似的错误。
#include <ioCAN128v.h>
#include <macros.h>
#pragma interrupt_handler TWI_isr:iv_TWI
void TWI_isr(void)
{
WDR();
}
//主函数
void main(void)
{
DDRD=0XFF;
SEI();//
while(1)
{
;
}
} 正好我的系统中也有ICC6.31a,所以帮你试了一下.问题确实存在,应该是ICC 6.31.A的BUG.ICC最新版为7.x的.
测试下来,是CAN128的中断36,37出问题.问题是M128本身中断到35.34是TWI中断.而M128CAN比M128多了两个中断:36(TWI)和37.
但编译系统还是按M128生成代码,在35号中断向量后面的FLASH中,从0X8C开始放入初始化代码.
而M128CAN的36号中断向量为 8C 8D 8E 8F,37号中断向量为 90 91 92 93.所以当你使用中断36和37时,编译报错,说8C 8D 8E 8F处已经有代码了.
帮你查了ICC的更新日志:
V7.00C - May 3rd, 2005
Under some conditions, the command line compiler was not licensed.
IDE
- network dongle DLL was incorrect
- starting address for CAN128 was incorrect =============================>>这里!!
Compiler
- obscure register allocation bug may cause some programs to fail
- When generating ISR save/restore sequence, the compiler was incorrectly
not save/restore R0/R1 some times for reading flash 16 bit variables
for enhanced mode targets (e.g. M128 and other newer Megas).
可见,在ICC的7.00C版,修正了这个错误.
解决方案:
1.使用更新版的ICC
2.如果不使用CAN的功能,换M128
3.换个编译系统,如CVAVR,iar等.如我现在使用的CVAVR1.25.8支持AT90CAN128.
另外,你这种情况同上面6楼我讲的有区别,抱歉了. 非常感谢马潮老师,我其实也在网上查到了类似的东西,就是不知道如何修正,以为是可以将就用的,看来这回是非换编译环境不可了! 如果系统中不使用36,37中断,可以将就使用. 其实我是在业余学习用的,现在买了片can128,想玩玩can,而且用了一片eeprom,想趁机一起用一下
我已经在网上找到了icc7的破解版软件,已经编译过去了
谢谢马老师! 一起跟着学习到了。can128没有用过……看了这个帖子,以后会更加注意了……
页:
[1]