秋月電子 電光掲示板用シールド(2枚)

作業履歴

更新日
2012/12/17 公開開始


2013/01/23 Atmega1284PをArduino化しました。
秋月の電光掲示板モジュールを2枚挿せるベースボードの基板を作りました。
このベースボードに載るマイコンは、秋月電子で販売されているマイコン、ATmega1284Pを使っています。
ATmega1284Pを採用したのは、1)Flashメモリの容量が128kバイト、2)SRAMの容量が16kバイトと大容量のメモリを積んでいたためです。
また、SanguinoプロジェクトでATmega1284PをArduino化するブートローダーが公開されていたのが決め手になりました。

今日、秋月電子 電光掲示板用シールド(1枚)のファームウェアの実装もひと段落したので、2枚版の作業をしました。
・・・気分転換ともいいます:)

秋月で購入したATmega1284Pにはファームウェアが書き込まれていませんので、Atmega1284Pにブートローダーを書き込む作業をします。
ブランク状態のAVRにファームウェアを書き込むには、STK500やAVR ISPmkIIといったAtmel社のツールを使いますが、Arduino IDEとArduinoマイコンで代用できます。
手順については、Kosakaさんのページに詳細な説明がのっていて大変参考になりました。

今回は、ATmega1284PをArduino化する際、下記手順で作業しました。

○ソフトウェアの準備
1)Arduino IDE 1.0.3をダウンロード、展開(arduino-1.0.3フォルダが生成)
2)Sanguinoプロジェクトでファイル一式をダウンロード、展開
3)arduino-1.0.3\hardware\arduino\boards.txtに2)で展開したboards.txtを追加。
4)arduino-1.0.3\hardware\arduinoに2)の残りのファイルを上書き移動。
5)arduino-1.0.3\arduino.exeをダブルクリック
6)ツール→マイコンボード→Sanguino W/Atmega1284p 16mhzがあることを確認。

○Arduino UNOを書き込み装置にします。
Arduino UNOをPCに接続し、起動したArduino IDE上で下記のように作業します。
1)ツール→マイコンボード→Arduino UNO
2)ツール→シリアルポート→(Arduino UNOのCOMポート番号)
3)ファイル→スケッチの例→Arduino ISPを選択。
4)スケッチ→検証・コンパイル
5)ファイル→マイコンボードに書き込む
6)動作確認
LEDを7、8、9ピンに接続すると、Arduino ISPの状況がわかります。

// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave

9ピンに接続されたLEDピンが(ゆらぎ)点灯すれば、Arduino ISP化が完了です。

○Arduino UNOとAtmega1284Pを接続します。
1)Arduino ISPスケッチのコメントを参考にArduino UNOとAtmega1284Pを接続します。

信号名 Arduino UNO
ピン番号
Atmega1284P
ピン番号
ボードの
ピン番号
slave reset 10 9
MOSI 11 6
MISO 12 7
SCK 13 8

2)オートリセットの無効化
リセット端子に150オームの抵抗を+5Vでプルアップしました。

○Atmega1284Pにブートローダーを書き込みます。
1)ツール→マイコンボード→Sanguino W/ATmega1284p 16mhzを選択。
ツール→シリアルポートの設定は、Arduino UNOのCOMポート番号のままです。
2)ツール→ブートローダーを書き込む。

すると、Arduino IDEは、Arduino ISP化されたArduino UNOのSPI端子経由でAtmega1284Pにブートローダーを書き込みはじめます。
このときのLED端子の状態ですが、
ピン9:ゆらぎ点灯します。
ピン8:正常時は、消灯します。エラーが発生すると点灯するようです。
ピン7:Atmega1284Pと通信を行っているときに点灯します。

しばらく待っていると、Arduino IDEのコンソール上に書き込み完了通知が表示されます。

○Atmega1284Pにスケッチを書き込みます。
ブートローダーが正常にAtmega1284pに書き込まれ、Arduino化されたか動作確認します。

1)今回は、UARTのスケッチを使い動作確認しました。
ファイル→04.Communication→ASCIITableを選択

Atmega1284pのUARTの信号線とAKI232CWriterを接続します。

Atmega1284p
ピン番号
信号名
14 RX
15 TX


2)ツール→マイコンボード→Sanguino W/ATmega1284p 16mhzを選択。
3)スケッチ→検証・コンパイル
4)ツール→シリアルポート→(ATmega1284pのCOMポート番号=AKI232CWriterのCOMポート番号)
5)ファイル→マイコンボードに書き込む

正常に書き込まれることを完了後、シリアルモニタを起動し、ASCII文字列がAtmega1284pから出力されることを確認します。

2012/01/23 Arduino1284pで電光掲示板モジュールを制御する。
Arduino化したAtmega1284p(以下、Arduino1284p)で電光掲示板モジュールのスケッチを作成しました。
秋月電子 電光掲示板用シールド(1枚)で使用しているスケッチをベースに修正を行いました。

1)AkiMatrixライブラリのarduino-1.0.3に対応
arduino-0022ベースで実装してましたが、arduino-0022ではATmega1284pのスケッチをコンパイルできませんでした。
いい機会ですので、AkiMatrixライブラリをarduino-1.0.3に対応させます。
対応といってもインクルードするヘッダーファイルを変更するだけで、コンパイルが通るようになりました。

//#include <WConstants.h>
#include <Arduino.h>

修正内容は現在のところこれだけです。

2)Arduino1284pのピンアサイン情報
下記ヘッダファイルにArduino1284pのピンアサイン情報が記載されていました。
arduino-1.0.3\hardware\arduino\variants\standard\pins_arduino.h
括弧に書かれている番号が、スケッチに使用する番号です。

今回の電光掲示板シールド用にスケッチを下記のように修正。
AkiMatrix myMatrix = AkiMatrix(31, 30, 29, 28, 27, 26);

   1 // ATMEL ATMEGA644P / SANGUINO
   2 //
   3 //                   +---\/---+
   4 //  INT0 (D 0) PB0  1|        |40  PA0 (AI 0 / D31)
   5 //  INT1 (D 1) PB1  2|        |39  PA1 (AI 1 / D30)
   6 //  INT2 (D 2) PB2  3|        |38  PA2 (AI 2 / D29)
   7 //   PWM (D 3) PB3  4|        |37  PA3 (AI 3 / D28)
   8 //   PWM (D 4) PB4  5|        |36  PA4 (AI 4 / D27)
   9 //  MOSI (D 5) PB5  6|        |35  PA5 (AI 5 / D26)
  10 //  MISO (D 6) PB6  7|        |34  PA6 (AI 6 / D25)
  11 //   SCK (D 7) PB7  8|        |33  PA7 (AI 7 / D24)
  12 //             RST  9|        |32  AREF
  13 //             VCC 10|        |31  GND 
  14 //             GND 11|        |30  AVCC
  15 //           XTAL2 12|        |29  PC7 (D 23)
  16 //           XTAL1 13|        |28  PC6 (D 22)
  17 //  RX0 (D 8)  PD0 14|        |27  PC5 (D 21) TDI
  18 //  TX0 (D 9)  PD1 15|        |26  PC4 (D 20) TDO
  19 //  RX1 (D 10) PD2 16|        |25  PC3 (D 19) TMS
  20 //  TX1 (D 11) PD3 17|        |24  PC2 (D 18) TCK
  21 //  PWM (D 12) PD4 18|        |23  PC1 (D 17) SDA
  22 //  PWM (D 13) PD5 19|        |22  PC0 (D 16) SCL
  23 //  PWM (D 14) PD6 20|        |21  PD7 (D 15) PWM
  24 //                   +--------+
  25 //

3)スケッチ→検証・コンパイル
4)ツール→シリアルポート→(ATmega1284pのCOMポート番号)
5)ファイル→マイコンボードに書き込む

動作するようになりました。といいたいところですが、きわめて不安定な状況です。



2013/01/24Atmega1284pのヒューズビットを勉強する。
boards.txtにあるヒューズビットについて調べました。

疑問点がいくつか。
・Atmega328のヒューズビットの割り当てとほとんど一緒。
BOOTSZの設定値によりブートサイズ、位置がことなる。
JTAGの設定は、デフォルトイネーブル
・BOOTSZの設定は、bootloaderの領域を指しているのか?
・水晶振動子の場合、Low power crystalでいいのか?

##############################################################
atmega1284.name=Sanguino W/ ATmega1284p 16mhz

atmega1284.upload.protocol=stk500
atmega1284.upload.maximum_size=131072
atmega1284.upload.speed=57600

atmega1284.bootloader.low_fuses=0xFF
atmega1284.bootloader.high_fuses=0x9A
atmega1284.bootloader.extended_fuses=0xFF

atmega1284.bootloader.path=atmega
atmega1284.bootloader.file=ATmegaBOOT_168_atmega1284p.hex
atmega1284.bootloader.unlock_bits=0x3F
atmega1284.bootloader.lock_bits=0x0F

atmega1284.build.mcu=atmega1284p
atmega1284.build.f_cpu=16000000L
atmega1284.build.core=arduino
atmega1284.build.variant=standard
################################################


Extended Fuse Byte

Extended Fuse Byte Bit No Description Default value Arduino1284pの設定
(boards.txt)
- 7 - 1 1
- 6 - 1 1
- 5 - 1 1
- 4 - 1 1
- 3 - 1 1
BODLEVEL2 2 Brown-out Detector trigger level 1(unprogrammed) 1
BODLEVEL1 1 Brown-out Detector trigger level 1(unprogrammed) 1
BODLEVEL0 0 Brown-out Detector trigger level 1(unprogrammed) 1

(doc8272.pdf, Table27-3より転載)

BODLEVEL Fuse Coding

BODLEVEL 2:0 Fuses Min. Vbot Typ Vbot Max Vbot Units 備考
111 BOD Disabled Arduino1284pの設定
110 1.7 1.8 2.0 V
101 2.5 2.7 2.9
100 4.1 4.3 4.5
011 Reserved
010
001
000

(doc8272.pdf, Table 28-13より転載)


Fuse High Byte

High Fuse Byte Bit No Description Default Value Arduino1284pの設定
(boards.txt)
RSTDISBL 7 External Reset Disable 1(unprogrammed)
RESETピン 1:有効、0:無効
1
DWEN 6 debugWIRE Enable 0(programmed, JTAG enabled)
オンチップデバッグ
0:有効、1:無効
0
SPIEN 5 Enable Serial Program and Data Downloading 0 (programmed, SPI programming enabled)
0:ISP書き込み許可、1:禁止
0
WDTON 4 Watchdog Timer Always On 1(unprogrammed)
1:通常、0:常時ON
1
EESAVE 3 EEPROM memory is preseverd through the Chip Erase 1(unprogrammed),EEPROM not reserved
チップイレーズ時、EEPROMを
1:消去、0:保持
1
BOOTSZ1 2 Select Boot Size 0(programmed) 0
BOOTSZ0 1 Select Boot Size 0(programmed) 1
BOOTRST 0 Select Reset Vector 1(unprogrammed) 0


Boot Size Configuration

BOOTSZ1 BOOTSZ0 Boot size Pages Application
Flash
Section
Boot
Loader
Flash
Section
End
Application
Section
Boot Reset Address
(Start Boot Loader Section)
1 1 128words 2 0x0000 - 0x1F7F 0x1F80 - 0x1FFF 0x1F7F 0x1F80
1 0 256words 4 0x0000 - 0x1EFF 0x1F00 - 0x1FFF 0x1EFF 0x1F00
0 1 512words 8 0x0000 - 0x1DFF 0x1E00 - 0x1FFF 0x1DFF 0x1E00 Arduino1284pの設定
0 0 1024words 16 0x0000 - 0x1BFF 0x1C00 - 0x1FFF 0x1BFF 0x1C00

(doc8272.pdf, Table26-7より転載)


Fuse Low Byte

Low Fuse Byte Bit No Description Default Value Arduino1284pの設定
CKDIV8 7 Divide clock by 8 0(programmed) 1
CKOUT 6 Clock output 1(unprogrammed) 1 0(programmed):CLKOピンにシステムクロックを出力。
SUT1 5 Select start-up time 1(unprogrammed) 1
SUT0 4 Select start-up time 0(programmed) 1
CKSEL3 3 Select Clock source 0(programmed) 1
CKSEL2 2 Select Clock Source 0(programmed) 1
CKSEL1 1 Select Clock Source 1(unprogrammed) 1
CKSEL0 0 Select Clock Source 0(programmed) 1

(doc8272.pdf Table27-5より転載)

Start-up Times for the External Clock Selection

Power Conditions Start-up Time form Power
down and Power state
Additional Delay fom
Reset (Vcc=5.0V)
SUT 1..0
BOD Enabled 6CK 14CK 00
Fast rising power 6CK 14CK + 4.1ms 01
Slowly rising power 6CK 14CK + 65ms 10
Reserved 11 Unoの設定

(doc8272.pdf Table9-1より転載)

Device Clocking Options Select

Device Clocking Option CKSEL3..0
Low Power Crystal Oscillator 1111 - 1000
Arduino1284pの設定
Full Swing Crystal Oscillator 0111 - 0110 フルスイング、クリスタルで動作
0.4-20MHzで動作
CKSEL0でクロックの立ち上がりを規定(Table9-6)
Low Frequency Crystal Oscillator 0101 - 0100 外部32.768kHzクリスタルで動作
Internal 128kHz RC Oscillator 0011 内部128kHz発信回路で動作
Calibrated Internal RC Oscillator 0010 内部RC発信回路でクロックを生成
7.3 - 8.1MHzで動作
External Clock 0000 外部発信器で動作
0 - 20MHz
Reserved 0001

(doc8272.pdf, Table9-1より転載)


Low Power Crystal Oscillator Operating Modes

Frequency Range
(MHz)
Recommended Range for
Capactitos C1 and C2(pF)
CKSEL3..1
0.4 - 0.9 - 100
0.9 - 3.0 12 - 22 101
3.0 -8.0 12 - 22 110
8.0 - 16.0 12 - 22 111 Arduino1284pの設定

(doc8272.pdf Table 9 -3より転載)


Start-up Times fo the Low Power Crystal Oscillator Clock Selection

Oscillator Source/
Power Conditions
Start-up Time from
Power-down and
Power-save
Additional Delay
from Reset
(Vcc=5.0V)
CKSEL0 SUT1..0
Ceramic resonator, fast rising power 258CK 14CK + 4.1ms 0 00
Ceramic resonator, slowly rising power 258CK 14CK + 65ms 0 01
Ceramic resonator, BOD enabled 1K CK 14CK 0 10
Ceramic resonator, fast rising power 1K CK 14CK + 4.1ms 0 11
Ceramic resonator, slowly rising power 1K CK 14CK + 65ms 1 00
Crystal Oscillator, BOD enabled 16K CK 14CK 1 01
Crystal Oscillator, fast rising power 16K CK 14CK + 4.1ms 1 10
Cyrstal Oscillator, slowly rising power 16K CK 14CK + 65ms 1 11

(doc8272.pdf Table9-4より転載)

2013/01/25 Arduino1284p、動作不安定の原因がわかる。
前回の動作が不安定な件の続きです。
スケッチをシンプルなものに変えて現象を確認しますが、やはり動作は安定しません。
同じスケッチでも不具合が発生するタイミングが異なり、不具合が発生するとスケッチがリスタートします。
スケッチに依存性はないようですので、ハードウェアの方に根本的な問題がありそうです。
電源周りを強化するため、パスコンを載せてない基板にパスコンを追加します。
C11に100uF、C10に0.1uFを載せて再度テストをすると、、、動作が安定しました。

パスコン、大事ですね。
あ、実装前後の波形をとっておけばよかった。

2013/01/26 ProcessingでYahoo! RSSサービスを利用する。
ProcessingでYahoo! RSSサービスを利用したスケッチを作成します。
以下のようにデータを取得する仕組みを作ります。
Yahoo ! -> emaken.com -> Processing sketch -> 電光掲示板

Yahoo!は、UTF-8文字コードでニュース情報を配信するようです。
電光掲示板のデータフォーマットは、JISコードで構成されているので、文字コードを変換する作業が必要です。
サーバ(emaken.com)は、組み込み機器向けに最小データを配信するサービス(Simple API for embedded)を提供してましたが、文字コードの変換作業も行うようにします。
php utf-8 jis とキーワードをググるとコード変換するライブラリが用意されていることがわかりました。
早速phpに機能追加して、Chromeで意図どおりに動作することを確認できました。

以下は、Wiresharkでパケットキャプチャした結果です。
文字化けかつ、バイナリデータが表示されてません。解消するプラグインはあるのかな。


Processingは、XMLライブラリを利用し、データを取得します。
xmlで取得したデータをそのままコンソール上に表示するスケッチを作成、テストしますが、unicode 0x1bのためエラーが発生します。
ほかの代替可能なXML APIを探しますが、適当なものが見つかりません。
JISコードデータを取得するやり方は断念し、Processingか電光掲示板モジュール側で文字コードを変換する仕組みに切り替えることにします。

以下は、Processingのコンソール画面をキャプチャしたものです。
まずは、配信情報、UTF16形式の文字コードをバイナリ表示するテストスケッチを作成しました。


2013/01/27 - 01/31 東雲フォントのインプリ作業中
Arduino1284pに東雲フォントをインプリします。
ベースとなる東雲フォントデータは、shnmk16.bdfを使います。
秀丸マクロで、このデータをC言語形式のフォーマットに変換、区ごとに配列名を変えます。
フォントデータですので、Flash ROM上に定数として配置するためPROGMEM prog_uint16_tと宣言します。
スケッチからのアクセスは、pgm_read_word_nearAPIを使用します。
シリアルポートからデータを取得するプロトコルは、電光掲示板モジュール(1枚)と同じとします。
PCからJISコードを流すと、意図どおり電光掲示板に文字が表示されました。
続いて、サポート予定数の第一水準の漢字を含めたフォントデータ一式を組み込み、テストをします。
スケッチのコンパイルは完了し、Arduino1284pに書き込みますが、スケッチが動きません。
組み込みする文字数を減らすと正常に動作し、さらに現象を絞り込むと50150バイトの場合正常動作し、74214バイトの場合動かないことがわかりました。
64kバイトの問題だと思うのですが、解消方法がわかりません。
アドレスが、64kバイト未満だとpgm_read_word_nearを使い、64kバイト以上だとpgm_read_word_farを使うようです。
しかし、データの配置状況が不明です。リンカースクリプトで配置しますが、そのリンカースクリプトファイルが見当たりません。

2013/02/04 進展なし
Makefileにリンカースクリプトファイル名が書かれているはずと思い探し始める。file名の検索やgrepを使って探すが該当ファイルは見つからない。
arduino IDEツリーからファイルを削除、ビルドを繰り返し、該当ファイルの絞込み作業をするが該当ファイルを見つけられない。
arduino-1.0.3\hardware\arduino\bootloaders\atmega\Makefileもbootloader用のMakefileのようだ。

以下は、抜粋したMakefileです。

   1 # Makefile for ATmegaBOOT
   2 
   3 # program name should not be changed...
   4 PROGRAM    = ATmegaBOOT_168
   5 
   6 # enter the parameters for the avrdude isp tool
   7 ISPTOOL       = stk500v2
   8 ISPPORT       = usb
   9 ISPSPEED   = -b 115200
  10 
  11 MCU_TARGET = atmega168
  12 LDSECTION  = --section-start=.text=0x3800
  13 
  14 ISPFUSES    = avrdude -c $(ISPTOOL) -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
  15 -e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m
  16 ISPFLASH    = avrdude -c $(ISPTOOL) -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
  17 -U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x0f:m
  18 
  19 STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe"
  20 STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \
  21 -lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt
  22 STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt
  23 
  24 
  25 OBJ        = $(PROGRAM).o
  26 OPTIMIZE   = -O2
  27 
  28 DEFS       = 
  29 LIBS       =
  30 
  31 CC         = avr-gcc
  32 
  33 # Override is only needed by avr-lib build system.
  34 
  35 override CFLAGS        = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS)
  36 override LDFLAGS       = -Wl,$(LDSECTION)
  37 #override LDFLAGS       = -Wl,-Map,$(PROGRAM).map,$(LDSECTION)
  38 
  39 OBJCOPY        = avr-objcopy
  40 OBJDUMP        = avr-objdump
  41 
  42 all:
  43 
  44 atmega328: TARGET = atmega328
  45 atmega328: MCU_TARGET = atmega328p
  46 atmega328: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600
  47 atmega328: AVR_FREQ = 16000000L 
  48 atmega328: LDSECTION  = --section-start=.text=0x7800
  49 atmega328: $(PROGRAM)_atmega328.hex
  50 
  51 atmega328_isp: atmega328
  52 atmega328_isp: TARGET = atmega328
  53 atmega328_isp: MCU_TARGET = atmega328p
  54 atmega328_isp: HFUSE = DA
  55 atmega328_isp: LFUSE = FF
  56 atmega328_isp: EFUSE = 05
  57 atmega328_isp: isp
  58 
  59 atmega1284p: TARGET = atmega1284p
  60 atmega1284p: MCU_TARGET = atmega1284p
  61 atmega1284p: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=0' '-DBAUD_RATE=57600'
  62 atmega1284p: AVR_FREQ = 16000000L 
  63 atmega1284p: LDSECTION  = --section-start=.text=0x1F000
  64 atmega1284p: $(PROGRAM)_atmega1284p.hex
  65 
  66 atmega1284p_isp: atmega1284p
  67 atmega1284p_isp: TARGET = atmega1284p
  68 atmega1284p_isp: MCU_TARGET = atmega1284p
  69 atmega1284p_isp: HFUSE = DC
  70 atmega1284p_isp: LFUSE = FF
  71 atmega1284p_isp: EFUSE = FD
  72 atmega1284p_isp: isp
  73 

Arduino製品毎にLDSECTIONが定義されている。
atmega328は、0x7800、atmega1284は、0x1F000だった。
ATmegaBOOT_168_atmega328.hexは、0x7800、ATmegaBOOT_168_atmega1284p.hexは、0xF000となっている。
atmega1284pの0x10000は無視されている。
ispのキーワードは何を意味するのだろう?ISP経由でローダーを書き込むときに使用するパラメータなのか?ISPプログラミングをするとFUSEも自動的に書き換える仕様なのだろうか?

スケッチのMakefileではないようので、疑問点は保留にする。

ATmegaBOOT_168.cのファイルを見てみる。
色々なチップをサポートするために#ifdefの嵐だ。
main関数内でしょっぱな、ウォッチドッグの設定箇所がある。WATCHDOG_MODSでgrepすると、対象デバイスは、pro8, pro16, pro20だ。どんなデバイスなんだろう。
UARTの設定を行う箇所がある。DOUBLE_SPEEDのキーワードが目に付く。
grepすると、これは8MHzでデバイスを動作させた場合に、baudrateの設定値を16MHzの倍にするために使用されるパラメータのようだ。
flash_led関数でLEDが点滅する。
その後、forループが実行され、ループが5回繰り返されるとタイムアウトになり、app_start();関数が実行される。
app_start()は、void (*app_start)(void) = 0x0000;で定義されているとおり、PCを0x0000にセットする。
#if defined MONITOR のような使い方を知った。でも#ifdef MONITORでもよさそうだな。

MONITORコードはAtmega128, 1280向けのコードだ。
========
* monitor functions will only be compiled when using ATmega128, due to bootblock size constraints */
#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega1280__)
#define MONITOR 1
#endif
========

ループ内を見ると、stk500などのライターとやりとりを行い、スケッチを0x0000から書き込むようになっているようだ。

その後、arduino-1.0.3\revisions.txtを見るとビルド時に自動的に生成する仕様にArduino 0016から変更されていることがわかる。
=========
ARDUINO 0016 - 2009.05.30
[tools]
* Adding automatic dependency generation to the Makefile. (Lars Immisch)
=========

C:\Documents and Settings\kimai0827\Local Settings\Temp\build****************.tmpフォルダ以下を見る。
oファイルやdファイルはそのままなのにMakefileは見当たらない。
hexファイルの内容をみると0x0000からスケッチを書き込む仕様になっていた。

自分の力では、解決できないので先人の力を借りることにする。
arduino リンカースクリプトとググると、リンカースクリプトについて解説されている方がいらっしゃった。

以下、引用。
=====
sketchによるビルド時のリンカスクリプトを確認。make時のログではとくに指定されていないので、おそらくリンカにビルトインのものが使われている。実行されてているld(/usr/local/avr/bin/ld)に--verboseオプションをつけて実行してビルトインのスクリプトの内容確認。テキストはゼロ番地から配置されていてあっているみたい。
=====

ビルトインとは、ldを生成するときにリンカスクリプトファイルも組み込んでいることをいっているのかな。

arduino-1.0.3\hardware\tools\avr\bin\avr-ld.exe --verboseと実行してみる。
using internal linker script:と表示されている。
textの長さが8kなのが気になる。
リンカースクリプトはわかったが、makefileはどこなのだろうか?

   1 using internal linker script:
   2 ==================================================
   3 /* Default linker script, for normal executables */
   4 OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")
   5 OUTPUT_ARCH(avr:2)
   6 MEMORY
   7 {
   8   text      (rx)   : ORIGIN = 0, LENGTH = 8K
   9   data      (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0
  10   eeprom    (rw!x) : ORIGIN = 0x810000, LENGTH = 64K
  11   fuse      (rw!x) : ORIGIN = 0x820000, LENGTH = 1K
  12   lock      (rw!x) : ORIGIN = 0x830000, LENGTH = 1K
  13   signature (rw!x) : ORIGIN = 0x840000, LENGTH = 1K
  14 }


2013/02/05 進展なし2
avr-nm.exe dotmatrixled2013020601.cpp.elfを実行してみる。
アドレス0x10000以降にも配列が配置されている。

   1 0000d4fc T shnm_0208_SS_3C
   2 0000e0bc T shnm_0208_SS_3D
   3 0000ec7c T shnm_0208_SS_3E
   4 0000f83c T shnm_0208_SS_3F
   5 000103fc T shnm_0208_SS_40
   6 00010fbc T shnm_0208_SS_41
   7 00011b7c T shnm_0208_SS_42
   8 0001273c T shnm_0208_SS_43
   9 000132fc T shnm_0208_SS_44
  10 00013ebc T shnm_0208_SS_45
  11 00014a7c T shnm_0208_SS_46
  12 0001563c T shnm_0208_SS_47
  13 0000008c T shnm_Ascii_SS
  14 0080023b b timer0_fract
  15 00800237 B timer0_millis
  16 00800233 B timer0_overflow_count
  17 00016712 t turnOffPWM
  18 00800280 B tx_buffer
  19 00800308 B tx_buffer1

dotmatrixled2013020601.cpp.hexを確認する。
アドレスが重複している!と思ったが、4097行目の値が気になる。
intel hex フォーマットについて調べなおすと、どうやら拡張レコードという機能があるらしい。
拡張後のレコードアドレスは、0x1000 * 0x10 + ロードアドレスとして認識される。
hexファイルは正しく出力されている感じだな。

   1 :100000000C943FB10C946AB10C946AB10C946AB12F
   2 :100010000C946AB10C946AB10C946AB10C946AB1F4
   3 :100020000C946AB10C946AB10C946AB10C946AB1E4

4094 :10FFD00010211E3F10211021103F10000000FE3F95
4095 :10FFE00002200A218A28922412242220422E8221D1
4096 :10FFF0004221222612380220FE3F00000000FF1F8F
4097 :020000021000EC
4098 :1000000000100410C41F0410FF178414C414A41794
4099 :10001000241084148422642384430C1C0000FE27D3
4100 :100020000010F811080108010801F8790008080912

5870 :106EC000B30BE40BF50B661F771F881F991F1A94ED
5871 :106ED00069F760957095809590959B01AC01BD0117
5872 :106EE000CF010895EE0FFF1F0590F491E02D099456
5873 :046EF000F894FFCF44
5874 :106EF400737461727421000000000001B6DFB6955E
5875 :086F0400B5C6B5A6B5EFB50056
5876 :00000001FF


2013/02/06 Atmel Studio 6.0でメモリダンプしてみる。

Arudino1284pのブートローダーは、ATmegaBOOT_168_atmega1284p.hexを使っている。
ブートローダーがどこに書き込まれているか確認してみる。
拡張レコード機能を使っているので、実際に書き込まれるアドレスは、0x1F000−0x1F7D8のようだ。

   1 :020000021000EC
   2 :10F000000C9446F80C9465F80C9465F80C9465F82B
   3 :10F010000C9465F80C9465F80C9465F80C9465F8FC

 125 :10F7B000F89A992780B50895262FF999FECF1FBA98
 126 :10F7C00092BD81BD20BD0FB6F894FA9AF99A0FBE8A
 127 :08F7D00001960895F894FFCFA3
 128 :02F7D8008000AF
 129 :040000031000F000F9
 130 :00000001FF

このアドレスだと、スケッチのhexファイルのアドレス範囲とは異なるので、間違えて上書きされることもない。
しかし、BOOTSZ0, 1の設定によると0x1E00からブートされるはずなのだが。。。

AVRISP mkIIで、メモリダンプしてみる。
Atmel Studio 6.0をダウンロードする。あわせてリリースノートをチェックしてみる。



6.0からARMアーキテクチャをサポートし始めたようです。今後に期待です。
バグ情報もたくさん載っているな。


Atmega1284PおよびAtmega328Pをサポートしていることを確認。





Atmega1284PのコーナーにAVR製品を紹介したpdfファイルを見つけた。

製品の一望がわかるよくまとめられた資料だな。
製品名の最後のPは、picoPower機能をサポートしていることのようだ。





32bit版のAVR製品も機会があったら触ってみたいな。


Atmel Stduio6.0をダウンロードします。



ダウンロード後、exeファイルを実行すると、インストーラーが起動します。


以下、3つのツールをインストールしていきます。


まず、Microsoft .NET Framework 4をインストールします。




続いてVisual Stduio 2010 Shellをインストールします。










インストール完了後、PCを再起動する必要があります。


再起動後、自動的にインストーラーが起動します。


デバッガなど周辺機器用のデバイスドライバをインストールします。












最後にAtmel Stduio6.0のインストール作業を行います。









インストールが完了すると、.C, .S, .asm, .hファイルの関連付けを行うかたずねられます。


続いてAVRISPmkIIをPCに接続します。
接続すると自動的にデバイスドライバのインストール作業が開始されます。






インストール完了後、Atmel Studioを起動すると、更新内容があればお知らせが表示されます。


AVRISPmkIIのファームウェアを確認します。
Tools -> AVR Tools Frimware Upgradeを選択します。


AVRISPmkIIが接続されていれば、自動的に認識されます。
Upgradeの必要がある表示がされましたので、1.eから1.11へUpgrade作業を行います。
Upgradeボタンを押すと、FirmwareのUpgradeが開始されます。


Upgrade Done.というメッセージが表示されれば、完了です。
Refreshボタンを押して、バージョンを確認します。


1.11にファームウェアがUpgradeされたことを確認しました。


Atmega1284pのメモリをダンプして見ます。
接続方法は、AVRISPmkIIとAtmega1284pを接続します。
また、+5V電源を入力します。


Tools -> External Tools...を選択します。


Tool名をAVRISP mkII、DeviceをATmega1284P、InterfaceをISPにして、Applyボタンをクリックします。
Target Voltageで5Vが表示されることを確認します。
また、Device Signatureが0x1E9705であることを確認します。


Tool informationを選ぶと、AVRISP mkIIの情報がわかります。


Device information情報です。


Memoriesをクリックするとメモリの書き込み、消去、ダンプが行えます。


現在のFues設定が表示されます。boards.txt内容と同じです。
===========
atmega1284.bootloader.low_fuses=0xFF
atmega1284.bootloader.high_fuses=0x9A
atmega1284.bootloader.extended_fuses=0xFF
=============

BOOTSZの設定は、2048W_F800です。


現在のLockbits情報もわかります。


Production fileの項目がありました。製造時に使われる機能なのでしょうか?


データシートをもう一度読み直すと、BOOTSZのパラメータ値を勘違いしていたことがわかった。
ブートローダーのサイズは、2048wordsで、開始アドレスは、0xF800の設定になる。
hexファイルでは、0x1F000から書き込む設定になる理由がわかった。
hexファイルは、byte単位でアドレスをインクリメントして、AVRの場合は、words単位でアドレスを1インクリメントしている。
0xF800を1ビット左シフトすれば、0x1F000になる。
hexファイルと実際に書き込まれるアドレスの関係がこれでわかった。

Fueseビットについて修正したものを記載する。


Extended Fuse Byte

Extended Fuse Byte Bit No Description Default value Arduino1284pの設定
(boards.txt)
- 7 - 1 1
- 6 - 1 1
- 5 - 1 1
- 4 - 1 1
- 3 - 1 1
BODLEVEL2 2 Brown-out Detector trigger level 1(unprogrammed) 1
BODLEVEL1 1 Brown-out Detector trigger level 1(unprogrammed) 1
BODLEVEL0 0 Brown-out Detector trigger level 1(unprogrammed) 1

(doc8272.pdf, Table27-3より転載)

BODLEVEL Fuse Coding

BODLEVEL 2:0 Fuses Min. Vbot Typ Vbot Max Vbot Units 備考
111 BOD Disabled Arduino1284pの設定
110 1.7 1.8 2.0 V
101 2.5 2.7 2.9
100 4.1 4.3 4.5
011 Reserved
010
001
000

(doc8272.pdf, Table 28-13より転載)


Fuse High Byte

High Fuse Byte Bit No Description Default Value Arduino1284pの設定
(boards.txt)
RSTDISBL 7 External Reset Disable 1(unprogrammed)
RESETピン 1:有効、0:無効
1
DWEN 6 debugWIRE Enable 0(programmed, JTAG enabled)
オンチップデバッグ
0:有効、1:無効
0
SPIEN 5 Enable Serial Program and Data Downloading 0 (programmed, SPI programming enabled)
0:ISP書き込み許可、1:禁止
0
WDTON 4 Watchdog Timer Always On 1(unprogrammed)
1:通常、0:常時ON
1
EESAVE 3 EEPROM memory is preseverd through the Chip Erase 1(unprogrammed),EEPROM not reserved
チップイレーズ時、EEPROMを
1:消去、0:保持
1
BOOTSZ1 2 Select Boot Size 0(programmed) 0
BOOTSZ0 1 Select Boot Size 0(programmed) 1
BOOTRST 0 Select Reset Vector 1(unprogrammed) 0

(doc8272.pdf, Table27-4より転載)


以下の内容が、前回の記事と異なる。
こちらの内容がただしい。

Boot Size Configuration

BOOTSZ1 BOOTSZ0 Boot size Pages Application
Flash
Section
Boot
Loader
Flash
Section
End
Application
Section
Boot Reset Address
(Start Boot Loader Section)
1 1 512words 4 0x0000 - 0xFDFF 0xFE00 - 0xFFFF 0xFDFF 0xFE00
1 0 1024words 8 0x0000 - 0xFBFF 0xFC00 - 0xFFFF 0xFBFF 0xFC00
0 1 2048words 16 0x0000 - 0xF7FF 0xF800 - 0xFFFF 0xF7FF 0xF800 Arduino1284pの設定
0 0 4096words 32 0x0000 - 0xEFFF 0xF000 - 0xFFFF 0xEFFF 0xF000

(doc8272.pdf, Table26-16より転載)


Fuse Low Byte

Low Fuse Byte Bit No Description Default Value Arduino1284pの設定
CKDIV8 7 Divide clock by 8 0(programmed) 1
CKOUT 6 Clock output 1(unprogrammed) 1 0(programmed):CLKOピンにシステムクロックを出力。
SUT1 5 Select start-up time 1(unprogrammed) 1
SUT0 4 Select start-up time 0(programmed) 1
CKSEL3 3 Select Clock source 0(programmed) 1
CKSEL2 2 Select Clock Source 0(programmed) 1
CKSEL1 1 Select Clock Source 1(unprogrammed) 1
CKSEL0 0 Select Clock Source 0(programmed) 1

(doc8272.pdf Table27-5より転載)

Start-up Times for the External Clock Selection

Power Conditions Start-up Time form Power
down and Power state
Additional Delay fom
Reset (Vcc=5.0V)
SUT 1..0
BOD Enabled 6CK 14CK 00
Fast rising power 6CK 14CK + 4.1ms 01
Slowly rising power 6CK 14CK + 65ms 10
Reserved 11 Unoの設定

(doc8272.pdf Table9-1より転載)

Device Clocking Options Select

Device Clocking Option CKSEL3..0
Low Power Crystal Oscillator 1111 - 1000
Arduino1284pの設定
Full Swing Crystal Oscillator 0111 - 0110 フルスイング、クリスタルで動作
0.4-20MHzで動作
CKSEL0でクロックの立ち上がりを規定(Table9-6)
Low Frequency Crystal Oscillator 0101 - 0100 外部32.768kHzクリスタルで動作
Internal 128kHz RC Oscillator 0011 内部128kHz発信回路で動作
Calibrated Internal RC Oscillator 0010 内部RC発信回路でクロックを生成
7.3 - 8.1MHzで動作
External Clock 0000 外部発信器で動作
0 - 20MHz
Reserved 0001

(doc8272.pdf, Table9-1より転載)


Low Power Crystal Oscillator Operating Modes

Frequency Range
(MHz)
Recommended Range for
Capactitos C1 and C2(pF)
CKSEL3..1
0.4 - 0.9 - 100
0.9 - 3.0 12 - 22 101
3.0 -8.0 12 - 22 110
8.0 - 16.0 12 - 22 111 Arduino1284pの設定

(doc8272.pdf Table 9 -3より転載)


Start-up Times fo the Low Power Crystal Oscillator Clock Selection

Oscillator Source/
Power Conditions
Start-up Time from
Power-down and
Power-save
Additional Delay
from Reset
(Vcc=5.0V)
CKSEL0 SUT1..0
Ceramic resonator, fast rising power 258CK 14CK + 4.1ms 0 00
Ceramic resonator, slowly rising power 258CK 14CK + 65ms 0 01
Ceramic resonator, BOD enabled 1K CK 14CK 0 10
Ceramic resonator, fast rising power 1K CK 14CK + 4.1ms 0 11
Ceramic resonator, slowly rising power 1K CK 14CK + 65ms 1 00
Crystal Oscillator, BOD enabled 16K CK 14CK 1 01
Crystal Oscillator, fast rising power 16K CK 14CK + 4.1ms 1 10
Cyrstal Oscillator, slowly rising power 16K CK 14CK + 65ms 1 11

(doc8272.pdf Table9-4より転載)

AVRISPmkIIを使ってメモリダンプした。

上段のウィンドウが、bootloaderのhexファイルで下段のウィンドウがメモリダンプした結果です。
0x1F000以降にブートローダーが書き込まれていることを確認した。


2013/02/07 pgm_read_word_farで64kbyte以上の領域もアクセスできるようになった。
今日もGoogleでキーワード検索して解決策を探す。
ねむいさんのブログPIC AVR工作室GET_FAR_ADDRESS1の存在は知っていたが、そのときは、具体的にどうすれば(する必要があるのか)わからなかった。
やはり、GET_FAR_ADDRESS関数を使用する必要があるのかなと思いながら、キーワードを変えながら検索する。

2chのスレッドをみるとArduino mega2560で同じような質問をしている人がいた。(237


私の場合は、64kbytes以上のスケッチを書き込むと動作しなくなったので質問2の回答が気になった。
240さんの回答で私のスケッチも以下の症状がでているのではないかと思った。
AVR FreaksArduino.ccのフォーラムでセクションの設定をしていることを思い出す。



250さんが紹介してくれたSTK500通信プロトコルは、今度読んでみよう。


251さんのレスも参考になる。




対策1.
今まで下記のように行っていた変数宣言を
PROGMEM prog_uint16_t shnm_0208_SS_47[][16] = {

セクション指定を行い、スケッチの後半に配置した。
const uint16_t shnm_0208_SS_47[][16] __attribute__ ((section (".fini1"))) = {

こうすることで、64kバイト以上のフォントデータを組み込んだスケッチを書き込んでも動作するようになった。

対策2.
GET_FAR_ADDRESS関数を使うようにした。
pgm_read_word_far関数だけでアクセス可能かと思ったが、GET_FAR_ADDRESS関数の併用が必要でした。
GET_FAR_ADDRESS関数を使った場合、配列をアクセスする場合一工夫が必要のようです。

以上の対策をすることでフォントデータにアクセスできるようになりました。

2013/02/09 ドラジオの組み立て、車のバッテリー交換
子供と一緒にドラジオを組み立てる。
ドラジオとは、ドラえもんの形をしている携帯AM・FMラジオです。別に単4電池が2本必要です。
それにしても、部品点数が毎号減っているな。組み立ての難易度を下げるためなのか。

さくっと組み立てを終えて、文化放送にチャネルをあわせる。放送が意外と思ったよりきれいに入る。音量も十分だ。
上の子、下の子、二人とも興味深く放送を聴いている。うちの奥さんも気に入ってくれた。
プラスティック筐体で、しっかりとしたつくりです。いい表情です〜。


午後、近所のスーパーへ買い物をするため車に乗り込む。
だが、エンジンがかからない。今回は、ハザード・ライトをつけっぱなしにしていないことから、バッテリーの寿命が来てしまったようだ。
年末にバッテリーを一度切らしたので、電気をためる力が弱くなってしまったようだ。
JAFでもバッテリーの交換サービスをしてくれるようなので、お願いした。
1時間ほど、昼飯をたべながら、自宅にて待機する。

JAFの方が到着。交換作業をしていただく。
作業を横で観察する。

1)バッテリーの電圧を確認
2)外部バッテリーを印加し、エンジンをかける。エンジンがかかることを確認。
3)外部バッテリーを外す。
4)バッテリーの固定部のねじ留めを緩める。
5)再度外部バッテリーを印加。
ラジオ、ナビの設定データを保持するため。
6)端子、バッテリーを取り外す。
7)新品バッテリーを取り付ける。
8)端子を取り付け、固定部をねじ留めする。
9)外部バッテリーを外す。
10)バッテリーの電圧を確認。
11)エンジンをかける。
12)取り付け日が書いているシールを貼り付ける。
13)精算。バッテリー代、8000円なり。

無駄がなく、間違いがない作業工程だなと感心してしまった。

バッテリー交換後、買い物に行きました。
新品バッテリーのおかげで、エンジンのかかり具合が全然違いました。

2013/02/10 Arduino1284p + 電光掲示板 + AE-UM232で全角かな漢字データが表示できるようになった。
dotmatrixled2013021001.inoで横スクロール対応の電光掲示板が実現できた。
2週間かけて、64k超えアクセス問題を解決できた。長かった。

2013/02/11 Unicode->JISコード変換表
奥さん、子供たちがなかなか元気にならない。早く良くなってほしい。
UnicodeからJISコードに変換する方法を知りたくてググる。なかなか見つからない。
検索作業を繰り返すと、ここここここが特に参考になった。
変換テーブルという表現が気になり、さらに調べるとunicode.orgサイトに変換テーブルが存在することがわかった。
プログラムで変換作業するのではなく、変換テーブルを見ながら、Unicode -> JISコードに変更しないといけないのか?

2013/02/12 Unicode対応フォントデータでスケッチを作成する。
変換テーブルについては、確証を得られない。
Unicode用とJISコード用にフォントデータをとっておくわけにはいかない。
ネットとの親和性が高いのは、UnicodeだろうということでJISコードで作成したスケッチをすててUnicodeフォントデータを利用したスケッチを作成することにする。
1)東雲フォントのUnicode版のフォントデータをダウンロードする。
2)efont-unicode-bdf-0.4.2-src.tar.gzを解凍し、jiskan16-2000-1_uni.hexから、必要なフォントデータを抽出する。
3)UTF16番号の昇順に並べなおす。
4)下記の秀丸マクロでheaderファイルを生成。

   1 gofiletop;
   2 
   3 LINETOP:
   4 tab;
   5 insert "{0x";
   6 right 4;
   7 delete;
   8 
   9 insert ", 0x";
  10 
  11 #a = 0;
  12 while(#a < 15){
  13    right 4;
  14    insert ", 0x";
  15    #a = #a + 1;
  16 }
  17 
  18 right 4;
  19 insert "},";
  20 down 1;
  21 golinetop;
  22 goto LINETOP;
  23 
  24 

5)上位8ビットごとに配列を作る。
6)スケッチ内でheaderを宣言、受信したUTF16番号をテーブルから検索し、フォントデータを抽出するスケッチを追加。

6)の手作業に時間がかかりました。
配列を細かく分けすぎたためか、定義する配列の数が非常に多くなってしまった。
いざスケッチをコンパイルすると、フラッシュの容量オーバー発生。

検索、抽出関数を分けすぎて、フラッシュの容量を超えてしまったようです。

2013/02/13 またもや方針を変更する。
昨日のアプローチには、問題があったので方針を見直す。
2/10、完成したスケッチ、dotmatrixled2013021001.inoの容量、101,742バイトだ。あと、30kバイトも余裕がある。
unicode.orgに変換テーブルがある。
Unicodeで受信したデータをこの変換テーブルを参照してJISコードに変換し、データを抽出する方法をトライしてみよう。

昼休み、本屋さんでプログラマのための文字コード技術入門をみる。
やはり、変換テーブルを用意する必要があるようだ。テーブルを使い、Unicode <-> JISコードを変換するもののようだ。

以下の手順でヘッダーファイルを作成した。
1)変換テーブルを入手、不必要なテーブル情報を削除。
2)UTF16番号昇順にデータを変更。
3)下記秀丸マクロでheaderファイル用にフォーマットを生成。

   1 gofiletop;
   2 
   3 LINETOP:
   4 delete;
   5 delete;
   6 delete;
   7 delete;
   8 delete;
   9 delete;
  10 delete;
  11 
  12 insert "{";
  13 right 6;
  14 insert ",";
  15 right 7;
  16 insert "}, //";
  17 down 1;
  18 golinetop;
  19 goto LINETOP;
  20 

5)配列の宣言名を挿入するマクロを実行する。

   1 gofiletop;
   2 
   3 LINETOP:
   4 
   5 insert "const uint16_t utf16_jis[][2] __attribute__ ((section (\x22.fini1\x22))) = {";
   6 insertreturn;
   7 backspace;
   8 down 250;
   9 golinetop;
  10 goto LINETOP;
  11 

6)配列の終わりを示す"};"ところや配列名を追加する作業を行う。
7)UTF16で受信したデータをJISコードに変換するスケッチを作成。(dotmatrixled2013021304.ino、118,596バイト)
動作確認したところ、正常に動作しているようです。

2013/02/14 Yahoo! RSS ニュース -> emaken.com -> Processing(PC) -> 電光掲示板の表示ができるようになった。
1月26日以来、約3週間ぶりにProcessingのスケッチテストを行う。
Arduino1284pは、ヘッダー4バイト(パケットの長さ2バイト、モード2バイト)、UTF16データのフォーマットを受信できる。
Processingでヘッダー4バイトを付加するスケッチに変更してテストをするが、電光掲示板の文字は表示されない。
まずは、Processingのスケッチから正常なデータが送信されているか確認するためにAE-232MRをもう1つ用意する。
受信データをコンソールに表示する機能を実装すれば、TXDとRXDをワイヤで接続すればよいが、その機能の信頼性をテストする必要がある。
以下のような構成でAE-232MRを接続する。

キャプチャデータをみると、Processingのスケッチは正常なヘッダーを送っているのでProcessing側の問題ではないようだ。
もう一度Processingaが送信するデータを見ると、原因がわかった。アスキー文字列の受信処理を電光掲示板側に実装してないため動作しないのだ。
電光掲示板のスケッチを修正して、動作確認すると、正常動作した。
ただし、ところどころ、●の文字が表示される。
●は、フォントデータがない文字コードを受信した場合に表示される文字だ。
例えば、補正予算案、野党の文字列をYahoo ! RSSニュースから受信すると、電光掲示板は、●正●算案、●党と表示する。
補、予、野は、日常よく使われる漢字なのに、第1種に登録されてないのかとこちらのウェブサイトで再確認する。第1種に登録されていた。
にもかかわらず、電光掲示板に表示されないので、再度フォントデータを調べる。
大きな勘違いをしていたようだ。
ASHさんのJISX0208文字コード表でJIS第一水準漢字は、16区から47区の説明を0x47xxまでと解釈したのが原因だった。
0x4Fxxが正しい。

0x48xx〜0x4Fxxまでのフォントデータを保存できるFlash容量は残っていない。さてどうしよう。

2013/02/15 Unicodeフォントデータを用意する。
再検討した結果、UTF-16 <-> JIS変換表のテーブルを削除することにする。
さらに半角フォントデータなどを削ることにする。

1)東雲フォントのUnicode版のフォントデータをダウンロードする。
2)efont-unicode-bdf-0.4.2-src.tar.gzを解凍し、jiskan16-2000-1_uni.hexから、必要なフォントデータを抽出する。
3)UTF16番号の昇順に並べなおす。
4)下記の秀丸マクロでheaderファイルを生成。

   1 gofiletop;
   2 
   3 LINETOP:
   4 tab;
   5 insert "{0x";
   6 right 4;
   7 delete;
   8 
   9 insert ", 0x";
  10 
  11 #a = 0;
  12 while(#a < 15){
  13    right 4;
  14    insert ", 0x";
  15    #a = #a + 1;
  16 }
  17 
  18 right 4;
  19 insert "},";
  20 down 1;
  21 golinetop;
  22 goto LINETOP;
  23 
  24 

5)配列宣言するマクロを実行

   1 gofiletop;
   2 
   3 LINETOP:
   4 
   5 insert "const uint16_t unicode_shinonome[][17] __attribute__ ((section (\x22.fini1\x22))) = {";
   6 insertreturn;
   7 backspace;
   8 down 250;
   9 golinetop;
  10 goto LINETOP;

6)スケッチ内でheader(unicode.h)を宣言、関数を実装

2013/02/16-18 Yahoo ! RSSニュース->emaken.com ->Processing (PC) ->電光掲示板の表示
いくつかの修正を重ねてようやく電光掲示板にニュース記事が流れるようになりました。
Processing側のアプリの実装作業に移ります。

2013/02/18 Arduino1284pのフラッシュ書き込み容量サイズについて
フラッシュ容量ぎりぎりまでフォントデータを埋め込む作業している過程で気づきました。
それは、コンパイル後に表示される最大容量のサイズに間違いがある点です。

コンパイルした後、以下のように最大容量以下でしたので書き込みをしましたが、以下のエラーが表示されました。

ATMEGA1284pは、128kbytes = 131072バイトですが、実際に書き込めるサイズは、ブートローダーのサイズを引いた値になります。
したがって、128kbytes - 4kbytes = 126976バイトが正しいです。






UNOやAtmega328pのパラメータは正しい値でした。

2013/02/18-23 日時、Yahooニュース、天気、為替、秋月電子通商新商品、情報を電光掲示板に表示できるようになった。
Processing言語で実装したアプリが完成しました。


注文開始からボードの入手まで
2012/11/15 基板設計開始
2012/12/03 JetPCBに注文
2011/12/10 基板到着


参考URL
1)https://github.com/stevemarple/Calunium
2)http://blog.stevemarple.co.uk/2012/11/using-xboot-with-calunium.html
3)http://stastaka.wordpress.com/2011/03/10/arduinoisp/
4)http://www.geocities.co.jp/arduino_diecimila/use/attiny.html
5)http://ryanmsutton.com/2011/06/arduino-bootloader-for-atmega-1284p/
6)http://sanguino.cc/
7)http://arduino.cc/en/Tutorial/ArduinoISP
8)http://www.atmel.com/Images/doc8059.pdf
9)http://www.atmel.com/Images/doc2549.pdf


免責事項
1)サイトの内容について
ご自身の責任でご利用いただくようお願いします。この内容に直接間接により生じたいかなる損害にも一切保証しませんのでご了承ください。