在学校的时候总是用Atmega16的,总是听朋友说Atmega48V的种种优点:低功耗,价格便宜等等,总之就是性价比很高的一款单片机。最近想对Atmega48V学习学习,可是刚开始调试USART0就调试不通,整整忙活了两天。在网上也找了很多例子,但是大部分都是关于Atmega16的,改了很多次就是不成功,不管发送什么数据,串口调试助手接受的都是十六进制数80。
郁闷了好长时间,今天在调试的时候,我发现Atmega48的熔丝配置里的最上面有一个系统始终8分频的选项(Divide clock by internally),不选中,重新编译下载程序。居然成功了!
仔细想想,当熔丝配置成8M的时候其实系统只有1M,而我的波特率一直是以8M计算的,所以串口发送和接受数据不成功。接着我又选中系统始终8分频的选项,波特率按1M计算,发送依然成功,以前很少注意到这个选项的。下面是我的程序:
//------------------------------------- ATMega48V-8MHz --------------------------------------------------
//用途:基于ATMega48V的USART0测试程序
//
//开发软件:GCCAVR 20080512
//
//开发人员: Farmer
//
//版本:2008年8月27日
//
//说明:
//--------------------------------------------------------------------------------------------------------------
#include <avr/io.h>
unsigned int data;
int main(void)
{
UBRR0H=0;
UBRR0L=51; //9600
//特别说明:当Divide clock by internally被选中的时候 是 6
// 当Divide clock by internally未被选中的时候 是 51
UCSR0C=(0<<UMSEL01)|(0<<UMSEL00)|(1<<UCSZ01)|(1<<UCSZ00);
//8位数据位和1位STOP位
UCSR0B=(1<<RXEN0)|(1<<TXEN0); //允许发送和接收
while(1)
{
while(!(UCSR0A&(1<<RXC0))); //RXC为1,表示USART接受完成
data="UDR0";
while(!(UCSR0A&(1<<UDRE0))); //该位为1,表示数据发送已准备好
UDR0=data;
}
}
//用途:基于ATMega48V的USART0测试程序
//
//开发软件:ICCAVR
//
//开发人员: Farmer
//
//版本:2008年8月27日
#include <iom48v.h>
unsigned int data;
void com_init()
{
UBRR0H=0;
UBRR0L=6; //9600 bps Divide clock by internally被选中
UCSR0C=(0<<UMSEL01)|(0<<UMSEL00)|(1<<UCSZ01)|(1<<UCSZ00);
//8位数据位和1位STOP位
UCSR0B=(1<<RXEN0)|(1<<TXEN0); //允许发送和接收
}
void main(void)
{
com_init();
while(1)
{
while(!(UCSR0A&(1<<RXC0))); //RXC为1,表示USART接受完成
data="UDR0";
while(!(UCSR0A&(1<<UDRE0))); //该位为1,表示数据发送已准备好
UDR0=data;
}
}
文章评论(0条评论)
登录后参与讨论