M32实验中的怪事!什么原因?
一.用CVAVR编写了以下一程序:仿真和实验正常!#include <mega32.h>
unsigned int i;
//========================================
voidmain(void)
{
PORTA=0xff;
DDRA= 0xff;//0-4 3cd 5-7 ds1302
TCNT0=0x83;
TCCR0=0x03; //64分频
TIMSK|=0x01; //启动T0
SREG=0x80; //开全局中断
while(1)
{
}
}
//**************T/C0中断服务子函数*************
interrupt void timer0_ovf_isr(void)
{
TCNT0=0x83; //1ms 定时初值
if(++i>500){i=0; PORTA=~PORTA;}
}
二.改用iccavr,编译通过,确发现仿真和实验不正常.
#include"iom32v.h"
unsigned int i;
//========================================
voidmain(void)
{
PORTA=0xff;
DDRA= 0xff;//0-4 3cd 5-7 ds1302
TCNT0=0x83;
TCCR0=0x03; //64分频
TIMSK|=0x01; //启动T0
SREG=0x80; //开全局中断
while(1)
{
}
}
//**************T/C0中断服务子函数*************
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0=0x83; //1ms 定时初值
if(++i>500){i=0; PORTA=~PORTA;}
}
三.将上面的文件改成atmega16仿真实验正常了.
#include"iom16v.h"
unsigned int i;
//========================================
voidmain(void)
{
PORTA=0xff;
DDRA= 0xff;//0-4 3cd 5-7 ds1302
TCNT0=0x83;
TCCR0=0x03; //64分频
TIMSK|=0x01; //启动T0
SREG=0x80; //开全局中断
while(1)
{
}
}
//**************T/C0中断服务子函数*************
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0=0x83; //1ms 定时初值
if(++i>500){i=0; PORTA=~PORTA;}
} 说明 ICCAVR 编译器用的是 V6.31A. 以前用在M8和M16均没发现问题.
在中断服务子函数中能被更改的全局变量都需要加上 Volatile 描述。 alias 发表于 2014-6-8 14:36
在中断服务子函数中能被更改的全局变量都需要加上 Volatile 描述。
谢回复!
不过感觉还是编译器的问题!因为同一个编译器,同一程序,M16就没什么问题.M32只要开全局中断就出问题. >>不过感觉还是编译器的问题!
你就如何应付或解决这问题毫无头绪。什么是「感觉还是编译器的问题」?
参照我的提义,如果编译后还有问题,就继续找。如果问题解决,那就是你本人水平的问题。这不是找女友,不能靠感觉的。 alias 发表于 2014-6-8 17:31
>>不过感觉还是编译器的问题!
你就如何应付或解决这问题毫无头绪。什么是「感觉还是编译器的问题」?
谢回复!
参阅利用icc向导功能产生的程序,一切OK1
页:
[1]