|
请问ATmega128单片机的两个串口USART0和USART1使用有区别么?
[复制链接]
一段串口中断收发程序 希望串口收到一个字节后判断是否是空(0x00) 如果是空(0x00)通过串口返回0xFF 否则返回收到的数字。 在USART0上运行正确无误
将程序中所有的“0”改为“1”(中断向量号也改了) 改到串口USART1上运行 无论输入什么却只能返回“0xFF”
请问是什么原因?两个串口的使用有区别么?烧程序用的是AVR studio, 选择 Fuses时没有使用ATmega103 兼容模式
(我设置了IO口的输入输出方向和上拉电阻,发现没什么影响)
/*****************串口初始化*********************************/ void usart0_init(void) { UCSR0B = 0x00; //禁止发送和接收 UCSR0A = 0x00; //倍速异步模式USX0=1 UCSR0C = 0x06; //0000 0110,UCSZ01=1,UCSZ00=1;8位字符,1位停止位 UBRR0L = 23; //若为正常异步模式USX0=0则位(Crystal/16/(Baud+1))%256 UBRR0H = 0x00; //参见ATMAGE128使用手册 UCSR0B = 0xD8 ; //允许发送和接收,接收和发送结束中断使能 } /****************中断接收服务处理子程序*******************************/ #pragma interrupt_handler usart0_RX_interrupt:iv_USART0_RX // 19 void usart0_RX_interrupt(void) { UCSR0B=0x00; //禁止发送和接收 data_temp = UDR0; //从数据缓冲器中接收数据 UCSR0B = 0xD8 ; //允许发送和接收,接收和发送结束中断使能 if(data_temp==0x00) //如果接收到的字符为'0' UDR0 = 0xff; //将数据data放入缓冲器,发送数据 else UDR0 = data_temp; //否则将接收到的数据返回 } /*********************中断发送服务处理子程序**************************/ #pragma interrupt_handler usart0_TX_interrupt:iv_USART0_TX // 21 void usart0_TX_interrupt(void) { _NOP(); UCSR0A |= (1<<6); //发送结束清零 } /*******************主程序****************************/ void main(void) { CLI(); //总中断禁止 init_devices(); SEI(); //总中断允许
while(1) //循环等待中断处理 { } }
[ 本帖最后由 godjohsn 于 2011-7-11 23:00 编辑 ]
|
|