用C语言进行嵌入式系统的开发具有汇编语言编程不可比拟的优势,虽然C语言编写出的代码要比汇编语言占有的空间大5%~20%,但是由于半导体技术的发展,芯片的容量和速度有了大幅度的提升,占用空间的比例已经不是那么关键,相比之下,更看重软件是否具有长期稳定运行的能力,注重使用先进开发工具所带来的时间和成本的优势,那么对于AVR单片机与C语言来说,也是一样的。AVR单片机在ATMEL的设计下吸取了PIC和80C51的优点并进行了大量改进,使其运用也十分广泛,这里不具体详述,来解读一下AVR单片机和C语言的关键点和一些注意事项,以此谈谈感受与经验。
在AVR输入输出的使用中,I/O口是重点,AVR的I/O口为标准双向口,在复位时所有端口处于没有上拉电阻的输入状态(高阻态,管脚电平完全由外部电路决定)。AVR的每一个端口对应3个地址即DDRX,PORTX,PINX(X取A~F,但是只有PINX可以取F)
在AVR中断系统中有2点要注意的事项:1.由于TI的TCNT1,OCR1A,OCR1B,ICR1都是16位的定时器,为了正确的写入和读出,在写入数据时应该先写高字节,再写低字节,在读取数据时应该先读取低字节,再读取高字节。 2.TI的捕捉方式,可用于ICP引脚上频率或者周期的测量,在使用时只需使能捕捉中断即可,对T1的设置可参考定时的用法。
注意:在AVR的子程序中,硬件不保护SREG状态寄存器,应该根据实际情况由软件保护,例如:
#pragma interrupt_handler timer1:7 // 申明timer1()为中断处理函数
#pragma interrupt_handler int0:2 //申明_int0()为中断处理函数
void main(void)
{
GIMSK=0X40; //使能INT0中断
TIMSK=0X80; //使能T1溢出中断
_SEI(); //使能全局中端
}
void timer1(void) //T1溢出中断服务程序
{
_SEI(); //在T1溢出中断服务程序使用全局中断
//保证INT0的优先级
}
在C语言的中断服务程序(中断处理函数)中,会自动保护中断服务函数中使用的所有的寄存器
AVR单片机内置EEPROM和看门狗(Watchdog)的使用:注意事项,看门狗电路的振荡器为内部RC振荡器,其震荡频率受电压影响,在DC5V时约为1MHZ,在AVR汇编中有一条指令WDR来清除看门狗定时器,在C语言中对应为_WDR()函数或WDR()函数。