画个板子玩玩最便宜的Arduino,Atmega8A 的使用
前言我们日常如果是走Arduino这种快速开发的方向,那肯定会用那几种处理器Atmega328P,Atmega32U4,这里的话后者相比前者提供了原生的全速USB2.0支持。而Atmega的系列如果往328P之前看,还有Atmega8,Atmega48,Atmega88,Atmega168,Atmega162,AtmegaA8U2等等这一款处理器具有以下特点No. of Pins28CPU8-Bi
目录
前言
我们日常如果是走Arduino这种快速开发的方向,那肯定会用那几种处理器Atmega328P,Atmega32U4,这里的话后者相比前者提供了原生的全速USB2.0支持。
而Atmega的系列如果往328P之前看,还有Atmega8,Atmega48,Atmega88,Atmega168,Atmega162,AtmegaA8U2等等
这一次这一次我就试着玩了一下这一块处理器,但是和以往一样,也都遇到了一些设计上的问题。那么整个流程是什么样的?一起来看一下
这一款处理器具有以下特点
No. of Pins | 28 |
CPU | 8-Bit AVR |
Operating Voltage | 2.7 to 5.5 V |
Program Memory | 8K |
Program Memory Type | Flash |
RAM | 1K Bytes |
EEPROM | 512 Bytes |
ADCNumber of ADC Channels | 10-Bit6 in PDIP, 8 in TQFP and QFN |
Comparator | 1 |
PWM Channels | 3 |
Oscillator | up to 16 MHz |
Timer (3) | 16-Bit Timer (1)8-Bit Timer (2) |
Packages (3) | PDIP (28-Pins)TQFP (32-Pins)QFN (32) |
Power Up Timer | Yes |
I/O Pins | 23 |
Manufacturer | Microchip |
SPI | Yes |
I2C | Yes |
Watchdog Timer | Yes |
Brown out Detection (BOD) | Yes |
USART | Yes |
Sleep Modes | 5 |
Minimum Operating Temperature | -55 C |
Maximum Operating Temperature | 125 C
|
这一款有多个封装,我购买的是Atmega8A-AU,和老早前的Atmega8相比较没有管脚差别,只要一些输出电流差异
设计和最终打样
在基本功能上我设计了四个模块,主控,降压,按键,串口,和以前相比这样的设计也让板子大了很多。
按键设计:四个轻触开关,上拉接VCC
串口设计:CH340G,缺点是需要外接晶振,优点是便宜
稳压电路:作为最容易使用的降压电路,AMS1117缺点是压差不能超过10V,也就是理论上电压输入不能超过15V,但是因为品质所以最大耐受10V左右
主控:主控用的是Atmega8A-16AU,晶振实际选用的是16Mhz的,这个就按照具体芯片来变化吧
旧版的原理图
新版,经过查错修改后的版本,主要改了CH340G部分和按键以及PWR灯
完成原理图后我快速开始着手PCB的设计,按键配置在左侧,然后配了两条VCC和GND的线路用于外接设备,因为空间紧俏,所以我把CH340G芯片放在下层,如果把电阻器改成0402或许布线可以更方便许多,但是焊接难度就大太多了。
最终效果,大概这样子,丝印部分我在AltiumDesign中进行了调整,接口设计了5组,分别是:
CH340G的接口,包括有RTS和DTR下载电路,用于自动复位一些芯片
USB接口,连接到CH340G上面
DC输入接口,最大9V
Atmega8的所有引脚
经过一些时间后我拿到了板子,并进行了焊接,焊接方法试了一些新的做法比如回流焊,不过我在早些时候是没有用回流焊接0806器件经验,所以锡膏明显涂多了点儿。
板子的测试
我从仓库里面掏出了一个USB-A公口,然后焊接上2.54插针,继而就可以用杜邦线连接到新造的Atmega8A板子上
打开设备管理器可以看到,CH340G正常的运行了,可以被USB接口识别出来
默认的情况下,在Atmega8内已经有烧写一个出厂的测试程序
这个出厂的测试程序应该还带有LED闪烁,而在串口这一边,会提示3个选项,d,t,e,其中e会回复可能是固件时间的日期,而t没有任何回复,e会回复d++++++|pr然后串口就不再有回应了
不过这个程序不知道是不是抽测,我做了两块,另一块就没有出现这些代码,只能后再测试了。
然后我发现RX和TX灯不亮,检查后发觉到手VCC没有加上,所以设计时候DRC检查以及引脚的检测真的很重要。(下图是加上后) 另外还有一个电容器在初版设计时候和按键撞了,但还好工艺不错没有连一起。
如何烧录Bootloader
我想要在Arduino IDE上用UART烧写,而实现这个功能的前提是有安装Bootloader,常用的烧写工具有AVR ISP,USBtinyISP等等
但是,因为我没有AVRISP这类烧写器,现在买还要再过好几天,那么有没有更简便的方案?
所以我想着使用Arduino UNO板子来烧写程序,这个操作在七八年前还是很流行的不过我其实还没干过,很有趣的一个事情是,我还找到了专门的烧写AVR芯片的盾板,插在Arduino UNO上面就可以。
打开Arduino IDE,然后选择文件---示例,选这个ArduinoISP
烧写到UNO里面,事实上只要是AVR的MCU应该都可以,只是说32U4这类自带USB的会有一些区别。
事实上这个程序还有一些提示功能,比如说,在7,8,9Pin上都设计有指示灯功能。7是表示ISP正在受到上位机的控制(也就是我们的电脑),8表示出现了错误,9是烧写中
// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave
和我们要烧录的Atmega8A的连线方法如下
Arduino UNO | Atmega8A |
---|---|
10(Reset) | (Reset)(PC6) |
11(MOSI) | (MOSI)(PB3) |
12(MISO) | (MISO)(PB4) |
13(SCK) | (SCK)(PB5) |
VCC | VCC |
GND | GND |
我没有预留出ISP的接口,因为在整个使用中实在是非常少用。
在连线完成后,当前我们的IDE选项是这样的
需要把开发板改成Atmega8,可以选择Arduino NG or older,但是只支持两种ATmega的芯片。
而如果要使用48,88等那就要用到MiniCore这个。
如何获得MiniCore?在附加开发版管理器网址中加入 https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
之后开始烧写吧,如果出现这个提示,那么说明一切OK,恭喜你这个现在可以正常的使用了
Atmega8A引脚号 | Arduino中编号 |
PD1 | 1 |
PD2 | 2 |
PD3 | 3 |
PD4 | 4 |
PD5 | 5 |
PD6 | 6 |
PD7 | 7 |
PD8 | 8 |
PB1 | 9 |
PB2 | 10 |
PB3 | 11 |
PB4 | 12 |
PB5 | 13 |
PC0 | 14 |
PC1 | 15 |
PC2 | 16 |
PC3 | 17 |
PC4 | 18 |
PC5 | 19 |
需要注意的是,MiniCore和官方的Arduino NG在Bootloader以及avrdude的配置有所不同,所以烧写时候不能通用,换句话说就是Arduino NG的Bootloader烧写的Atmega8不能被MiniCore的烧写配置识别
MiniCore可以有更多配置,而Arduino NG的配置会有更好的兼容性,具体的由个人进行抉择
遭遇串口不能烧写的问题
当然我这边一切并不是那么顺利,首先遇到的问题就是串口烧写不能正常的识别
考虑到Bootloader是在复位后首先启动,所以如果烧写肯定要先复位,那么,这大概率就是由于复位电路设计上的原因了,一个方法是连续的按RESET按键。
当然这样效率很低,所以试着学学官方设计,Arduino UNO设计了一个0.1uf的电容器接到Reset(PC6)和串口转USB芯片的DTR脚位上来自动进行复位,也就是信号过来后会有一个脉冲。
而我们初版设计上并没有,所以把DTR和RESET拿一个短线接起来,中间串联一个0.1uf的电容器,另外就是把复位电路进行调整,去除掉这一个0.1uf的C1电容器。
修改前
修改后
除了这边的修改,另外就是简化掉CH340G这边的三极管电路,因为我发现是没必要的,直接输出就可以了。
修改前
修改后
因为第一版的板子已经打出来了,所以我需要简单修改一下背面电路,错位焊接C1电容器,然后再飞一条线到CH340G上面就可以了
通过这样的修改后,自动复位并且上传的功能可以正常的使用了。
试了一下串口也是一切正常的很
打板前检查的必要性
虽然现在串口没问题了,但是,在LED的点亮上却有点毛病,不知道为什么PB1只有很低的电压,然后我发现为什么了,DRC没检查、网络链接没检查就送去打板子....
一共查出了四五个错误的地方,初版VA0只能这样结束了
经过飞线调整后,可以正常使用
最终测试代码
#define LED_BUILTIN PB1
#define BT1 PD5
#define BT2 PD6
#define BT3 PD7
#define BT4 PB1
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
Serial.println("System ONLINE");
Serial.println("Atmega8 ,I am.");
pinMode(BT1, INPUT);
pinMode(BT2, INPUT);
pinMode(BT3, INPUT);
pinMode(BT4, INPUT);
}
// the loop function runs over and over again forever
void loop() {
// digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
// delay(1000); // wait for a second
// digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
// delay(1000); // wait for a second
// Serial.println("Atmega8 ,I am.");
if (!digitalRead(BT1))
{
delay(10);
if (!digitalRead(BT1))
Serial.println("BT1 pressed");
while (!digitalRead(BT1));
}
if (!digitalRead(BT2))
{
delay(4);
if (!digitalRead(BT2))
Serial.println("BT2 pressed");
while (!digitalRead(BT2));
}
if (!digitalRead(BT3))
{
delay(4);
if (!digitalRead(BT3))
Serial.println("BT3 pressed");
while (!digitalRead(BT3));
}
if (!digitalRead(BT4))
{
delay(4);
if (!digitalRead(BT4))
Serial.println("BT4 pressed");
while (!digitalRead(BT4));
}
}
几个要点:
1。一定要去确认USB的线路,D+和 D-是否有很好的连接
2.多数情况下,你一定要去确认一下按键是否正常的连接在默认开路位置
3.如果说你要使用16Mhz一定要用MiniCore这个,而不是官方的Arduino NG
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)