RPU-10講座/第三章 Flash ROM領域を使ったデータでのRS232C通信
すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。
■ATmega128のFlash ROMにデータを載せるには?
実は、ATmega128、ROM上にデータを配置したくても「const」という呪文をつけるだけではFlash ROM上に配置されません。前回の「第二章 RS232C通信で、データのやりとり」で紹介したプログラムのL35にて、
rs0_puts( “ECHO BACK PROGRAM” );
という行があります。この「”ECHO BACK PROGRAM”」というデータですが、まずFlash ROM上に配置され、プログラム起動時にRAM上にコピーされます。以降、この「”ECHO BACK PROGRAM”」は、RAM上に居座り続けます。RAMは4Kバイトしかありませんから、こんな感じで居座られたらすぐにRAMが足りなくなってしまいます。この程度のデータならば問題ありませんが、今後、あれこれ実装していくときに、角度データなども定義したくなります。そうなると、やはりきちんとFlash ROM上にデータを配置し、必要なときだけ読み出して使用する必要がでてきます。
というわけで、Flash ROM上に配置するように改良したプログラムを紹介します。
1: //—————————————————————————————-
2: // RS232Cで入力された文字をそのまま表示(エコーバック)
3: // パソコンのシリアル端末から入力された文字を、そのままパソコンに返します。
4: // 起動文字列は、Flash ROM領域に保存されたデータを使用します。
5: //
6: // 環境 RPU-10、GDL V2.00
7: // 説明 ビルドされた本プログラムをRPU-10へ転送後、パソコン側で「SIMPLE TERM」(GDLに
8: // 同梱)などを使って通信速度115200bpsで通信ポートを開いてください。その後RPU-10
9: // を再起動するとプログラムがスタートし、「SIMPLE TERM」の方に起動文字列が表示
10: // され、キーボードで文字を入力すると、入力された文字が表示されます。
11: //
12: // AUTHORED BY SISO JUNK STDUIO
13: //—————————————————————————————-
14: #include <avr/pgmspace.h>
15: #include <avr/io.h>
16: #include <avr/interrupt.h>
17: #include <avr/eeprom.h>
18: #include <stdio.h>
19: #include <avr/boot.h>
20: #include <avr/wdt.h>
21:
22: #include <sv.h>
23: #include <rs.h>
24:
25:
26: const char GPtitleData[] PROGMEM = “ECHO BACK PROGRAM”;
27:
28:
29: int main( void )
30: {
31: RPU_InitConsole( br115200 ); // RPU-10ライブラリの初期化
32: SV_Init( br115200 ); // サーボ制御ライブラリの初期化
33: sei(); // 割り込み処理開始
34:
35: // 1秒待つ(よく知らないけど必要らしい)
36: RPU_ResetTimerCounter();
37: while( RPU_GetTimerCounter10() < 100 );
38:
39: // 起動メッセージの表示
40: rs0_puts_P( GPtitleData );
41: while( 1 ){
42: // RS232Cで受信したデータをそのまま送信する。
43: rs0_putc( rs0_getc());
44: }
45:
46: return 1;
47: }
前のプログラムと異なるのはL26とL40です。
L26は、おまじないみたいなもんですが、こうやって宣言しておくとFlash ROM領域に配置し、RAMには自動的に領域を取らないようになります。詳しくは、過去のエントリに調査結果がありますので、そっちを参照してください。
L40ですが、またまた新しい関数、「rs0_puts_P()」が出てきました。これは、GDLのライブラリとして用意されているもので、Flash ROM領域からデータを読み込みながらRS232Cにデータを出力する関数です。このあたり、「rs.h」の中を見るといろいろあるので、そちらを見てみるのもいいかもしれません。
■ATmega128のFlash ROM後半について
ここからは推測ですが、「rs0_puts_P()」などの関数は、Flash ROM上の前半64Kバイトのところに配置されているデータに有効なプログラムじゃないかなぁって思います。なんとなくですけど。実際のところ、どうなんだろう???まあ、あまり気にしなくてもいいと思います。なぜかというと、リンクするときに、プログラム部分を後ろの方に、データ部分を前の方になるようにリンクしてくれるからです。だから、データ部分だけで64Kバイト超えるようなことがあると問題になるかもしれませんが、なかなかそこまでデータ入れることもないと思いますので、そのとき考えることにします。
※注意:本BLOGにてRPU-10での再プログラミングについての情報を公開していますが、これらはSISOが個人的に再プログラミングを行った時の技術情報を整理して紹介しています。GDLへのRPU-10ライブラリ同梱については、Best Technologyさんのご好意で、趣味人への1つのチャンスとして同梱してくださっていると理解しています。そのため、RPU-10の再プログラミングについては、くれぐれもご自身の責任で、また、Best TechnologyさんやFUTABAさんに問い合わせたりすることの無いようにお願いいたします。
Your Message