ATtiny85でArduino言語のインラインアセンブラを使うときの自分なりのメモ
ATtiny85でArduino言語のインラインアセンブラを使ってみています。→ ATtiny85をインラインアセンブラでプログラムしてRGBLEDテープを動かしてみた自分なりに頭の中を整理するために,イメージしている事も含めてのメモです。オヤジの勝手な解釈も含まれているので,正確な情報は参考にした公式のデータシートとAVRインストラクションセットマニュアルに書かれています(^^;;;1.ATtiny85のPin配置 ATtiny85は8Pinで電源(+-)以外はPORTBに所属しています。NeoPixel系のLEDにはコントロール線を1本だけPB1につないでいます。Webで見られる制作記事もPB1につないでいるのが多いのはPB1がI2CやADCの機能を担当していないからでしょうかね。2.ATtiny85のイメージ マイクロコンピュータというだけあって,メモリも全て自前で持ち,外の世界にアドレスバスやデータバスが出る事は一切なく,PORTを介してデータのやりとりをしています。 じっと見ているとPORTBが鎖国時代の長崎の出島に見えてきます(^^;;;。・プログラムメモリ フラッシュメモリなのでPCにさすUSBメモリと同じで電源を切っても消えません。・データメモリ SRAMで一部は32個の汎用レジスタと64個のI/Oレジスタに使われています。 レジスタの次のアドレスからグローバル変数が格納され,ローカル変数などはスタックを介して上の方のアドレスで発生,消滅を繰り返しているようです。・EEPROM EEPROMも超小型にしては結構な容量がありますが,メモリとしては外様扱いでI/Oレジスタを介して読み書きします。3.汎用レジスタのメモ SRAMの一部を8bitの汎用レジスタとして使っています。 32個もあるのですが,下位の16個は使いづらく,最後の8個はペアで16bitに使えるので,中間の8個が使いやすい「汎用」レジスタですね。 先述のLEDテープを動かすのに作ったアセンブラで使ったレジスタは4個だけです(^^;;;; 16bitのペアが可能なレジスタはメモリのアドレスを指すインデックスとしての働きに強く,専用の命令が用意されています。 昔々の8080のBC,DE,HLペアというかZ80のIX,IYレジスタと同じような感じですかね。4.I/Oレジスタの概要 I/Oレジスタは様々なコントロールのセンター的な働きをするので,64個あっても結構混雑しています(^^)。 タイマー,割り込み系統などのレジスタを省略したメモ図です。 ポートの初期設定などは普通のArduino言語で行っておき,スピードが必要な時にアセンブラでコントロールするのが効率的だと思います。 ちなみにRGBLEDテープのプログラムでアセンブラが触っているのはPORTBの出力のbit1だけです(^^;;;;;;;;5.RGBLEDテープ用プログラムに使用した命令セットのメモ グローバル変数からデータを読み込み,それに応じたパルスをひたすら出力するだけの仕事なので,使っている命令の種類も少ないですね(^^;;;;;;;;。・小文字のkはアドレスの入力 上記の例のようにグローバル変数のアドレスは(変数名)で指定し,アセンブラ内の飛び先などはラベルを作ってそこに飛ぶようにするとアセンブラ が自動で計算してくれるので手間いらずですV(^^)・配列変数はスタートアドレスをインデックスレジスタに代入する 配列変数名は配列変数のスタートアドレスのポインタなので一度16bitの整数に代入し,上下のbyteに分けてインデックスレジスタに引き渡しています。これが正しい方法なのかどうかわかりませんが,,うまくいっています。・I/Oポートの指定アドレスは命令によって異なる SBIやCBIのようなI/O専用の命令の場合はI/Oアドレス内の番地を使い,PORTBは0x18です。 メモリを対象とした命令も使えますが,その場合はSRAM全体を対象としたアドレスを書くのでPORTBは0x0038になります。う〜む,PORTBのbit1をHigh/LowさせるのにOUT命令かSBI/CBI命令か悩みました,,。SBI/CBIの方がオヤジには分かりやすいのですが2サイクルかかりそうで,,ま,パルス は出せたので良しとします。まぁ,速いマイコンを使えばなんてことはないのでしょうが,小さい8pinマイコンで面白い事ができるのはまた別の楽しみがありますね(^^)