読者です 読者をやめる 読者になる 読者になる

さまよえる、Android

Androidのプログラミングで便利なことや残しておきたいことを残しておく。もしオススメのライブラリがあったら教えてくださいね。

Mac環境でAVRのLチカ

本当に正しくプログラムは書き込まれたのか?

環境は前回の記事で作成済み。

本当に書き込まれているのか不安だったのでLチカしてみる。

Arduino Unoのピン

今回もArduino Unoベースで開発。

LEDを点滅させるピンをHIGHに指定する。

Arduino UnoとATMEGA328Pのピンを確認。

f:id:araiyusukej:20141129105958p:plain

LEDは、ArduinoのPD0、PD1につなげる。

PD0とPD1が交互に光るのをイメージしてください。

Lチカソースコード

#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
    DDRD    = 0b11111111;
    PORTD   = 0b00000000;
    
    while(1) {
        PORTD = 0b00000001;
        _delay_ms(100);
        PORTD = 0b00000010;
        _delay_ms(100);
    }
}


プログラム書いてビルド。

無事Lチカしたけど、Lチカのペースが遅い。

_delay_ms(100)

100ms = 0.1秒遅らせる処理だが、1秒間隔でLチカされている。

原因がわかった

工場から出荷される時に、クロックを1/8周期に設定しているのが原因。

100ms * 8 = 約1秒間

確かに1秒ぐらいLチカが遅れてたな。

でもクロック数は16MHzに指定してるはずだが...

Makefileを調べる

おかしい箇所は、Makefileしかない。

Makefileにはコメントがたくさん書かれていたので、削除した内容を貼っておく。

Makefile

DEVICE = atmega328p
CLOCK = 16000000
PROGRAMMER = -c avrisp2 -P usb
OBJECTS = main.o
FUSES      = -U lfuse:w:0xff:m -U hfuse:w:0xda:m -U efuse:w:0xfd:m 
AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)
COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE)

all:	main.hex
.c.o:
	$(COMPILE) -c $< -o $@

.S.o:
	$(COMPILE) -x assembler-with-cpp -c $< -o $@
.c.s:
	$(COMPILE) -S $< -o $@

flash:	all
	$(AVRDUDE) -U flash:w:main.hex:i

fuse:
	$(AVRDUDE) $(FUSES)

install: flash fuse

load: all
	bootloadHID main.hex

clean:
	rm -f main.hex main.elf $(OBJECTS)

main.elf: $(OBJECTS)
	$(COMPILE) -o main.elf $(OBJECTS)

main.hex: main.elf
	rm -f main.hex
	avr-objcopy -j .text -j .data -O ihex main.elf main.hex
	avr-size --format=avr --mcu=$(DEVICE) main.elf

disasm:	main.elf
	avr-objdump -d main.elf

cpp:
	$(COMPILE) -E main.c

Xcodeの設定を思い出す。

前回の記事で環境を構築するのにググった時、何も考えずに

TARGETS > firmware >Argumentsにflashを設定してしまった。

なぜ、みんなここをflashに設定しているのか...

f:id:araiyusukej:20141129003902p:plain

flashとは?

Makefileを読み直してみると、flashと書かれている箇所があった。

flash: all
$(AVRDUDE) -U flash:w:main.hex:i

Xcodeでビルドした時に、Makefileflashの部分が呼び出され

プログラムをビルドしてマイコンに書き込んでいるのか!!!

Lチカしてるので、プログラムの書き込みは問題無い。

もう一度、よくMakefileを見て、何が原因だったのかググってみた。

なんとマイコンの設定を変更するfuseを実行しないと、クロックが16MHzにならない。

fuse:
$(AVRDUDE) $(FUSES)

fuseは一度設定すればOK。

flash => fuseに変更してビルド。

f:id:araiyusukej:20141129210624p:plain

なんかエラーが出たが、fuse => flashに設定を戻してビルド。

まとめ

引数の時間通り無事動いた。

fuseという処理は、間違えるとライターで書き込むことができなくなる。

危険なのでよく調べて行うこと。