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

输出如下信息表示下载成功:

参考资料

  1. ATtiny88 Datasheet
  2. ProgISP
  3. AVRDUDE User Manual

ATtiny88初体验(一):点灯的更多相关文章

  1. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  2. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  3. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  4. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  5. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  6. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  7. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  8. 百度EChart3初体验

    由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...

  9. Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验

    Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...

  10. Docker初体验

    ## Docker初体验 安装 因为我用的是mac,所以安装很简单,下载dmg下来之后拖拽安装即可完成. 需要注意的就是由于之前的docker是基于linux开发,不支持mac,所以就出现了docke ...

随机推荐

  1. Django4全栈进阶之路22 项目实战(三种方式开发部门管理):方式三:FBV+ModelForm+get_object_or_404

    1.视图 @login_required def department_list_view(request): departments = Department.objects.all() retur ...

  2. Cannot apply DjangoModelPermissionsOrAnonReadOnly on a view that does not set `.queryset` or have a `.get_queryset()` method.

    这个问题是在使用 django REST 做自定义认证的时候出现的 解决方法是 在settings.py 中注释掉这个 REST_FRAMEWORK={ 'DEFAULT_PERMISSION_CLA ...

  3. PHP中的AMQP类

    PHP中的AMQP类 标签(空格分隔): php,amqp 官网地址:http://docs.php.net/manual/da/book.amqp.php AMQPConnection AMQPCo ...

  4. 【重学C++】05 | 说透右值引用、移动语义、完美转发(下)

    文章首发 [重学C++]05 | 说透右值引用.移动语义.完美转发(下) 引言 大家好,我是只讲技术干货的会玩code,今天是[重学C++]的第五讲,在第四讲<[重学C++]04 | 说透右值引 ...

  5. SpringBoot整合OSS文件上传

    一.注册阿里云账号并开通OSS服务 1.登录阿里云账号 2.创建一个bucket 3.创建子用户 对自用户分配权限,打开操作OSS的全部权限(也可根据业务需求进行更改) 4.配置上传跨域规则 任何来源 ...

  6. 高分辨率大图像可缩放 Web 查看器的实践

    高分辨率大图像可缩放 Web 查看器的实践 一.使用 vips 将高分辨率大图像转换为 DZI 安装 vips 具体安装步骤请参考libvips Install. 注意,在 windows 11 中安 ...

  7. HashMap 以及多线程基本感念

    接口 Map :映射项,(键值对 ) 的容器注意: 键 是唯一的 值 是可以重复的实现类 HashMap :哈希表结构 允许使用null值 和 null 键 线程不安全 键唯一 无序 linkedHa ...

  8. 深入理解Go语言接口

    1. 引言 接口是一种定义了软件组件之间交互规范的重要概念,其促进了代码的解耦.模块化和可扩展性,提供了多态性和抽象的能力,简化了依赖管理和替换,方便进行单元测试和集成测试.这些特性使得接口成为构建可 ...

  9. Unity的Console的控制类LogEntries:深入解析与实用案例

    使用Unity Console窗口的LogEntries私有类实现自定义日志系统 在Unity开发过程中,我们经常需要使用Console窗口来查看程序运行时的日志信息.Unity内置的日志系统提供了基 ...

  10. 获得 markdown 无序列表格式的文件目录树

    tree 命令可以获得文件目录结构,但是放在文档中时,我想用 markdown 无序列表的形式,在编辑器内还可以折叠. 完整解决方案:在 ~/.oh-my-zsh/custom 下添加下述自定义函数( ...