还在读书的时候,一次课程设计用到了ATmega128的片子,感觉还不错。后来玩单片机就收藏了两块mega128的核心板。在玩Arduino以后,一直想把这两块闲置多年mega128的板子也用起来。趁着过年这几天比较闲,简单搞了一下。
一、制作属于ATmega128的bootloader
源代码需要在Arduino IDE自带的通用bootloader上修改几处,当然也可以直接使用已经编译好的boot_mega128.hex文件。
二、硬件连接
用杜邦线连接USBtinyISP 的 JP1(ISP6)和开发板的ISP接口(暂时只测试了 USBtinyISP)。
三、Arduino开发环境设置
参考:
进入Arduino IDE目录
修改 /hardware/arduino/boards.txt (1.0.5在该路径下)
在最后添加:
###############################################################
atmega128A.name=Custom ATmega 128A_8MHz
atmega128A.upload.using=avrispmkii
atmega128A.upload.maximum_size=126976
atmega128A.bootloader.low_fuses=0xFF
atmega128A.bootloader.high_fuses=0xCA
atmega128A.bootloader.extended_fuses=0xFF
atmega128A.bootloader.path=mega128
atmega128A.bootloader.file=boot_mega128.hex
atmega128A.bootloader.unlock_bits=0x3F
atmega128A.bootloader.lock_bits=0x0F
atmega128A.build.mcu=atmega128
atmega128A.build.f_cpu=8000000L
atmega128A.build.core=arduino
atmega128A.build.variant=mega128
##############################################################
设置后可在Arduino IDE 的菜单“工具”—> “板卡”下看到对应的“Custom ATmega 128A_8MHz”选项。
atmega128A.upload.using=avrispmkii
atmega128A.upload.maximum_size=126976
atmega128A.bootloader.low_fuses=0xFF
atmega128A.bootloader.high_fuses=0xCA
atmega128A.bootloader.extended_fuses=0xFF
atmega128A.bootloader.path=mega128
atmega128A.bootloader.file=boot_mega128.hex
atmega128A.bootloader.unlock_bits=0x3F
atmega128A.bootloader.lock_bits=0x0F
atmega128A.build.mcu=atmega128
atmega128A.build.f_cpu=8000000L
atmega128A.build.core=arduino
atmega128A.build.variant=mega128
##############################################################
设置后可在Arduino IDE 的菜单“工具”—> “板卡”下看到对应的“Custom ATmega 128A_8MHz”选项。
三、设置Arduino引脚定义
在/hardware/arduino/variants文件夹下新建一个文件夹mega128
在mega128里面新建一个pins_arduino.h,内容略,可根据实际开发板资源调整。
目前所用atmega128的arduino pin mapping 定义如下:
arduino io
|
主芯片 IO 口
|
外部资源 1
|
外部资源 2
|
外部资源 3
|
外部资源 4
|
0
|
PA0/A/D0
|
流水灯(D1)
|
数码管(位 1)
|
LCD1602(D0)
|
LCD12864(D0)
|
1
|
PA1
|
流水灯(D2)
|
数码管(位 2)
|
LCD1602(D1)
|
LCD12864(D1)
|
2
|
PA2
|
流水灯(D3)
|
数码管(位 3)
|
LCD1602(D2)
|
LCD12864(D2)
|
3
|
PA3
|
流水灯(D4)
|
数码管(位 4)
|
LCD1602(D3)
|
LCD12864(D3)
|
4
|
PA4
|
流水灯(D5)
|
数码管(位 5)
|
LCD1602(D4)
|
LCD12864(D4)
|
5
|
PA5
|
流水灯(D6)
|
数码管(位 6)
|
LCD1602(D5)
|
LCD12864(D5)
|
6
|
PA6
|
流水灯(D7)
|
数码管(位 7)
|
LCD1602(D6)
|
LCD12864(D6)
|
7
|
PA7
|
流水灯(D8)
|
数码管(位 8)
|
LCD1602(D7)
|
LCD12864(D7)
|
8
|
PB0/SS
|
步进电机
|
|
|
|
9
|
PB1/SCK
|
步进电机
|
|
|
|
10
|
PB2/MOSI
|
步进电机
|
|
|
|
11
|
PB3/MISO
|
步进电机
|
|
|
|
12
|
PB4/OC0
|
直流电机
|
PWM(D9)
|
|
|
13
|
PB5/OC1A
|
LCD1602(RS)
|
LCD12864(RS)
|
|
|
14
|
PB6/OC1B
|
LCD1602(RW)
|
LCD12864
|
|
|
15
|
PB7/OC1C
|
LCD1602(EN)
|
(RW)
|
|
|
16
|
PC0/A8
|
数码管(段 A)
|
LCD12864(EN)
|
|
|
17
|
PC1
|
数码管(段 B)
|
|
|
|
18
|
PC2
|
数码管(段 C)
|
|
|
|
19
|
PC3
|
数码管(段 D)
|
|
|
|
20
|
PC4
|
数码管(段 E)
|
|
|
|
21
|
PC5
|
数码管(段 F)
|
|
|
|
22
|
PC6
|
数码管(段 G)
|
|
|
|
23
|
PC7
|
数码管(段 dp)
|
|
|
|
24
|
PD0/SCL/INT0
|
矩阵键盘(行 1)
|
按键 K17
|
AT24C02(SCL)
|
|
25
|
PD1/SDA/INT1
|
矩阵键盘(行 2)
|
按键 K18
|
AT24C02(SDA)
|
|
26
|
PD2/RXD1/INT2
|
矩阵键盘(行 3)
|
按键 K110
|
PSII(DAT)
|
红外线接收
|
27
|
PD3/TXD1/INT3
|
矩阵键盘(行 4)
|
按键 K20
|
PSII(CLK)
|
|
28
|
PD4/ICP1
|
矩阵键盘(列 1)
|
|
|
|
29
|
PD5/XCK1
|
矩阵键盘(列 2)
|
|
|
|
30
|
PD6/T1
|
矩阵键盘(列 3)
|
|
|
|
31
|
PD7/T2
|
矩阵键盘(列 4)
|
|
|
|
32
|
PE0/RXD0/PDI
|
串口(RXD)
|
|
|
|
33
|
PE1/TXD0/PDO
|
串口(TXD)
|
|
|
|
34
|
PE2/XCK0/AIN0
|
DS1302(SCLK)
|
|
|
|
35
|
PE3/OC3A/AIN1
|
DS1302(I/0)
|
|
|
|
36
|
PE4/OC3B/INT4
|
DS1302(RST)
|
|
|
|
37
|
PE5/OC3C/INT5
|
空闲
|
|
|
|
38
|
PE6/T3/INT6
|
DS18B20
|
|
|
|
39
|
PE7/ICP3/INT7
|
蜂鸣器
|
|
|
|
40
|
PF0/ADC0
|
ADC 输入
|
|
|
|
41
|
PF1/ADC1
|
数码管段选锁存
|
|
|
|
42
|
PF2
|
数码管位选锁存
|
|
|
|
43
|
PF3
|
流水灯锁存
|
|
|
|
44
|
PF4
|
JTAG(TCK)
|
|
|
|
45
|
PF5
|
JTAG(TMS)
|
|
|
|
46
|
PF6
|
JTAG(TDO)
|
|
|
|
47
|
PF7
|
JTAG(TDI)
|
|
|
|
48
|
PG0/WR
|
空闲
|
|
|
|
49
|
PG1/RD
|
空闲
|
|
|
|
50
|
PG2/ALE
|
空闲
|
|
|
|
51
|
PG3/TOSC2
|
空闲
|
|
|
|
52
|
PG4/TOSC2
|
空闲
|
|
|
|
引脚定义参考开发板为博科电子的BK-AVR128,实物图片如下:
实际手里用的是这块:
通过Arduino IDE 把准备好的 bootloader 写入mega128。使用 USBtinyISP 的好处是不需要选择连接端口,直接写就行了。
写好bootloader以后,你的单片机开发板就变为 Arduino 了。虽然官方的FAQ里仍然强调 Arduino “只是一块AVR开发板”……
四、测试
写好bootloader以后,你的单片机开发板就变为 Arduino 了。虽然官方的FAQ里仍然强调 Arduino “只是一块AVR开发板”……
四、测试
测试程序:
int ledPin =12;
void setup() {
// put your setup code here, to run once:
pinMode(ledPin,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
delay(1000);
}
int ledPin =12;
void setup() {
// put your setup code here, to run once:
pinMode(ledPin,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
delay(1000);
}
好吧,现在可以用ATmega18A开始Arduino的玩弄时间了。
PS: avrdude 真心不会用,avrdude-GUI 也不会!
PS: avrdude 真心不会用,avrdude-GUI 也不会!