请老马潮老师有关UART通信问题
///////用于DMX512接受程序///#include<mega32.h>
#include<delay.h>
#define uchar unsigned char
#define uint unsigned int
#define RXC 7
#define REEN 4
#define UCSZ1 2
#define UCSZ0 1
#define USBS3
#define RXICE 7
#define URSEL 7
void uart_init()
{
UCSRA=0X00;
UCSRB=((1<<RXICE)|(1<<RXEN)); //允许接受中断
UCSRC=((1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)); //波特率250K,1起始位,8位数据位,2位停止位 (8MHZ)
UBBRH=0X00;
UBBRL=0X01;
}
interupt void uart_rc(void)
{
uchar status,data;
status=UCSRA;
data=UDR; //执行这条语句后RXC不自动清零?????????
//........还有部分程序
}
问题1: 我在设置UCSRC时URSEL、UCSZ1、UCSZ0 都没有成功的设置成1;这个是在仿真调试(AVR STDIL4)的时候看到的
DATASHEET中这样说的:“"寄存器UBRRH 与寄存器UCSRC 共用I/O 地址。因此访问该地址时需注意以下问题。
当在该地址执行写访问时,寄存器选择位(URSEL) 控制被写入的寄存器。若
URSEL 为0,对UBRRH 值更新; 若 URSEL 为1,对UCSRC 设置更新。”这样看来M32默认是读
UBRRH,只有先设置URSEL 为1才能写UCSRC
问题2:data=UDR; //执行这条语句后RXC不自动清零
DATASHEET中这样说的:接受缓冲器的数据读出(刷新)或屏蔽接受中断时RXC自动清零,如果不清零下一次中断再发生,且会产生溢出为断标志.
这个问题困扰我好多天了,请你帮忙分析下什么原因!谢谢!!! 软件模拟功能,并不能模拟全部的功能,请查看AVR STUDIO的书册.
实际当中,执行了DTAT = UDR,中断标志肯定会自动清除的. 我是硬件仿真。 如果你怀疑AVR的USART有问题,我也不好说什么.USART我用的多了,而且都是采用中断方式发送和接受的.没有出过问题.
另外,我不使用硬件仿真. 谢谢!问题已解决! 问题解决是好事.
最好还是希望能将问题出在什么地方,如何解决的介绍一下.这样就可以让其他人学习,或少走弯路. 我也出现接受不了数据的问题
#include "../brd.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#define uchar volatile unsigned char
uchar flag=0;
intrdata=0;
void uart_sendB(int data)
{
while(!(UCSRA&(1<<UDRE)));
UDR=data;
while(!(UCSRA&(1<<TXC)));
UCSRA|=TXC;
}
int main(void)
{
unsigned int baud=9600;
UCSRC=(1<<URSEL)|(3<<UCSZ0);//ASYN,8 BIT DATA,NO PARITY,1 STOP BIT ,NO DOUBLE SPEED;
UBRRL=(F_CPU/baud/16-1)%256;
UBRRH=(F_CPU/baud/16-1)/256;
UCSRA=0X00;
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
SREG|=0x80; //全局中断开放
DDRD=0X02;
while(!(UCSRA&(1<<RXC)));
rdata=UDR;
uart_sendB(rdata);
}
uart_sendB(rdata);这个函数没问题我试过
可是就是接受不了数据。
马老师能否指点一下那,这个程序那里的问题。
先谢谢了 在我的教程中,使用了2章的篇幅介绍UART的原理与应用(同事刘老师已经说了,那有用2章的篇幅介绍一个功能的),可见我对UART的重视.其实,学习掌握UART不仅在于它是常用的通信接口,更深的意义在于为学习掌握更复杂的通信体系和协议打好基础.因此建议你能仔细看看,参考一下.
页:
[1]