plaman801123 发表于 2012-7-2 21:29:38

Atmega128加电后进不去串口接收中断,重新复位后正常

最近调试Atmega128时,发现一个奇怪的问题。系统加电后,单片机进不去串口接收中断,但是可以发送串口数据,IO口控制继电器也是正常的,用镊子短接RST和地后,单片机便可以进入串口接收中断了。复位管脚接了上拉的10K电阻,和0.1UF的下拉。请大家解答以下,不胜感激。

wujiaodalou911 发表于 2012-7-2 23:32:11

我也是新手啊:复位后程序应该不会执行,怎么还会进入中断。方便把电路图和代码贴上来不。你是怎么知道进入中断程序的。寄存器设置的可以吗,atmega128有一个兼容103的,我原来写过一个程序把兼容103使能了,程序就运行错了,你可以看看熔丝位。最好把电路和程序贴过来。

BBC 发表于 2012-7-2 23:39:24

试试改变熔丝里BOD的设置?

jumboee 发表于 2012-10-30 17:29:43

有没有解决啊???

qwermhb 发表于 2012-10-30 17:43:28

两眼一抹黑啊

lkyangzheng 发表于 2012-10-30 21:09:03

你这么讲,谁明白啊。没程序没真相啊。

司马朝阳007 发表于 2012-11-3 17:31:02

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}

plaman801123 发表于 2012-11-4 13:03:24

框架是用CVAVR生成的,现象为上电复位后,芯片可以工作,比如发送串口数据。但是进不去接收中断,如果用ISP下载器重新下载程序或者进行其他操作后,芯片相当于重新
复位,软件就可以进入接收中断。现在不明白,是硬件问题还是软件问题。
1、硬件采用AVR内部复位电路。
#include <mega64.h>
#include<delay.h>
#include<stdio.h>
// I2C Bus functions
#asm
   .equ __i2c_port=0x12 ;PORTD
   .equ __sda_bit=7
   .equ __scl_bit=6
#endasm
#include <i2c.h>

// PCF8583 Real Time Clock functions
#include <pcf8583.h>

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

#define Setbit(x,y) x=x|(1<<y)

#define Clrbit(x,y) x=x&(~(1<<y))
void putchar1(char c);

void AnalysisCommand();


// USART1 Receiver buffer
#define RX_BUFFER_SIZE1 8
volatile char rx_buffer1;

#if RX_BUFFER_SIZE1<256
unsigned char rx_wr_index1,rx_rd_index1,rx_counter1;
#else
unsigned int rx_wr_index1,rx_rd_index1,rx_counter1;
#endif

// This flag is set on USART1 Receiver buffer overflow
bit rx_buffer_overflow1;

// USART1 Receiver interrupt service routine
interrupt void usart1_rx_isr(void)
{
char status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer1=data;
   if (++rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
   if (++rx_counter1 == RX_BUFFER_SIZE1)
      {
      rx_counter1=0;
      rx_buffer_overflow1=1;

      };
   };
}

// Get a character from the USART1 Receiver buffer
#pragma used+
char getchar1(void)
{
char data;
while (rx_counter1==0);
data=rx_buffer1;
if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
#asm("cli")
--rx_counter1;
#asm("sei")
return data;
}
#pragma used-
// Write a character to the USART1 Transmitter
#pragma used+
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}

voidAnalysisCommand()            //命令分析,完成系统设置或者继电器控制。
{
   
      if ((rx_buffer1==0x0A)&&(rx_buffer1==0x7F))
      
            switch (rx_buffer1)
            
            {
            case 1:   //获取系统时间,发送至主机
                  rtc_get_time(0,&h,&m,&s,&hs);
                  rtc_get_date(0,&date,&month,&year);
                  rx_buffer1 = 0xA0;
                  rx_buffer1= year;
                  rx_buffer1 = month;
                  rx_buffer1 = date;
                  rx_buffer1 = h;
                  rx_buffer1 = m;
                  rx_buffer1 = 0x7F;
                  for(SendCount=0;SendCount<8;SendCount++)
                  {
                        putchar1(rx_buffer1);
                  }
                  break;
            
            case 2://设置系统时间
                  
                  
                   year=rx_buffer1;
                   month=rx_buffer1;
                   date=rx_buffer1;
                   h=rx_buffer1;
                   m=rx_buffer1;
                   rtc_set_date(0, date, month,year);
                   rtc_set_time(0, h, m, 0, 0);
                   rx_buffer1 = 0xA0;
                   rx_buffer1 = 0x7F;
                                           for(SendCount=0;SendCount<8;SendCount++)
                   {
                        putchar1(rx_buffer1);
                   }
                   break;
       
            
            case 5: //获取继电器的状态信息,确定是打开还是关闭
                      GetSW_Status();
                            break;
            case 6: //判断打开哪路继电器
                  SwitchCommand=rx_buffer1;
                            OpenSW();
                            break;
            case 9: //获取开关量的状态信息
                  GetAlarmInfo();
                            break;
            default:break;
            }
                  
            
            
            
      

}

jaarm 发表于 2012-12-3 11:34:13

Atmega128串口接收中断,现在解决没有?
页: [1]
查看完整版本: Atmega128加电后进不去串口接收中断,重新复位后正常