用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)
{
}
}
|