AVR Butterfy                                kunioのHPへ

 いつかは遊んでみたいと思っていたAVR Butterfyが通販で入手できたのでLCD制御を中心に紹介します。
 
   (外付け電池用スナップとISP用のヘッダーピンを接続した後です)

キットの中身
 現物は名刺大の大きさとわかっていたが、パッケージはもっと大きくて簡単なマニアル付いているのかなと思ってましたが
本体よりひとまわり大きいパッケージに本体だけが入ってました。(^^;)
 概要のマニアルは、atmelのHPにありますが(日本語訳版がHEROさんのサイトにあり)、詳細は試行錯誤で勉強しろという
ことでしょう。

主な仕様
 ・CPU    atmega169
 ・LCD    H4042-DL 120セグメント、7桁表示(このキットでは全セグメントは表示できない)
 ・入力装置 5要素ジョイスティック(上・下・右・左・ボタン)
 ・電池    3Vボタン電池 CR-2450
 ・その他  温度センサー、圧電ブザー、4Mbitフラッシュメモリ等付属
 ・ファームウェアが既に書き込まれているので、付属電池ですぐに遊べます。(名前表示・時計・温度測定・メロディー演奏等々)
 ・拡張するためのI/Oポート等のコネクタが接続出来るようになっているので、ソースの書換えやI/Oの引き出しも容易に出来
  ます。

LCDの制御
 
そもそも、これをほしかったのはatmega169の機能確認、特にLCD制御機能について勉強したかったからであるので、それをまず
やってみた。
 atmelのサイトにこれのソースも公開されているがそれを全部読みきれないし、そもそもLCD制御の基礎がわかっていないので、
atmega169およびSK502(LCD解説)およびbutterflyのマニアルを縦横に見て理解しました。

 atmega169LCD制御機能
  
atmega169には、25セグメント×4共通電極(100セグメント)のLCD表示制御ができ、デューティ比、バイアス、フレーム周期、コント
  ラスト制御等を簡単に行えます。
   LCD制御レジスタ
    LCDCRA 制御・状態レジスタA   LCD使用許可、省電力、割込み等の設定
    LCDCRB 制御・状態レジスタB   クロック元、デューティ比、バイアス、セグメント制限の設定
    LCDFRR フレームレートレジスタ  クロックの分周設定(2段階)
    LCDCCR コントラスト制御レジスタ 電極駆動時間・電圧の設定
    LCDDR0〜19 データレジスタ    100セグメントに対応するメモリ、詳細なビットの対応は下表のとおり

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

com0

com1 

com2 

com3

-

-

-

-

-

-

-

SEGn24

LCDDR3

LCDDR8

LCDDR13

LCDDR18

SEGn23

SEGn22

SEGn21

SEGn20

SEGn19 

SEGn18

SEGn17

SEGn16

LCDDR2

LCDDR7

LCDDR12

LCDDR17

SEGn15

SEGn14

SEGn13

SEGn12

SEGn11

SEGn10

SEGn09

SEGn08

LCDDR1

LCDDR6

LCDDR11

LCDDR16

SEGn07

SEGn06

SEGn05

SEGn04 

SEGn03

SEGn02

SEGn01

SEGn00

LCDDR0

LCDDR5

LCDDR10

LCDDR15

  各bitに1を書くと表示される、n:0-3 共通電極com番号、LCDDR4/9/14/19は不使用

 共通電極com0に対応するセグメントはSEG000-024で、レジスタはLCDDR0−3 com1-3も同様

 今回の設定は事例を参考にして下記とした。
   供給クロック(CPU)8MHz、1/3バイアス、1/4デューティ、全セグメント使用
   前値分周4096、分周6としてフレームレート約41Hz 8M/(8*4096*6)=40.7
   駆動時間850us、バイアス電圧3.3V

  LCD(H4042-DL)仕様
   
H4042-DLの仕様は、SK502データシートの中にあります。

  ピン番号とセグメントの関係下記のとおり。

   

 BP1−4が共通電極、atmega169のcom0-3に接続
 atmega169のセグメント線seg0-24がピン04-29を接続、詳細下表のとおり 左から2桁のみセグメント記載(3−7桁も同様上表のピン番号を参照)

24

23

22

21

20

19

18

17

16

15

14

13 

12 

11 

10 

9 

8 

7 

6 

5 

4

3 

2

1

0

seg 番号

19,24

17

15

16

18

13

11

12

14

9

21

20

10

7

23

22

8

5

26

25

6

4

29

28

27

ピン番号

 

7桁

6桁

 5桁

4桁

   3桁 2M 2P 2N 2D  com3
                                          2L 2E 2G 2C  com2
  :                                         2J 2F 2H 2B  com1
                                          2K 1 S1 2A  com0
  1はLCDの’1’、S1は1の下の’へ’マーク、
  1桁目の表示、’6’、S6、X1のベルおよびX2の電池マークは表示できない(未接続)

 例えば上図のパターンのように’A’を表示させるにはABCEFGLのセグメントをONさせる必要があり2桁目の場合、
 seg3-0のbitで表すと、com3は0000、com2は1111、com1は0101、com0は0001となり
 LCDDR0,5,10,15レジスタの下位4ビットにそれぞれ設定すればよいことになる。
 3桁目は、seg4-7のためLCDDR0,5,10,15レジスタの上位4ビット同様に設定すれば’A’と表示される以下同様に
 4桁目はLCDDR1,6,11,16レジスタの下位4ビット、5桁目はLCDDR1,6,11,16レジスタの上位4ビット
 6桁目はLCDDR2,7,12,17レジスタの下位4ビット、7桁目はLCDDR2,7,12,17レジスタの上位4ビット
 それぞれにセグメントパターンデータを設定すればよい。
 英数字・アルファベットのパターンは、atmelのソースの中にあるのでそれを流用しました。 'A'の場合0x0f51

  テストパターン表示
  今まで内容を踏まえ、’KUNIO*’と表示させるソースを作りました。
  atmega169のヒューズビットの設定は、H:10-11001、L:11100010、X:----1111で初期値から変更されている。
  ブートローダは使わずリセット時のアドレスを$0000に戻すため、Hを10-11000に変更し、既存のhexファイルもsaveしてから
  書き込みました。
  
  
  ジョイスティックでコントラスト調整(上・下)と駆動時間の3パターン調整(左・右・ボタン)機能をつけました。
  コントラストの調整ははっきり分かりますが、駆動時間の変更は変わらないような気がします。