AVR单片机因为RISC架构、单周期指令、32个通用寄存器这些特点,一直受到很多开发者的喜爱,ATmega128就是AVR系列里的经典型号。它是一款8位单片机,128KB的Flash程序存储器,4KB的EEPROM,8KB的SRAM,外设也很丰富,四个定时器、两个USART、一个SPI、两线接口(TWI也就是I2C)、8通道10位ADC,在智能家居、工业控制、机器人这些领域都用得挺多的。
ATmega128的核心卖点是那32个通用工作寄存器(R0到R31),全部直接运算,不需要像传统8051那样先把数据搬到累加器再操作,效率高很多。而且AVR的指令集很规整,大概只有130多条指令,学起来不费劲。IO口也是独立的32个寄存器,每个端口对应三个寄存器:方向寄存器DDRx、数据寄存器PORTx、输入寄存器PINx,操作跟PIC类似但更直观。
定时器方面,ATmega128有四个定时器:Timer0(8位)、Timer1(16位)、Timer2(8位)、Timer3(16位),其中Timer1和Timer3是16位的,可以做精确的PWM输出和输入捕获。这四个定时器都支持中断,配置起来也简单。比如要做一个1秒的定时中断,Timer1的时钟如果是8MHz、预分频设为64,那计数器从0数到124999就是1秒,配置TCNT1=0、ICR1=124999,开定时器1溢出中断就行。
串口通信方面,ATmega128有两个独立的USART,可以同时跟两个外设通信,不用分时复用。波特率的设置通过UBRR寄存器计算,公式是UBRR = fosc / (16 * baud) - 1,假设晶振是8MHz,要设9600波特率,UBRR就是8000000/(16*9600)-1≈51。注意AVR的UART0和UART1的寄存器名字不一样,一个叫UCSR0A/UBRR0L,另一个叫UCSR1A/UBRR1L,写代码的时候别写错了。
开发环境方面,以前大家常用WinAVR或者CodeVision AVR,现在推荐用Microchip的MPLAB X IDE配合XC8编译器(因为Atmel被Microchip收购了),或者用Atmel Studio 7。烧录器用AVR ISP、USBASP或者JTAG都可以。另外Arduino也是基于AVR的,ATmega328P就是Arduino Uno的核心,如果熟悉Arduino的话再学ATmega128会很顺手。
ATmega128的Flash容量128KB比较大,适合跑比较复杂的程序,比如带协议栈的无线通信或者简单的图像处理。但SRAM只有8KB,如果要用比较大的数组或者跑RTOS(比如FreeRTOS),要注意内存分配。另外ATmega128的封装有PDIP、TQFP、QFN几种,DIP封装的方便面包板实验,贴片的适合做产品。
如果遇到程序跑飞或者不工作,先查几个常见问题:第一,时钟源设置对不对,AVR默认用内部RC振荡器,频率是1MHz,如果用外部晶振需要配置fuse位;第二,复位脚是不是被正确上拉了;第三,供电电压是否正常,ATmega128正常工作电压是2.7V到5.5V。fuse位千万不能随便改,改坏了可能需要高压烧录器才能恢复。
上一篇:FPGA入门开发板推荐:零基础学习Verilog选哪块好
下一篇:没有了