cgc_good 发表于 2013-6-22 21:10:32

AVR 串口与模拟串口问题

本帖最后由 cgc_good 于 2013-6-22 21:16 编辑

1,ATMEGA 自带串口,内部RC 8M,38400,非常准。
2,ATTINY 38.4K定时器频率中断,26us,示波器实测达不到这个精度,总结原因是晶振精度问题。换11.0592M可以解决。换外部8M晶振同样问题。把晶振频率设置成8比不分频要准些,这个也可以理解,把晶振误差缩小了。

1和2是个悖论,不知道何种缘故,当都使用8M晶振时,38400波特率,UART和定时器都是0.2%误差。当微调定时器计数器值可以解决这个问题。

缘由是attiny没有串口,datasheet说USI可以轻易实现半双工串口,但是愣是明白。

模拟串口发送1个byte程序:

void timer0_init(void)
{
TCNT0= 0xE6; //set count
TCCR0B = 0x02;//start timer
}

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
       TCNT0 = 0xE6; //reload counter value
         if(SendFlg==1)
       {
             if(SendbitCNT==0){UART_T_L;SendbitCNT++;}
               else if(SendbitCNT==9){UART_T_H;SendbitCNT=10;}
               else if(SendbitCNT==10){SendFlg=0;SendbitCNT=0;}
               else
               {
                      if(UARTBUF&0x01==1)UART_T_H;
                          else UART_T_L;
                         UARTBUF>>=1;
                          SendbitCNT++;
               }
       }          
}
页: [1]
查看完整版本: AVR 串口与模拟串口问题