ATtiny88初体验(一):点灯
ATtiny88初体验(一):点灯
最近逛淘宝时,发现一块ATtiny88核心板(MH-ET LIVE Tiny88)用完红包后只剩4块钱了,果断下单,准备好好把玩一番。
MH-ET LIVE Tiny88介绍
这块核心板使用的MCU型号是ATtiny88,主要参数如下:
| 资源 | 主要特征 |
|---|---|
| Flash | 8KB |
| SRAM | 512B |
| 频率 | 12MHz |
| EEPROM | 64B |
| 定时器 | 1个8bit,1个16bit |
| PWM | 2通道 |
| ADC | 8通道10bit |
| 比较器 | 1 |
| GPIO | 28 |
| SPI | 1 |
| TWI | 1 |
| 看门狗 | 1 |
| 电压 | 0~4MHz @ 1.8~5.5V 0~8MHz @ 2.7~5.5V 0~12MHz @ 4.5~5.5V |
MH-ET LIVE Tiny88的引脚图如下:

板子共引出了26个IO口,少了的2个IO口是PB6和PC6,其中PB6没有引出,可以通过熔丝位将RST引脚配置为PC6。另外,1号和2号引脚是连接到USB口的,供VUSB使用,最好不要用作他用。
值得注意的是,板子搭载的晶振频率为16MHz,已经超过了ATtiny88手册里标明的最大工作频率12MHz,超频了33%。
熔丝位
ATtiny88拥有3个字节的熔丝位,和一般的逻辑相反,熔丝位中的 1 表示未编程(禁止), 0 表示已编程(启用)。修改熔丝位时需要谨慎再谨慎,否则可能造成锁死单片机(俗称变砖)。
熔丝扩展位

SELFPRGEN:设为0表示启用自编程(SPM指令)
熔丝高位

RSTDISBL:设为0时将复位引脚用作普通IO(PC6),修改需谨慎!DWEN:设为0时启用调试接口SPIEN:设为0时可以通过SPI下载程序和数据,修改需谨慎!WDTON:设为0时将总是启用看门狗EESAVE:设为0时擦除芯片时会保留EEPROM中的内容BODLEVEL[2:0]:设置欠压检测等级

熔丝低位

CKDIV8:设为0时系统时钟会进行8分频CKOUT:设为0时启用时钟输出(通过CLKO引脚)SUT[1:0]:设置启动时间

CKSEL[1:0]:设置时钟源

修改熔丝位
在Windows环境下,可以借助ProgISP软件查看和修改熔丝位。
通过USBasp将核心板与电脑连接,打开ProgISP软件,在“Select Chip”下选择“ATtiny88”,点击“RD”按钮,如果连接没有问题,会提示“读出ID成功”。

点击“自动”按钮旁边的“...”按钮。

在弹出的小窗口中点击下方“位配置方式”标签页中的“读出”按钮,提示“熔丝位读出成功”。

点击需要修改熔丝位即可切换该位的值,设置完毕后点击“位配置方式”中的“写入”按钮,提示“熔丝位写入成功”。

至此,便完成了熔丝位的修改。
点灯
“点灯”程序就是单片机开发中的“Hello World!”,借助它,可以大致体会单片机开发的完整流程。
寄存器介绍

在ATtiny88中,每个IO口都可作为输入或者输出,并且都有一个独立可控的内部上拉电阻。
与IO相关的寄存器主要有 MCUCR 、 PORTCR 、 PORTx 、 DDRx 、 PINx 。

PUD:写1禁止内部上拉电阻(全局)

BBMx:写1使能对应端口的Break-Before-Make模式PUDx:写1禁止对应端口的内部上拉电阻

PORTx 寄存器存放输出数据, PINx 寄存器存放输入数据, DDRx 寄存器用于配置端口方向, 0 表示输入, 1 表示输出。
当IO配置为输入模式时,向 PORTx 寄存器中写 1 表示启用内部上拉电阻。
不管是输入还是输出模式,向 PINx 寄存器中写 1 都表示翻转 PORTx 寄存器中对应位的状态。
IO口的具体配置组合如下所示:

代码
代码文件的整体结构如下所示:
.
├── Makefile
├── inc
└── src
└── main.c
为了方便编译,在根目录下编写一个 Makefile 文件:
CC = avr-gcc
CP = avr-objcopy
SZ = avr-size
DP = avr-objdump
AVRDUDE = avrdude
TARGET = led
BUILD_DIR = build
C_SOURCES = src/main.c
C_INCLUDES = -Iinc
C_DEFS = -DF_CPU=16000000
LIBS = -lc -lm
LIBDIRS =
MCU = -mmcu=attiny88
OPT = -Og
CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -g -std=gnu99 -Wall -fdata-sections -ffunction-sections
LDFLAGS = $(MCU) $(LIBS) $(LIBDIRS) -Wl,--gc-sections -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
PROGRAMMER_ID = usbasp
PARTNO = t88
PORT =
BAUDRATE =
OBJECTS = $(addprefix $(BUILD_DIR)/,$(C_SOURCES:.c=.o))
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" -Wa,-adhmls=$(@:%.o=%.lst)
AVRDUDE_FLAGS = -c $(PROGRAMMER_ID) -p $(PARTNO)
ifneq ($(PORT),)
AVRDUDE_FLAGS += -P $(PORT)
endif
ifneq ($(BAUDRATE),)
AVRDUDE_FLAGS += -b $(BAUDRATE)
endif
.PHONY: all clean flash
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).txt $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
$(CC) -c $(CFLAGS) -o $@ $<
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
$(SZ) $@
$(BUILD_DIR)/$(TARGET).txt: $(BUILD_DIR)/$(TARGET).elf
$(DP) -h -S $< > $@
$(BUILD_DIR)/$(TARGET).hex: $(BUILD_DIR)/$(TARGET).elf
$(CP) -O ihex $< $@
$(BUILD_DIR)/$(TARGET).bin: $(BUILD_DIR)/$(TARGET).elf
$(CP) -O binary -S $< $@
$(BUILD_DIR):
mkdir -p $(sort $(dir $(OBJECTS)))
clean:
rm -rf $(BUILD_DIR)
flash: $(BUILD_DIR)/$(TARGET).hex
$(AVRDUDE) $(AVRDUDE_FLAGS) -U flash:w:$<:i
-include $(OBJECTS:%.o=%.d)
Makefile 文件中的 TARGET 变量指定目标名称, BUILD_DIR 变量指定编译目录, C_SOURCES 指定C源文件, C_DEFS 指定C宏定义, C_INCLUDES 指定头文件目录。
MH-ET LIVE Tiny88板载的LED连接到0号引脚,对应的是PD0,高电平点亮。在 src 目录下新建一个 main.c 源文件,输入如下代码,实现:设置PD0位输出模式,然后每隔一段时间翻转PD0的输出。
#include <stdint.h>
#include <avr/io.h>
static void delay(void);
int main(void)
{
DDRD |= 0x01;
PORTD |= 0x01;
for (;;) {
PIND = 0x01;
delay();
}
}
static void delay(void)
{
for (volatile uint32_t i = 0; i < 0x20000; i++);
}
编译代码:
make
将在 build 文件夹下生成ELF/HEX/BIN文件。
下载
在 /etc/udev/rules.d/ 目录下创建一个USBasp的规则文件 99-usbasp.rules ,内容如下:
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", MODE="664", GROUP="plugdev"
安装 avrdude 软件:
sudo apt install avrdude
连接USBasp,进行下载:
make flash
上述命令实际上执行的是:
avrdude -c usbasp -p t88 -U flash:w:build/led.hex:i
avrdude 中常用的选项如下
| 选项 | 含义 | 取值 |
|---|---|---|
-c programmer-id |
指定编程器 | usbasp :USBasp arduino :ArduinoISP |
-p partno |
指定单片机 | t88 :ATtiny88 m328p:ATmega328P m32u4 :ATmega32U4 |
-P port |
指定端口 | |
-b baudrate |
指定波特率 | |
-U memtype:op:filename[:format] |
指定执行的操作 memtype :内存区域 op :操作 filename :文件名 format :文件格式 |
memtype 的取值: flash :Flash ROM eeprom :EEPROM efuse / hfuse / lfuse :扩展/高/低熔丝位 op 的取值: r :读 w :写 v :校验 format 的取值: i :Intel Hex r :raw binary e :ELF |
输出如下信息表示下载成功:

参考资料
ATtiny88初体验(一):点灯的更多相关文章
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
- Docker初体验
## Docker初体验 安装 因为我用的是mac,所以安装很简单,下载dmg下来之后拖拽安装即可完成. 需要注意的就是由于之前的docker是基于linux开发,不支持mac,所以就出现了docke ...
随机推荐
- Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】
〇.简介 1.什么是简单工厂模式? 一句话解释: 客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类. 简单工厂模式(Simple Factory Pattern)是日常开发中常用的 ...
- 如何科学地利用MTTR优化软件交付流程?
谷歌提出的衡量 DevOps 质量的 DORA 指标让 MTTR(平均恢复时间) 名声大振.在本文中,你将了解到 MTTR 的作用.为什么它对行业研究很有用.你可能被它误导的原因以及如何避免 MTTR ...
- RESTful API 简介
RESTful API 简介 想必使用过 PHP.JSP 这一类服务器动态页面技术的程序员应该都还记得,在使用这种传统的动态页面架构构建应用程序的时候,用于描述用户界面的 HTML 页面通常都是在服务 ...
- DosBox环境配置
DosBox环境配置 DOSBox 是一个基于 x86 架构的 PC 的模拟器,它允许用户在现代操作系统上运行 DOS 程序.DOSBox 是自由软件,可以在 Windows.Linux ,macOS ...
- Spring Boot实现高质量的CRUD-2
(续前文) 5.Dao类 Dao类提供操作访问数据库表的接口方法.常规的CRUD,将考虑下列接口方法: 1)插入单条对象记录: 2)批量插入对象记录: 3)修改单条对象记录: ...
- 推送服务接入指导(HarmonyOS篇)
消息推送作为App运营日常使用的用户促活和召回手段,是与用户建立持续互动和连接的良好方式.推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道,本文旨在介绍Harmo ...
- MySql InnoDB 存储引擎表优化
一.InnoDB 表存储优化 1.OPTIMIZE TABLE 适时的使用 OPTIMIZE TABLE 语句来重组表,压缩浪费的表空间.这是在其它优化技术不可用的情况下最直接的方法.OPTIMIZE ...
- 第四章 VIVIM编辑器
1. 是什么 VI 是 Unix 操作系统和类 Unix 操作系统中最通用的文本编辑器. VIM 编辑器是从 VI 发展出来的一个性能更强大的文本编辑器. 2. 一般模式 以 vi/v ...
- Linux 上的 .NET 如何自主生成 Dump
一:背景 1. 讲故事 前几天微信上有位朋友找到我,说他程序的 线程数 会偶发性瞬时飙高,让我看下大概是什么原因,截图如下: 如果这种问题每天都会出现,比较好的做法就是用 dotnet-trace 捕 ...
- 记一次etcd全局锁使用不当导致的事故
1.背景介绍 前两天,现场的同事使用开发的程序测试时,发现日志中报etcdserver: mvcc: database space exceeded,导致 etcd 无法连接.很奇怪,我们开发的程序只 ...