打印

求助:串口中断引起的类似复位问题

[复制链接]
1643|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
adsionshm|  楼主 | 2012-12-12 20:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 adsionshm 于 2012-12-12 20:45 编辑

问题如下:
    小弟用ATMEGA64测试串口232的接受中断,连好硬件后,我在笔记本电脑上用串口助手通过USB转232串口线发送一个代码,比如十六进制的11,按照程序里的设置,理论上,我的单片机会回一个11到串口助手的界面上,但是程序却从main函数开始执行了一遍,也就是发了个FF,我在在发个22,也是回个FF,就是说还是从main函数开始执行了,这是为啥,请大侠们帮忙看看代码:
补充下:我的熔丝位设置如下:低位EF,高位D9,扩展FF

/***********************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#pragma interrupt_handler uart0_rx_isr:19


#define uchar unsigned char      //定义无符号字符为 uchar
#define uint  unsigned int       //定义无符号整型
#define Crystal 8000000   //晶振8MHZ
#define Baud 9600         //波特率
//函数声明
void port_init(void);
void usart0_init(void);
void init_devices(void);
void usart0_char_send(uchar i);
void usart0_str_send(uchar *s);
uchar usart0_char_receive(void);
void uart0_rx_isr(void);
//void ReceiveData_deal(void);
void JudgeLED(void);
uint j;
uchar Receive_data;
uchar flag=0;
/******************端口初始化*******************************/
void port_init(void)
{
/*配置PORTA的输入 输出  
        初始状态:
        PORTA  输入端口 并且输出高电平         按键                        
        */
        PORTA = 0xFF;
        DDRA = 0x00;

        /*配置PORTC
        初始状态:
        PORTC 配置为输出,输出高电平
        */
        PORTC = 0xFF;//
        DDRC = 0xFF;//


        /*配置PORTD状态为 输入ru
        */
    PORTD = 0x00;   //设置RXD1和TXD1
    DDRD  = 0x88;   //配置PD3(TXD1)为输出,RXD1为输入
   
    PORTE = 0x00;   //设置RXD0和TXD0
    DDRE  = 0x02;   //配置PE1(TXD0)为输出,RXD0为输入      
   
    DDRF=0XFF; //F口配置为输出,初始高电平,按键
    PORTF=0XFF;

}
/*****************串口初始化********uart0*************************/
void usart0_init(void)
{
   UCSR0B = 0x00;                     //禁止发送和接收
// UCSR0A = 0x02;                     //倍速异步模式USX=1
   UCSR0A = 0X00;
   UCSR0C = 0x06;                     //0000 0110,UCSZ1=1,UCSZ0=1
  // UCSR0C = (1<<URSE0L) | 0x06;
//8位字符,1位停止位
UBRR0L = 0x33;   //若为正常异步模式USX0=0则位,波特率9600
UBRR0H = 0x00;   //参见ATMAGE64使用手册
UCSR0B = 0x98;                     //允许发送和接收,0x98,接收中断和接收使能,0x18,接收使能
}
/************串口初始化*****************/
/******************初始器件****************/

/**************************************/
void init_devices(void)
{
   port_init();
   usart0_init();
   //usart1_init();
}
//****************发送一个字符******************************
void usart0_char_send(uchar i)
{
  while(!(UCSR0A&(1<<UDRE0)));
  UDR0=i;
}
/****************/

/******************发送一个字符串*************************/
void usart0_str_send(uchar *s)
{
while(*s)
{
  //usart0_char_send(*s);
  s++;
}
}
/*****************接收一个字符****************************/
uchar usart0_char_receive(void)
{
  if((UCSR0A&(1<<RXC0))) {return UDR0;} // 查询方式接收,可行
  
}
/*************************/

void uart0_rx_isr(void)
{
  SREG=0x00;
  Receive_data=UDR0;
  SREG=0x80;
}
/***************主函数*****************************/
main(void)
{
    init_devices();
     MCUCR = 0x01;
  MCUCR = 0x02;
   
  WDTCR=0x18;
  WDTCR=0x10;  //看门狗禁止
//_delay_ms(1000);
  EIMSK = 0x00;
  EICRA = 0x03;//详见datasheet的P86,P87页。
  EIFR  = 0x01;
  //EIMSK = 0x01;//使能INT0中断
  SREG = 0x80; //使能全局中断
  x1_flag=0;
  usart0_char_send(0xFF);
  
while(1)
{ };     
}

        
               

相关帖子

沙发
adsionshm|  楼主 | 2012-12-20 09:46 | 只看该作者
咋地木有高手帮我解惑捏?

使用特权

评论回复
板凳
coody| | 2012-12-20 10:09 | 只看该作者
如果使用了数组或指针,注意不要溢出

使用特权

评论回复
地板
2389676302| | 2012-12-20 15:22 | 只看该作者
这个问题还真难解决

使用特权

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

本版积分规则

1

主题

10

帖子

0

粉丝