这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ATMEGA8 ATMEGA8发送串口数据不正确,急救!请帮我看看程序,谢谢!

共2条 1/1 1 跳转至

ATMEGA8 ATMEGA8发送串口数据不正确,急救!请帮我看看程序,谢谢!

院士
2006-09-17 18:14:16     打赏
ATMEGA8 ATMEGA8发送串口数据不正确,急救!请帮我看看程序,谢谢!



关键词: ATMEGA8     发送     串口     数据     不正确     急救         

院士
2006-12-22 22:43:00     打赏
2楼
问 我使用ATMEGA8(内部4M),发送串口数据时总不正确,请救各位,我的设值有没有问题,谢谢!
    /*UART初始化*/    
    OSCCAL=0xff;
//    UCSRA=0xfc;               
    UBRRH=0;          
    UBRRL=51; //4800         
      //    UBRL=103;
    UCSRB=0x98;//enable UART receiver and transmitter, and receive interrupt(RXCIE)
    UCSRC=(1<<7)|(1<<2)|(1<<1);//8位数据+1位STOP位   

void CommSend(uchar data)  //串行口发送处理子程序
{
    UCSRA |= (1<<6);//TXC  
        UDR = data;
    do{} while ((UCSRA&(1<<6)) == 0);
1: UCSRA |= (1<<6);//TXC  这一句话您是用来干什么的? 2: 可以是什么原因呢,在线等!谢谢! 3: 看错了我原来用过16MHZ,1Mbps的速度,设置如下
    UBRRH = 0;
    UBRRL = 0;
    //RXC   TXC    UDRE    FE   DOR   PE   U2X    MPCM
    // 0     0      0       0    0     0    0       0   
    UCSRA = 0x00;     // Double Speed mode

    //RXCIE TXCIE   UDRIE   RXEN    TXEN    UCSZ2   RXB8    TXB8
    // 0     0       0       0       0       0       0       0   
    UCSRB = 0x98;     // Enable Receiver Complete interrupt

    //URSEL UMSEL   UMP1    UMP0    USBS    UCSZ1   UCSZ0   UCPOL
    // 1     0       0       0       0        1       1       0  
    UCSRC = 0x86;    // Set frame format: 8-bit data, 1 stop bit
没有什么问题的 4: 你试试://atmega8
//4MHz Fosc
const uchar BaudCode[]={12,25,51,103}; // 19200,9600,4800,2400 bps
...
...
...
void putchar_(uchar c)
   { while(!(UCSRA&(1<<UDRE)));
     UDR=c;   //sent data
    }

void uart_init(uchar i)
{
  UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //enable receive and send and RXD_interrupt
  
  UBRRL=BaudCode[i]; //default Baud Rate=19200 (i=0)
  UBRRH=0;    
  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //data_bit=8,stop_bit=1;
  SEI();  //开放中断位。
} 5: 波特率设置可能有问题使用内部4M,需要校准,而且不是很稳定。
按计算的波特率值误差可能较大,如果是接收正确,发送不正确,可以将波特率设置的值适当增加或减少,可能会有用。 6: 谢谢,楼上的大哥!请问怎么样对内部4M进行校准?我将波特率设置的值适当减少,果真有作用!但好象不是很踏实,请问怎么样对内部4M进行校准?    直接写OSCCAL=0xff;可以吗?还是必须用编程器写数据到FLASH?谢谢!

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]