打印
[AVR单片机]

tiny13A中断内变量真成“变量”了,什么原因呢?

[复制链接]
844|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yarnn|  楼主 | 2015-12-26 11:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用tiny13按键中断处理程序时发现一个奇的现像,至今没想通什么原因,
程序很简单,按下键,将变量ktime清零,同时关闭外部中断,退出中断,松开键时再进入中断,再来检测ktime,结果测试发现,ktime这个量不定,居然在不断变货,把这个值写入EEPROM,再读出来,什么7E,4F,23……,郁闷了,明明其它地方没有对该值操作,怎么会自己变化呢?难道是RAM溢出?
哪位大侠指点一下,程序如下:

#include <iot13Av.h>
#include <avrdef.h>
#define uint unsigned int
#define uchar unsigned char
volatile uchar ktime;
volatile uchar set2;

   void pwm_int(void)
{
TCCR0A=0X83;//quake pwm
TCCR0B=0X84;//ocs/256
OCR0A=10;
//OCR0B=0XF0;
//TIMSK0|=(1<<TOIE0);//(1<<OCIE0B)|

}
void port_int(void)
{

MCUCR|=BIT(0);//任意变动中断
GIMSK=0X40;//引脚变化中断】
PCMSK=0X02;

}
#pragma interrupt_handler pcint_isr:2
void pcint_isr(void)
{ CLI();
   if ((PINB&0x02)==0)
   {
     PORTB&=~BIT(2);
    ktime=0;
        //ktime=adbiao;
         // GIMSK=0X00;
         eeprom_w(1,ktime);
       
   }
else
   {  
     if(ktime!=0)
         {PORTB|=BIT(2);
      //if ((ktime+170)<adbiao)set2-=5;
      //else set2+=5;
          eeprom_w(2,ktime);
         }
         else
         {
        // if (170<(~ktime+adbiao))set2-=5;
        // else set2+=5;
        PORTB&=~BIT(2);
         }
   GIMSK=0X40;
   ktime=0;
  
   }
SEI();
}
void eeprom_w(uint dres,uint dt)
{CLI();
while (EECR&(1<<EEWE));
EEAR=dres;
EEDR=dt;
EECR|=(1<<EEMWE);
EECR|=(1<<EEWE);
SEI();
}
void main(void)
{
ktime=0;

DDRB=0x05;//012out 345in
PORTB=0X00;//pb1 hi 02345 lo
port_int();
pwm_int();
//ad_int();
SEI();

while(1)
  {
   
  }
}

相关帖子

沙发
guanzhikun| | 2015-12-28 10:46 | 只看该作者
我想问的是你的按键有消抖吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

29

帖子

0

粉丝