打印

关于atmega28延时中断的请教

[复制链接]
1204|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
EmanonUnbekannt|  楼主 | 2016-2-2 00:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位前辈好,鄙人大学狗,自己跟同学在做第一个项目,就是一个红外传感器触发警报,然后通过sim900a把gps模块传回的数据发送到指定手机上,我负责的是发送短信部分。现在在中断延时部分出现了一个小问题,我先把我写的代码发出来
#include <iom128v.h>
#include <macros.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char   
#define uint  unsigned int   
#define Crystal 8000000  
#define Baud 9600

uchar data_temp;
uchar data=59;
uchar re,ok,error,comfirm=0;
unsigned int p,len,lenght=0;
uchar received[256],received1[256],receiveddata[256];
void port_init(void);
void USART0_Init(void);
void init_devices(void);
void usart0_char_send(unsigned char i);
void usart0_str_send(unsigned char *s);
unsigned char usart0_char_received();
unsigned int usart0_str_received();
void delay_(uint xms);


void message_send(void); //发送短信
void int0_int(void);
uchar s,m,h=0,flagt1=0;
void timer1_init(void);



/*******************主程序*************************/ /*加入外部触发*/
void  main(void)
{
  char ch[128];
  unsigned long int i;
  unsigned char dd=0;
  CLI();                     
  init_devices();
  PORTA=0x00;
  DDRA=0xff;
  
  PORTD=0xff;
  DDRD=0xFE;
  int0_int();
  timer1_init();
  SEI();   
  while(1)
  {                       
  if(p==1)
    {
       
        message_send();
        p=0;}
  //else
   // {delay(50);}

}


}
/****************中断******************************/
void int0_int(void)
{
EIMSK=0x00;
EICRA=0x00;
EIMSK=0x01; //int0中断允许
}
#pragma interrupt_handler int0:2
void int0()
{
if(flagt1==0)
{flagt1=1;
TIMSK|=0x10;  //OCIE1A使能
}
}
void timer1_init(void)
{

TCCR1A=0;
TCCR1B=0;
TCNT1H=0;
TCNT1L=0;
OCR1AH=0x1E;
OCR1AL=0x84; //7812
TCCR1A=0x00;  //00000010,CTC模式
TCCR1B=0x0D;  //00001101,CTC模式,1024分频,T=0.128ms
//TIMSK|=0x10;  //OCIE1A使能
TIMSK&=~(0x10);  
//0.128ms*7812=1s

}


#pragma interrupt_handler t1_ocf_isr:13
void t1_ocf_isr()
{
s++;

if(s==20)
{
  s=0;
  if(s==0)
  {PORTA=~PORTA;};
   s=0;
  p=1;
}

}

原本设计是红外模块的出发,使我这边下降沿触发进行第一个中断,然后开始定时,在第一个中断触发条件下每过20s发送一次数据,第一次20s灯泡亮,第二次灯泡灭,证明成功
然后但是现实是第一个20秒过后小灯亮,模拟串口通信正常然后再发送完数据,但是在20s后小灯接下来是不断的闪烁,亮一秒灭一秒,串口通信可以不间断发送,没有间隔。我不知道问题出现在哪里了,请各位指点一下。

相关帖子

沙发
EmanonUnbekannt|  楼主 | 2016-2-2 00:35 | 只看该作者
接下来是程序段其余部分
/******************初始器件************************************/
void init_devices(void)
{
port_init();
USART0_Init();
}
/******************端口初始化*******************************/
void port_init(void)
{
     PORTA=0X00;
         DDRA=0XFF;             //LED IO口设为输出
         DDRE=0XFE;

}

/*****************串口初始化*********************************/
void USART0_Init(void)
{
     unsigned int tmp;     
     UBRR0L=51;                        /* 设置波特率*/   
     UCSR0B = (1<<RXEN0)|(1<<TXEN0);   /* 接收器与发送器使能*/   
     UCSR0C = (1<<UCSZ00)|(1<<UCSZ01); /* 设置帧格式: 8 个数据位, 1个停止位*/
}


//****************发送一个字符******************************
void usart0_char_send(unsigned char i)  //采用查询方式,数据寄存器空中断及发送结束中断不需置位
{
while(!(UCSR0A&(1<<UDRE0))); //等待发送缓冲器为空(准备被写)
UCSR0A|=1<<UDRE0;             //写1可以清零UDRE位
UDR0=i;
while(!(UCSR0A&(1<<TXC0))) ;       //等待数据传完  
UCSR0A|=1<<TXC0;               //写1可以清零TXC位
}
/******************发送一个字符串*************************/
void usart0_str_send(unsigned char *s)
{
while(*s)
{
usart0_char_send(*s);
s++;
}
}
/*********************发送一个字符串**********************/
void usart0_str_sendArray(unsigned char *p,unsigned char len)
{
  uchar i;
  for(i=0;i<len;i++)  //控制字符个数
  {
    usart0_char_send(*p);
    p ++;
  }
}

unsigned char usart0_char_received()
{
unsigned char rdata;
while ( !(UCSR0A & (1<<RXC0)) );
rdata=UDR0;

return rdata;
  
}

unsigned int usart0_str_received()
{
int z;
unsigned int i=0;
re=0;
  while(re==0)
  {
   receiveddata[i]=usart0_char_received();
  
  if((receiveddata[i]=='>'))//判断>
    {z=1;}
  if((receiveddata[i]==0x4b)&&(receiveddata[i-1]==0x4f))//判断OK
   {  re=1;ok=1;break;}
  if((receiveddata[i]==0x52)&&(receiveddata[i-1]==0x4f)&&(receiveddata[i-2]==0x52)&&(receiveddata[i-3]==0x52)&&(receiveddata[i-4]==0x45))//判断ERROR
   {  re=1;error=1;break;}

   
  i++;
  }
re=0;

return i;


}

void delay(unsigned int t)
{int b,c,d;
for(b=0;b<t;b++)
{for(d=0;d<10;d++)
  {TCNT1H=0XE0;    //12ms
  TCNT1L=0XC0;
  TCCR1B=0b00000001;
  do{c=TIFR;}
  while(!(c&=0x04));
  TIFR&=~0X00;
  }
}
}



/****************发送信息******************************/

void message_send(void)
{
int z;
int t=0;
char ch[128];
A:delay(10);
t=t+1;
if(t>3) goto B;
else
delay(10);

usart0_str_send("AT+COPS?\r\n");
while(1)
{
lenght=0;ok=0;error=0;
lenght=usart0_str_received();
if(ok==1) break;
else if(error==1) ;
t=t+1;
if(t>3)
goto A;
else
delay(10);
}

delay(10);
usart0_str_send("AT+CMGF=1\r\n");
while(1)
{

lenght=0;ok=0;error=0;
lenght=usart0_str_received();
if(ok==1) break;
else if(error==1) ;
t=t+1;
if(t>3)
goto A;
else
delay(10);
}

delay(10);
usart0_str_send("AT+CMGS=\"18222069617\"\r\n");
while(1)
{
lenght=0;ok=0;error=0;
lenght=usart0_char_received();

if(z=1) break;
else if(error==1) ;
t=t+1;
if(t>3)
goto A;
else
delay(10);
}


delay(50);
usart0_str_send("12345");
while(1)
{
lenght=0;ok=0;error=0;
lenght=usart0_char_received();
if(z=1) break;
else if(error==1) ;
t=t+1;
if(t>3)
goto A;
else
delay(10);
}

delay(50);
delay(10);       
usart0_char_send(0x1a);
while(1)
{
lenght=0;ok=0;error=0;
lenght=usart0_str_received();
if(ok==1){ break;}
else if(error==1)
t=t+1;
if(t>3)
goto A;
else
delay(10);
}
B:delay(10);
}

使用特权

评论回复
板凳
NE5532| | 2016-2-2 16:10 | 只看该作者
1.你负责发短信部分,问的问题全都是红外检测部分的,Why?
2.问题里是延时,描述里看不到一个延时,Why?
3.你的问题是红外信号触发了以后停不下来么?

使用特权

评论回复
地板
EmanonUnbekannt|  楼主 | 2016-2-3 12:29 | 只看该作者
@NE5532
前辈您好,我负责短信模块,另外两个同学负责,红外模块以及gps模块。刚开始设计的想法是,红外触发后,通信模块所在的单片机会接受gps模块处理完后发过来的数组,最后在触发警报情况下,每经过一定时间(暂时设定20s),通过sim900a将gps数据建立数组发送到指定手机。只有红外下降沿触发,我这块才能工作。
在描述部分没说延时是我的失误,在此先报歉。延时是设计用于第一次中断触发后每过一定相同时间,赋予p=1,
在主程序中如果p==1,就给手机发短信,并且不断经过设定时间循环(如在发完短信20s后再次发送),直到第一个中断结束,不再报警。
如果程序正确,现实效果是,触发警报xs后,小灯亮,发送短信。在结束发送短信后再经过20s,小灯灭,再次发送,以此为循环,直到不再触发警报。
而我的问题是,我在模拟串口的时候,第一个循环周期正常,而到第二个周期,小灯开始两秒为周期在闪。我曾询问过我的指导老师,她说是延时的问题,然而我们俩都没发现延时哪里出问题了,所以在此请教,谢谢

使用特权

评论回复
5
NE5532| | 2016-2-3 15:27 | 只看该作者
你的中断是“下降沿中断”,中断的结束是如何定义的?我理解你的描述是,第一次20秒延时以后,延时的周期变成了2秒,请检查
1.定时器是否重载,如果有相关的软件计时计数器是否重置?
2.中断标志是否记得处理了?
3.下降沿中断没有结束的说法,因为其只存在于一个“瞬间”,请检查是否此处策略有问题。

使用特权

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

本版积分规则

1

主题

3

帖子

1

粉丝