davecater 发表于 2008-5-19 20:01:03

请老马潮老师有关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自动清零,如果不清零下一次中断再发生,且会产生溢出为断标志.
这个问题困扰我好多天了,请你帮忙分析下什么原因!谢谢!!!

machao 发表于 2008-5-20 18:10:07

软件模拟功能,并不能模拟全部的功能,请查看AVR STUDIO的书册.

实际当中,执行了DTAT = UDR,中断标志肯定会自动清除的.

davecater 发表于 2008-5-20 19:30:52

我是硬件仿真。

machao 发表于 2008-5-20 21:04:36

如果你怀疑AVR的USART有问题,我也不好说什么.USART我用的多了,而且都是采用中断方式发送和接受的.没有出过问题.

另外,我不使用硬件仿真.

davecater 发表于 2008-5-25 20:29:55

谢谢!问题已解决!

machao 发表于 2008-5-25 22:40:41

问题解决是好事.

最好还是希望能将问题出在什么地方,如何解决的介绍一下.这样就可以让其他人学习,或少走弯路.

hshs 发表于 2008-6-4 15:19:37

我也出现接受不了数据的问题
#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);这个函数没问题我试过
可是就是接受不了数据。
马老师能否指点一下那,这个程序那里的问题。
先谢谢了

machao 发表于 2008-6-4 18:53:32

在我的教程中,使用了2章的篇幅介绍UART的原理与应用(同事刘老师已经说了,那有用2章的篇幅介绍一个功能的),可见我对UART的重视.其实,学习掌握UART不仅在于它是常用的通信接口,更深的意义在于为学习掌握更复杂的通信体系和协议打好基础.因此建议你能仔细看看,参考一下.
页: [1]
查看完整版本: 请老马潮老师有关UART通信问题