[マイコン] AVR ATtiny13AのLED点滅が遅い

[M1 Mac, Big Sur 11.6.8, avr-gcc 9.4.0, NO IDE]

ATtiny13AにつないだLEDの点滅が設定に比べて異様に遅いので色々調べてみると、システムクロック周波数がデフォルトで8分周(8分の1)になっていました。

対策としてavrdudeでヒューズビットを変更することにより1分周に変えます。コマンドは”make fuse”です。

Makefileは以下の通りです。ヒューズビットは16進数で表記されていますが、これでは各ビットの設定がわかりにくいため2進数表記に変えています。

DEVICE     = attiny13a
CLOCK      = 9600000
PROGRAMMER = -c avrispmkII
OBJECTS    = main.o
# FUSESのシステムクロック(lfuse第4ビット[下5桁目])を8分周から1分周に変更し2進数表記にした
FUSES      = -U lfuse:w:0b01111010:m -U hfuse:w:0b11111111:m
# デフォルト FUSES      = -U lfuse:w:0x6a:m -U hfuse:w:0xff: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

# 以下追記
# cファイルからsファイル作成
asm:
	$(COMPILE) -S main.c
	
# sファイルからhexファイル作成
tar:
	$(COMPILE) -o main.o main.s -c
	$(COMPILE) -o main.elf main.o
	rm -f main.hex
	avr-objcopy -j .text -j .data -O ihex main.elf main.hex
	avr-size --format=avr --mcu=$(DEVICE) main.elf

[マイコン] Apple SiliconでAVRマイコンにhexファイルを書き込む

[M1 Mac, Big Sur 11.6.8, avr-gcc 9.4.0, NO IDE]

AVRマイコンへの書き込みではWindows環境でMicrochip Studioを使うのが定石ですが、Apple Siliconでも可能です。

一時は2014年以前のMac購入を覚悟しましたが、有志の方々が作ったApple Silicon対応コンパイラのおかげで買わずに済みました。

以下のツール等が必要になります。

1.CrossPack-AVR : Makefile作成ツール
Apple Siliconの場合 : Homebrewからインストールする。

brew install --cask crosspack-avr

Intel Macの場合 : 公式サイトからダウンロードしてインストールする。

2.avrdude : ライター操作ツール
Homebrewからインストールする。

brew install avrdude

3.avr-gcc : AVRマイコン専用コンパイラ
/usr/local/CrossPack-AVR/bin/avr-gccは古いので使用不可(Mac mini 2014以前で使用可)。”Bad CPU type in executable”というエラーが表示される。
別途、Homebrew経由でGitHubから最新版をインストールする。

brew tap osx-cross/avr
brew install avr-gcc
不適合Macでのエラー表示

書き込み手順は以下の通りです。

1.以下コマンドでプロジェクトを作成し、firmwareディレクトリへ移動する。

avr-project [プロジェクト名]

2.Makefileを書き換える。ATtiny13Aの場合は過去のMakefileをそのまま使える。書き換え方法は参考サイトを参照。

3.main.cを作成する。

4.makeコマンドでコンパイルする。

make

5.自製書き込みボードにAVRマイコンを装着する。

6.マイコンと接続したライターをMacとUSB接続する。

7.電源3V(単3×2)を自製書き込みボードに接続する。ライターがオレンジ色に点滅する場合は、電源をプラマイ逆に接続し赤色にしてから、正しい電極にする。緑色になればOK。

8.make flashコマンドでAVRマイコンへ書き込む。

make flash

9.用意しておいたブレッドボードにマイコンを装着して動作確認する。

[マイコン] AVR ATtiny13でLED点滅 C++

[Windows11, Microchip Studio 7.0.2594]

久しぶりに電子工作の世界へ戻ってきました。

2016年8月にArduino UNOを購入して以来ちょくちょくいじってきましたが、あれからラズパイやJetson Nanoなどシングルボードコンピュータを経ての復帰です。

Arduinoは教育用ということでScketchというC言語風の簡易言語を使いますが、生意気にも購入当時はつぶしが効かないからと覚える気が全くなく、すぐに飽きてしまいました。

今はC/C++がそれなりに書けるようになり、アセンブリ言語の勉強にもなるので、Arduinoではなくマイコンを使ってみることにします。何に使うつもりだったのか覚えていませんが、たまたま8pinのATtiny13Aが手元にありました。

Arduinoマイコンの自製用にAVRISP mkIIという純正ライターを購入していたため(2016年9月)、すぐに取り掛かることができました。

とはいえ久しぶりのマイコンへの書き込みですから、大分手間取りました。今後のためにチェックシートを作成するつもりです。

それからIDEの名前がAtmel StudioからMicrochip Studioに変わっていました。UIはほとんど変わっていないと思います。

とりあえずC++でLEDを点滅させました。次はアセンブリ言語で書いてみたいです。

AVRISP mkIIによるATtiny13Aへの書き込み(USB, 電源接続前)
// ATtiny13A LED点滅
#define F_CPU 9600000UL

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	DDRB |= 0b00000001; //PB0を出力に設定
	while (1)
	{
		PORTB |= 0b00000001; //PB0をON
		_delay_ms(200); //200ms待機
		PORTB &= ~0b00000001; //PB0をOFF
		_delay_ms(200); //200ms待機
	}
}

[macOS] 拡張子とアプリの関連付け

[M1 Mac, Big Sur 11.6.8]

Finderからファイルを開こうとした場合、”情報を見る”で開くアプリを選択できますが、設定してもすぐにデフォルトに戻ってしまいます。

この仕様はWindowsに比べて著しく劣っているところでもあります。

SwiftDefaultAppsを使えばデフォルトのアプリを変えることが可能です。

なぜ標準でこの機能を搭載しないのか不思議です。

[LLDB] デバッガによる変数確認、逆アセンブル他

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

ポインタpのメモリ領域を確保して、空のままLLDBでその格納内容とメモリアドレスを確認しました。

正常なコードなので最終行で停止させ、printコマンドでポインタpのアドレスを出力しています。ついでにレジスタの状態や逆アセンブルを出力しました。

#include <cppstd.h>

int main() {
    char *p;

    p = (char*)malloc(sizeof(char));

    printf("ポインタpが格納しているcharは %s\n", *p);
    printf("ポインタpのアドレス(10進数)は %d\n", p);
    printf("ポインタpのアドレス(16進数)は %x\n", p);

    return 0;
}
$ lldb -f test
(lldb) target create "test"
Current executable set to '/test' (arm64).
(lldb) b 12
Breakpoint 1: where = test`main + 120 at test.cpp:12:5, address = 0x0000000100003ed8
(lldb) r
Process 87108 launched: '/test' (arm64)
ポインタpが格納しているcharは (null)
ポインタpのアドレス(10進数)は 2125136
ポインタpのアドレス(16進数)は 206d50
Process 87108 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100003ed8 test`main at test.cpp:12:5
   9   	    printf("ポインタpのアドレス(10進数)は %d\n", p);
   10  	    printf("ポインタpのアドレス(16進数)は %x\n", p);
   11  	
-> 12  	    return 0;
   13  	}
   14  	
   15  	
Target 0: (test) stopped.
(lldb) print p
(char *) $0 = 0x0000000100206d50 ""
(lldb) register read
General Purpose Registers:
        x0 = 0x0000000000000000
        x1 = 0x0000000000000000
        x2 = 0x00000000000120a8
        x3 = 0x0000000100808e31
        x4 = 0x000000016fdff140
        x5 = 0x000000016fdff540
        x6 = 0x000000000000000a
        x7 = 0x0000000000000000
        x8 = 0x00000001000cbdec  dyld`_main_thread + 172
        x9 = 0x00000001ff69c8d0  libsystem_kernel.dylib`errno
       x10 = 0x0000000000000002
       x11 = 0x00000000fffffffd
       x12 = 0x0000010000000000
       x13 = 0x0000000000000000
       x14 = 0x0000000000000000
       x15 = 0x0000000000000000
       x16 = 0x00000001942097d8  libsystem_kernel.dylib`__error
       x17 = 0x0000000202cc5650  (void *)0x00000001942097d8: __error
       x18 = 0x0000000000000000
       x19 = 0x0000000000000000
       x20 = 0x0000000000000000
       x21 = 0x0000000000000000
       x22 = 0x0000000000000000
       x23 = 0x0000000000000000
       x24 = 0x0000000000000000
       x25 = 0x0000000000000000
       x26 = 0x0000000000000000
       x27 = 0x0000000000000000
       x28 = 0x000000016fdff598
        fp = 0x000000016fdff560
        lr = 0x6310000100003ed4 (0x0000000100003ed4) test`main + 116 at test.cpp:10:5
        sp = 0x000000016fdff540
        pc = 0x0000000100003ed8  test`main + 120 at test.cpp:12:5
      cpsr = 0x20000000

(lldb) di
test`main:
    0x100003e60 <+0>:   sub    sp, sp, #0x30             ; =0x30 
    0x100003e64 <+4>:   stp    x29, x30, [sp, #0x20]
    0x100003e68 <+8>:   add    x29, sp, #0x20            ; =0x20 
    0x100003e6c <+12>:  mov    w8, #0x0
    0x100003e70 <+16>:  str    w8, [sp, #0xc]
    0x100003e74 <+20>:  stur   wzr, [x29, #-0x4]
    0x100003e78 <+24>:  mov    x0, #0x1
    0x100003e7c <+28>:  bl     0x100003ee4               ; symbol stub for: malloc
    0x100003e80 <+32>:  str    x0, [sp, #0x10]
    0x100003e84 <+36>:  ldr    x8, [sp, #0x10]
    0x100003e88 <+40>:  ldrsb  w10, [x8]
    0x100003e8c <+44>:  adrp   x0, 0
    0x100003e90 <+48>:  add    x0, x0, #0xf2c            ; =0xf2c 
    0x100003e94 <+52>:  mov    x9, sp
    0x100003e98 <+56>:  mov    x8, x10
    0x100003e9c <+60>:  str    x8, [x9]
    0x100003ea0 <+64>:  bl     0x100003ef0               ; symbol stub for: printf
    0x100003ea4 <+68>:  ldr    x8, [sp, #0x10]
    0x100003ea8 <+72>:  adrp   x0, 0
    0x100003eac <+76>:  add    x0, x0, #0xf5a            ; =0xf5a 
    0x100003eb0 <+80>:  mov    x9, sp
    0x100003eb4 <+84>:  str    x8, [x9]
    0x100003eb8 <+88>:  bl     0x100003ef0               ; symbol stub for: printf
    0x100003ebc <+92>:  ldr    x8, [sp, #0x10]
    0x100003ec0 <+96>:  adrp   x0, 0
    0x100003ec4 <+100>: add    x0, x0, #0xf88            ; =0xf88 
    0x100003ec8 <+104>: mov    x9, sp
    0x100003ecc <+108>: str    x8, [x9]
    0x100003ed0 <+112>: bl     0x100003ef0               ; symbol stub for: printf
    0x100003ed4 <+116>: ldr    w0, [sp, #0xc]
->  0x100003ed8 <+120>: ldp    x29, x30, [sp, #0x20]
    0x100003edc <+124>: add    sp, sp, #0x30             ; =0x30 
    0x100003ee0 <+128>: ret    
(lldb) exit
Quitting LLDB will kill one or more processes. Do you really want to proceed: [Y/n] y
$ 

[JavaScript] Chrome拡張機能の作成失敗

踏んでしまったアフィリエイトリンクをChromeのURLを書き換えて無効にするスクリプトを作成しようと3時間ほど格闘しましたが、結局できずでした。

スキル不足というのもありますが、ネット情報が陳腐化しているのか、ことごとくダメだったのがとても残念です。

本当にこの言語とはとことん相性が悪いです。生き馬の目を抜く商業主義の世界では技術革新が目まぐるしくて付いていくのも大変そうです。

ルールも何もGoogleの思惑次第ですから、何かしらの大きなメリットがないと積極的に取り組もうとは思わないですね。

スクレイピングでもそうですが、chromedriverを常に最新にしていないとPythonスクリプトが動かなくなるので日々のメンテが欠かせません。Googleと関わっていくのも手間がかかります。

扱い方によっては牧歌的にもなるC/C++の方が私には向いているのでしょう。次にJavaScriptを書くのはいつになることか。

JavaScriptについては気が向いたら書いてみるものの、満足に書けなくて悪態をついて去る、の繰り返しです。これまで学んできたPython、Java、C/C++などと違って全然スキルが積み上がっていかないのですから困ったものです。

まだ言語として体系的に把握できていないですし、そもそも体系的なのか疑問でもあります。なので書いていても地に足がつかない感じが半端ないです。

chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, tabs => {
    const url = tabs[0].url
    console.log("url: %s", url);
    
    if (url.match(/&tag=/)) {
        const urlSplits = url.split('&tag=');
        location.replace(urlSplits[0]);
        location.reload();
    }
})
{
  "name": "No Affiliate",
  "description": "",
  "version": "0.1",
  "manifest_version": 3,
  "content_scripts": [
    {
        "matches": ["https://*/"],    
        "js": ["noAffiliate.js"]
    }
  ],
  "permissions": [
    "tabs"
  ]
}

ベアボーンPC ASRock DeskMini B660とA300のCPU温度他比較

WindowsPCとしてASRockのDeskMini B660を購入しました。

以前から使用していたDeskMini A300はLinuxPCになりました。

双方のCPU温度等を測定しましたので載せておきます。

A300はAthlon純正ファンとDeskMini同梱ファンが全く同じで風切り音がうるさいため、大きめのファンに換えています。さらにBIOSのCPUファン設定をSilent Modeにしてようやく普通に使えるといった感じです。CPUファンは4ピンでないと回転数制御ができないので要注意です。

B660の方はCPUがエントリーモデルのCore i3 12100ではあるものの、動画再生時62℃とやや高めです。Intel 第12世代はこれ以上のスペックは厳しいかもしれません。

Core i3 12100の純正CPUファンはケースにピッタリ収まるサイズで静音性も高く、この点についてはAMDを凌駕しています。そもそもAthlonではなくRyzenでしたら純正ファンはケースに入らないのではないでしょうか。

あと熱問題との兼ね合いになりますが、内蔵グラフィックス搭載モデルの多いIntel CPUの方がDeskMiniと相性が良さそうです。

ただ7nmプロセスルールであると優良誤認しかねないIntel 7(実際は10nm)という紛らわしい呼称はいただけないですね。

第12世代の形状が長方形になってレバーにかける力がかなり強くなったのも、もう少し何とかならなかったのかと思います。あまりに強いので、組み付けが悪かったのかと途中で何度か止めました。

DeskMini A300をPsensorにて測定

実験用サーバ環境の構築 LinuxPC

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]
[Linux PC, Ubuntu 22.04.1 LTS]

これまではMac mini内に仮想サーバを立てていましたが、telnetサーバを設定する方法がわからないため、LinuxPCにtelnetサーバを立てて接続してみました。

LinuxPCはネットとつながっているので、ファイアーウォールでMac miniのみtelnet用23番ポートに接続できるようにしました。

Mac miniからtelnetで接続
LinuxPC側ファイアーウォール設定(UFW) 22番ポート開放の場合