目录

 

前言

这一款处理器具有以下特点

设计和最终打样

板子的测试

如何烧录Bootloader

遭遇串口不能烧写的问题

打板前检查的必要性

最终测试代码


前言

我们日常如果是走Arduino这种快速开发的方向,那肯定会用那几种处理器Atmega328P,Atmega32U4,这里的话后者相比前者提供了原生的全速USB2.0支持。

 

而Atmega的系列如果往328P之前看,还有Atmega8,Atmega48,Atmega88,Atmega168,Atmega162,AtmegaA8U2等等

 

这一次这一次我就试着玩了一下这一块处理器,但是和以往一样,也都遇到了一些设计上的问题。那么整个流程是什么样的?一起来看一下

 

这一款处理器具有以下特点

No. of Pins28
CPU8-Bit AVR
Operating Voltage2.7 to 5.5 V
Program Memory8K
Program Memory TypeFlash
RAM1K Bytes
EEPROM512 Bytes
ADCNumber of ADC Channels10-Bit6 in PDIP, 8 in TQFP and QFN
Comparator1
PWM Channels3
Oscillatorup 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 TimerYes
I/O Pins23
ManufacturerMicrochip
SPIYes
I2CYes
Watchdog TimerYes
Brown out Detection (BOD)Yes
USARTYes
Sleep Modes5
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 UNOAtmega8A
10(Reset)(Reset)(PC6)
11(MOSI)(MOSI)(PB3)
12(MISO)(MISO)(PB4)
13(SCK)(SCK)(PB5)
VCCVCC
GNDGND

我没有预留出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中编号
PD11
PD22
PD33
PD44
PD55
PD66
PD77
PD88
PB19
PB210
PB311
PB412
PB513
PC014
PC115
PC216
PC317
PC418
PC519

 

需要注意的是,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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐