今回は EEPROM データメモリへの書き込みを試してみた。 AT90S1200 にも 64 バイトのデータメモリがあり、こちらの書き込み方法を参考にいろいろ試してみたが、何度やってもデータメモリに書き込むことができなかった。 ATtiny15L のマニュアルを見たがなかなか理解できず、ようやく AT90S1200 とは命令の一部に違いがあることがわかった。 PIC のマニュアルのように、肝心な部分にはプログラミングサンプルを載せてあれば理解しやすいのにと思うのは私だけではないはず。
データメモリへのアクセスは I/O ポートアクセスとなるので in/out 命令を使うということをすでに周波数校正値の読み出しの時に学んだ。
EEPROM データメモリからの読み出しを復習してみると
@ 読み出したい EEPROM データメモリの番地を EEAR レジスタにセットする。
A EECR レジスタの bit1(EERE) に 1 をセットして読み込みモードに設定する。
B EEDR レジスタに指定したデータメモリの内容がセットされる。
という流れになる。
ldi temp,0x3F ; tempにEEPROMの最終番地をセット (1step) out EEAR,temp ; EEAR(EEPROM Address Register) (1step) ; 読み出すEEPROMのアドレスをEEARにセット sbi EECR,EERE ; EECR(EEPROM Control Register) (2steps) ; EERE(EEPROM Read Enable) ; EECRにEERE(読み込みモード)を設定 in temp,EEDR ; EEDR(EEPROM Data Register) (1step) ; EEDRに読み出されたデータをtempにセット out OSCCAL,temp ; OSCCAL(Oscilator Caliblation Register)(1step) ; OSCCALレジスタに周波数校正値をセットEEPROM データメモリへの書き込みは
ldi temp,0x30 out EEAR,temp ldi temp,5 out EEDR,temp sbi EECR,EEMWE sbi EECR,EEWE wait: sbic EECR,EEWE ; Skip if Bit in I/O Register Cleared rjmp wait ; EECRレジスタのEEWEビットがクリアされたら次の書き込みがOK ldi temp,0x31 out EEAR,temp ; 書き込むアドレスをEEARにセットする ldi temp,8 out EEDR,temp ; 書き込むデータをEEDRにセットする sbi EECR,EEMWE ; この記述が ATtiny15L では必要なのを見落としていた sbi EECR,EEWEでは実際に AVRstudio を使ってシミュレーション画面で見てみよう。
EEPROM データメモリへの書き込みプログラムをコンパイルし、生成された HEX ファイルを AVR にライタで書き込んでみると、秋月の PIC Writer Ver.4 では書き込み後にベリファイエラーがでた。 EEPROM データメモリ表示は書き込んだ後も変化がないが、リードコマンドを実行してみたらなんと EEPROM データメモリの 30 番地と 31 番地に 5 と 8 が書き込まれていた。どうしてこのようになるのだろう。プログラムが実行されるときに書き込まれると思っていたのだが・・・。実用上はこれでも問題ないが何とも不思議だ。
今までデータメモリを使うようなプログラムを組んだことがないが、例えばデータメモリにあらかじめ PWM 制御のデータを書き込んでおいて、プログラム内で参照するような利用方法も考えられるが、プログラムメモリ内で処理するのとどちらが処理スピードが速いだろう?それとも、もっとよい利用方法があるだろうか。
まとめてみると比較的簡単に EEPROM にアクセスすることができるということがわかるが、理解できるようになるまで半日以上を費やしてしまった。