搜索
bottom↓
回复: 7

发现一个奇怪的问题winavr的串口接收中断不工作,寄存器.....

[复制链接]

出0入0汤圆

发表于 2013-10-20 01:10:16 | 显示全部楼层 |阅读模式
本帖最后由 ohha3026 于 2013-10-20 01:13 编辑

写了一个Atmega16A 的串口程序发现了一个问题把我折磨了一天
情况是这样我想做一个程序 M16串口接收一个unchar 产生一个串口接收中断 在中断里再把接受的数据经串口发送出去
我在avr studio+winavr 写出来了编译也通过了就是中断不正常工作,基本就不产生中断
后来我在iccavr下写了同样的程序就是改了一下中断 其他配置完全一样 iccavr编出来的就能正常工作达到效果
这到底是为什么呢难道我串口接收中断写的不规范
百思不得其解 难道是编译器的问题不是我程序的问题?
下面贴上在两个编译环境下的所有代码


这是avr studio+winavr 下的红字体(可以通过编译但是达不到预期效果不产生接收中断)
#include <avr/io.h>
#define unchar unsigned char
unchar a=0;
void USART_send(unchar data)
{
while(!(UCSRA&(1<<UDRE)))
{;}
UDR=data;
}



void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = (1<<URSEL) | 0x06;
UBRRL = 0x4D; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}


//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
//CLI(); //disable all interrupts
asm("cli");
port_init();
uart0_init();

MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x00; //timer interrupt sources
//SEI(); //re-enable interrupts
asm("sei");

//all peripherals are now initialized
}

//
void main(void)
{
init_devices();
//insert your functional code here...
DDRA  = 0xff;
PORTA = 0xFF;

while(1){;}
}

SIGNAL(SIG_USART_RECV)
{
    a=UDR;
      UDR=a;
PORTA=a;
  
}


再下面是iccavr下的所有代码 绿色(可以通过编译并达到预期效果产生接收中断)
//ICC-AVR application builder : 2013/10/19 23:32:07
// Target : M16
// Crystal: 12.000Mhz

#include <iom16v.h>
#include <macros.h>
unsigned char a=0;
void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x4D; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}

#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
//uart has received a character in UDR
  a=UDR;
UDR=a;
PORTA=a;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();

MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

//
void main(void)
{
init_devices();
//insert your functional code here...
DDRA=0xff;
PORTA=0xff;
while(1){;}
}



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

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

出0入0汤圆

 楼主| 发表于 2013-10-20 10:53:05 | 显示全部楼层
本帖最后由 ohha3026 于 2013-10-20 10:56 编辑

调了优化还是不行

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-10-20 10:54:22 | 显示全部楼层
本帖最后由 ohha3026 于 2013-10-20 10:56 编辑

以警后人 不要怀疑你的程序
太坑了

出0入0汤圆

发表于 2013-10-20 11:14:59 | 显示全部楼层
串口操作很奇怪啊。我也遇到一个问题,有关串口接收的问题,我发觉每次接收完毕后,必须发送一次,也就是要网UDR中写一个字节,要不然下一次接收就不能成功。

出0入0汤圆

发表于 2013-10-20 12:03:05 | 显示全部楼层
为什么我都没有你说的这种情况呢?

出0入0汤圆

 楼主| 发表于 2013-10-20 13:09:29 | 显示全部楼层
huangjiyue 发表于 2013-10-20 12:03
为什么我都没有你说的这种情况呢?

你的as版本及winavr版本多少啊?我怀疑我的软件有问题

出0入0汤圆

发表于 2013-10-20 14:20:24 | 显示全部楼层
ohha3026 发表于 2013-10-20 13:09
你的as版本及winavr版本多少啊?我怀疑我的软件有问题

avrstudio sp4.13   winavr20090313

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 00:23

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

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