Board logo

标题: [求助] [打印本页]

作者: arola79    时间: 2006-3-6 19:07     标题: [求助]

斑竹大人,我按您说的方法写的中断子程序编译通不过。调试器是BDM,芯片是MC9S12DG128。您说的是:#pragma CODE_SEG NON_BANKED void interrupt 8 timer0(void),抱错说断地址不对。我改为:void interrupt 8 timer0(void) 编译通过了,但好象根本没有处理这个中断服务程序。


还有您说的TN101下不下来。麻烦大侠您了!帮帮我啦


作者: strongchen    时间: 2006-3-7 11:41

你的格式不对吧?要把“#pragma CODE_SEG NON_BANKED”和“void interrupt 8 timer0(void)”分行写。
作者: arola79    时间: 2006-3-7 14:21

谢谢斑竹大人,小女子又要麻烦您了。以下程序想实现第1个和第8个LED交替亮灭,实现不了啊!!麻烦您帮看一下。
int i;
void main(void) {
DDRB=0xFF;
PORTB=0xFF; // 问题1:在启动初期没有外接共阴LED全灭的过程。
for(i=100;i>0;i--);
asm{
CLI; 问题2:C语言中是否有对A,B,CCR这些寄存器操作的指令。
}
TIOS=0x01;
TIE=0x01;
TCTL2=0x03;
TC0=0xFF00;
TSCR2=0x80;
TSCR1=0x80;
while(1){
DDRB=0x80;
PORTB=0x7F;
for(i=10;i>0;i--);
}
}
#pragma CODE_SEG NON_BANKED
void interrupt 8 Interrupt_TIMER0(void){
TFLG1=0x01;
TC0=0xFF00;
DDRB=0x01;
PORTB=0x01;
TCNT=0; // 问题3:在执行完中断服务后TCNT是否需要再清零,以便返回时再记数
for(i=10;i>0;i--);
asm{
RTI; //问题4:C语言是否需要中断返回的指令。
}
}

作者: Fetchlove    时间: 2006-3-7 20:51

我用软件仿真试了可以进入中断,你没有中断控制位置1:TIE_C0I,并且不需要RTI,看看生成的汇编就知道了
作者: arola79    时间: 2006-3-8 14:54

Fetchlove同志,你仿真过中断能返回吗?谢谢!还有我的其他问题能帮忙解答一下吗?
作者: Fetchlove    时间: 2006-3-8 17:16

不能返回,因为软件管不了硬件的信号,清除标志的命令TFLG1=0x01;
执行不了,因为对BDM还不是很了解,所以还没用硬件仿真


问题3:在执行完中断服务后TCNT是否需要再清零,以便返回时再记数
书上说不用清零,他自己会做得
问题2:C语言中是否有对A,B,CCR这些寄存器操作的指令。
当然有了,你不是已经在做了么,不过好像不是全都可以
问题1:在启动初期没有外接共阴LED全灭的过程。
没看懂,不好意思,呵呵……


作者: arola79    时间: 2006-3-8 18:21

我的标志位清了,但返回不了。一直在中断程序里循环。还有我的C里没有直接对A,B,CCR操作的。要用也是嵌汇编。还是谢谢你了!
作者: Tom-FS    时间: 2006-3-9 00:39

共阴极的LED在:
DDRB=0xFF;
PORTB=0xFF;
是可以全灭的(我试过),除非硬件有不恰当的上拉电阻.
另外有两事不明白:
1DRB有必要每次用到都要重新赋值么.是不是在开始有DDRB=0XFF,后面只要对PORTB处理就可以达到同样目的?
2:中断为什么跳不出去?

作者: arola79    时间: 2006-3-9 22:14

耽误大家时间了,原来只是延时的问题,把中断部分的延时改长,定时器周期改为半秒就好了。




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