搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2012-7-2 21:29:38 | 显示全部楼层 |阅读模式
最近调试Atmega128时,发现一个奇怪的问题。系统加电后,单片机进不去串口接收中断,但是可以发送串口数据,IO口控制继电器也是正常的,用镊子短接RST和地后,单片机便可以进入串口接收中断了。复位管脚接了上拉的10K电阻,和0.1UF的下拉。请大家解答以下,不胜感激。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

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

出0入0汤圆

发表于 2012-7-2 23:39:24 | 显示全部楼层
试试改变熔丝里BOD的设置?

出0入0汤圆

发表于 2012-10-30 17:29:43 | 显示全部楼层
有没有解决啊???

出0入0汤圆

发表于 2012-10-30 17:43:28 | 显示全部楼层
两眼一抹黑啊

出0入0汤圆

发表于 2012-10-30 21:09:03 | 显示全部楼层
你这么讲,谁明白啊。没程序没真相啊。

出0入0汤圆

发表于 2012-11-3 17:31:02 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 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[RX_BUFFER_SIZE1];

#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 [USART1_RXC] void usart1_rx_isr(void)
{
char status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer1[rx_wr_index1]=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[rx_rd_index1];
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;
}

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

}

出0入0汤圆

发表于 2012-12-3 11:34:13 | 显示全部楼层
Atmega128串口接收中断,现在解决没有?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表