新建的项目中没有包含任何源文件,需要先创建一个C文件。在项目的Source Files中,单击鼠标右键选择创建main.c。
在原理图上查到LED对应的引脚是PF5,于是按照以前的习惯顺手就写了 DDRF |= (1<<5); 没有想到编译就提示错误:
newmain.c: In function 'main':
newmain.c:13:5: error: 'DDRF' undeclared (first use in this function)
DDRF |= (1<<5);
查看编程手册后,才发现ATmega4809虽然也是AVR系列,但它并不兼容早期的mega系列。它是新的megaAVR 0 系列,寄存器和xmega兼容。看到这里就想起来了ATMEL的AVR32和XMEGA这两个功能强大,但是又不太成功的系列。AVR32是针对32位ARM,XMEGA是MEGA的升级,虽然硬件功能在当时算不错,但是在软件方面资源较少,又不兼容以前的代码,再加上ARM COTEX-M的兴起,使得很多开发者选择了其它芯片。AVR的成功得益于开源,到现在arduino上使用最多的还是早期的ATmega328。
在数据手册中,可以查到ATmega4809的方向寄存器是PORTx.DIR,输出寄存器有PORTx.OUT、PORTx.OUTSET、PORTx.OUTCLR、PORTx.OUTTGL等。其中PORTx.OUTTGL是输出翻转,写入1就可以使得对应的引脚翻转。在加上延时函数,一个简单的闪灯程序就完成了。
#include <xc.h>
#include <util/delay.h>
int main(void) {
PORTF.DIR |= (1<<5);
while (1) {
PORTF.OUTTGL |= (1<<5);
_delay_ms(500);
}
return 0;
}
下载后发现闪灯的频率比预计的快了很多,检查发现是时钟频率不对。延时的时钟频率默认是1MHz,而ATmega4809默认的时钟频率是20MHz内部时钟进行6分频,修改时钟后延时时间就正常了。
#define F_CPU 20000000L/6
#include <xc.h>
#include <util/delay.h>
int main(void) {
PORTF.DIR |= (1<<5);
while (1) {
PORTF.OUTTGL |= (1<<5);
_delay_ms(500);
}
return 0;
}
|