打印
[AVR单片机]

中断程序不知道哪的问题,大神帮忙看一下

[复制链接]
1049|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fdh1227918|  楼主 | 2015-7-15 11:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
中断程序不知道哪的问题,接受中断后往上位机发一个指令,可是上位机总会遗漏一到两个指令,还有时候会往上位机发一些乱码
#include <string.h>
#include <stdio.h>
#define         F_CPU        16000000                // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行
#include <util/delay.h>
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/iom128.h>
#include <avr/interrupt.h>           //中断信号头文件
#include "Config.h"
#include <util/delay.h>




//***********************************************************************
//                        定义变量区
//***********************************************************************
unsigned int  tx_count=200,tx_flag=0xff,data=0x03,data1=0x05,data2=0x06;
static unsigned char A1,A2,A3;                                 
unsigned char usart_rx_data=0xff;

void watchdog(void)
{  

WDTCR=0x1F; //使能watchdog,并且,采用2048K分频,典型溢出时间5V时1.9S
WDTCR=0x0F; //使能watchdog,并且,采用2048K分频,典型溢出时间5V时1.9S  
}



//***********************************************************************
//                        IO端口初始化
//***********************************************************************

void system_init()
{
       

        KEYPort=0x02;                                               //PD1设置为输入,打开上拉

        KEYDDR=0xFD;                                                //设置为输入,PD1上拉电阻使能有效
}



//*************************************************************************
//                        中断初始化设置
//*************************************************************************
void interrupt_init()
{

  EIMSK|=0x03;                                             //使能外部中断0和外部中断1

  EICRA=0x0F;                                             //下降沿触发方式

  MCUCSR=0x00;                                            //控制和状态寄存器初始化

}

//*************************************************************************
//           中断服务子程序
//*************************************************************************

ISR(INT0_vect)                                                           //中断0服务程序
{

}


ISR(INT1_vect)                                                           //中断1服务程序
{

Send_SingleChar(data);

}





void usart_init()
{
  UCSR0A=0x00;                                 //单倍速模式
  
  UCSR0B=0x98;                                 //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式                              
  
  UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);              //写UCSRC寄存器,异步通信无校验,8位数据1位停止位
  
  UBRR0H=baud_h;                               //写波特率的值
  
  UBRR0L=baud_l;
}

//*************************************************************************
//                数据处理函数
//*************************************************************************
void data_do(uchar temp_d)
{
     uchar A2t;
     
         A1=temp_d/100;                                 //分出百,十,和个位
     
         A2t=temp_d%100;
     
         A2=A2t/10;
     
         A3=A2t%10;
}

//*************************************************************************
//                串口相关中断服务子程序
//*************************************************************************
                                     //数据发送结束中断向量
SIGNAL(SIG_USART0_TRANS)             //中断服务程序
{
   delay_ms(10);                            //相关操作
}

                                    //数据接收结束中断向量
SIGNAL(SIG_USART0_RECV)             //中断服务程序
{
    usart_rx_data=UDR0;             //将接收到的数据取出
        Send_SingleChar(usart_rx_data); //接收到的数据再发回电脑,显示在串口调试助手上
}
                                    //数据寄存器空中断向量

void Send_SingleChar(uchar usart_tx_data)
{
        while(!(UCSR0A&(1<<UDRE0)));                //等待发送寄存器空

        UDR0=usart_tx_data;                                        //写入发送数据

        while(!(UCSR0A&(1<<TXC0)));                        //等待发送完毕

        UCSR0A|=(1<<TXC0);

}

int main(void)
{
  



  watchdog();
  usart_init();
  system_init();                               //系统初始化

  interrupt_init();                            //中断配置初始化

  SREG|=0x80;                                  //开启全局中断
  unsigned int j;
  for(j=0;j<3;j++)
                {
               
                asm("wdr"); //喂狗,避免发生看门狗复位
       Send_SingleChar(data2);
            }
  
  while(1)
  {    unsigned int i,j;
        for(i=0;i<10;i++)
                {
                delay_ms(1000);
                asm("wdr"); //喂狗,避免发生看门狗复位
       Send_SingleChar(data1);
            }
                delay_ms(2000);

  }
}





















相关帖子

沙发
fdh1227918|  楼主 | 2015-7-15 14:36 | 只看该作者
求大神啊    没人知道么?:':'(:'(

使用特权

评论回复
板凳
airwill| | 2015-7-15 18:59 | 只看该作者
大体看了一下, 我觉得是协议缺陷引起的.
最好设计个完整的数据包格式, 如果不知道怎么弄, 可以参考一下 modbus 协议.

使用特权

评论回复
地板
SD10A| | 2015-7-15 19:19 | 只看该作者
#define         F_CPU        16000000UL

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝