njfwx 发表于 2014-6-8 11:42:16

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;}                        
}

njfwx 发表于 2014-6-8 12:06:42

说明      ICCAVR 编译器用的是 V6.31A. 以前用在M8和M16均没发现问题.

      

alias 发表于 2014-6-8 14:36:38

在中断服务子函数中能被更改的全局变量都需要加上 Volatile 描述。

njfwx 发表于 2014-6-8 16:39:51

alias 发表于 2014-6-8 14:36
在中断服务子函数中能被更改的全局变量都需要加上 Volatile 描述。

   
                  谢回复!

               不过感觉还是编译器的问题!因为同一个编译器,同一程序,M16就没什么问题.M32只要开全局中断就出问题.

alias 发表于 2014-6-8 17:31:25

>>不过感觉还是编译器的问题!

你就如何应付或解决这问题毫无头绪。什么是「感觉还是编译器的问题」?

参照我的提义,如果编译后还有问题,就继续找。如果问题解决,那就是你本人水平的问题。这不是找女友,不能靠感觉的。

njfwx 发表于 2014-6-8 20:35:44

alias 发表于 2014-6-8 17:31
>>不过感觉还是编译器的问题!

你就如何应付或解决这问题毫无头绪。什么是「感觉还是编译器的问题」?


         
               谢回复!

               参阅利用icc向导功能产生的程序,一切OK1
页: [1]
查看完整版本: M32实验中的怪事!什么原因?