
去看小组作业页面
说正经的,我真的觉得这是最难的作业之一。我被这份数据手册卡住了。
我打算直接跳到编程部分,数据手册只拿来查阅。同时,我会在下面标出重要的章节:
因为我当时有点搞不清该怎么做,就决定把每一步都详细列出来,给接下来的项目留个模板。适用的时候,我会在每一步之后填上空白,边做边写文档,下面就是结果:
- avrdude 或 Atmel Studio 7 (仅 Windows)
- 为此,我先说明我要编程的是 ATTINY44A
- 下载 makefile
- 这里不会用到引导程序,因为没有 USB
- 不适用
- 没有
- 没有
- 这是代码,来自 Neil 教授
- 把之前下载的所有文件放在同一个文件夹里,在 Linux 下我把文件重命名为 makefile,然后运行脚本生成固件(每次想改代码我都会重复这一步):
mv hello.ftdi.44.echo.c.make makefile make
- 在上一步已完成
运行:
make program-usbasp
- 这在 makefile 里已经做好了
运行:
make program-usbasp-fuses
我也决定试试用 Arduino IDE 给我的电路板编程。
为此,有几个步骤在任何操作系统上都应该适用
把下面这段粘贴到(首选项)中的(附加开发板管理器网址:)
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json






这里我没有用终端和 avrdude,而是用了 Arduino IDE,因为它自带串口监视器。
结果都在视频里
现在我要试试让电路板在我按下按钮时闪起来。

看了电路板的原理图,我发现按钮接在引脚 10 上
看了电路板的原理图,我发现 LED 接在引脚 6 上
用大白话说,我想要这样的效果:
问题是我从来没有真正从零写过代码,只是改过代码,所以这会是个挑战……
我先试着把 Arduino IDE 的 Blink 代码 改成我的引脚编号。没成功
下面是不含注释的代码:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
第一段代码没成功,因为我用的是给 Arduino 平台写的代码,却跑在我自己做的板子上。Arduino 板通常有一个接在引脚 13 上的板载 LED,我的板子没有!Arduino 平台给板载 LED 用的常量是:
LED_BUILTIN
第一段代码里我试着用这个常量,没成功。第二段代码里我通过尝试发现,把常量换成一个数字就能让 LED 亮起来。
ATtiny44 正确的代码需要在开头用下面这行代码声明引脚:
const int ledPin = 07;
我是在反复试错中才明白这一点的。现在我知道了,数据手册上的引脚编号和 Arduino 的引脚编号并不对应,而 Arduino 的引脚编号也和 Arduino 平台的常量不一样。当然,这毕竟是块定制板,但这就是当小白的代价!
于是,在试出正确的引脚编号之后,我给板子写了程序,成功让它闪起来了!
下面是去掉注释的定制代码:
const int ledPin = 07;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
不用再靠试错找引脚了。下面是 ATtiny44 在 Arduino 上的引脚图

为了让板子识别按钮,我也需要初始化它,在 sketch 开头加上下面这行代码:
const int buttonPin = "the pin number here"
接下来我得声明一个变量来保存引脚状态,代码如下:
int buttonState = 0;
上面代码里的 <0> 也可以写成 <LOW>,这是 Arduino 编程里的另一个常量。关于常量可以看 Arduino 网站。
查过 ATtiny44 在 Arduino 上的引脚、手里有了正确的引脚编号之后,我把代码里的引脚换掉,就成功了!这里是代码。 (后来更正:原文件里写的是 if (buttonState, HIGH),而且大括号位置不对,编译不过。)
const int buttonPin = 3;
const int ledPin = 7;
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
原理图
因为很多年前我把这块板弄丢了,所以我只能展示怎么在一块类似的板子上连接编程器,就像我在电子设计周做的那样。
编程器 FabISP 和 USBasp这里我展示怎么在输出设备里使用这些编程器。不用 Arduino IDE 的另一种方法,请看嵌入式编程
USBasp
用我做的 FabTinyISP 或 USBtinyISP,通过 Arduino IDE 给一块 ATtiny44 板编程。
FabISP
要改变按钮的行为,我只需把常量 <HIGH> 换成 <LOW>,就在这里:
if (buttonState == LOW) {
这样代码的逻辑就反过来了,也就是说按钮松开时 LED 是灭的。
现在我把 LED 亮和灭的时机反过来了。这里是去掉注释的代码:
const int buttonPin = 3;
const int ledPin = 7;
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH);
}else {
digitalWrite(ledPin, LOW);
}
}
我们来看证据……
在代码里简单加一点东西,我就把行为改成了闪 3 次。
下载代码 (后来更正:原来的循环只是三次把 LED 点亮,没有熄灭,所以它从来没有闪过;现在它会在两次闪烁之间熄灭并等待。图片显示的是原始代码。)
我有点不爽,因为我的板子通电时不会告诉我,所以我决定焊一个红色 LED 和一个 22 欧姆的电阻,这样如果我接错了,我就能知道并换过来。(注:在 5 V 下,22 欧姆会让大约 145 mA 流过 LED,远远超过它能承受的 20-30 mA;正确的大约是 150 欧姆。)
下面是改造前和改造后