google-site-verification: google3bd66dd162ef54c7.html

Arduinoで外付けEEPROMを使う 続編

 少し前にArduinoでI2Cの外付けEEPROMを使う記事を書きましたが、その後少しプログラムを改良。ダンプ出力の右側にASCII文字も表示させるようにしました。

 この機能は最初のプログラムを書いた時に入れたかった機能ですが、面倒だったので手抜きしていました。

 そのスケッチは以下の通りです。

/*
* I2C EEPROMの読み書きテスト
* 対応素子:24LC32, 24LC64, 24LC128, 24LC256, 24LC512
* 2015/07/03 ラジオペンチ http://radiopench.blog96.fc2.com/
* ダンプ出力ににASCII文字を追加
*/

#include <Wire.h> //I2C ライブラリ

unsigned int startADR = 0x0000;
unsigned int endADR = 0x1FFF; // アドレス上限指定 (24LC64なら0x1FFF)
unsigned int ADR;
byte data;
char ascii[16]; // ASCII文字表示用バッファ

void setup() {
Wire.begin();
Serial.begin(9600);

/* // EEPROMに値を書き込みたい場合はコメントアウトを外す
Serial.print("Writing");
for (ADR = startADR; ADR <= endADR; ADR++) { // 全アドレス範囲に
data = ADR >> 1; // アドレスを適当に細工してデーターを作る
i2cEEPROM_write( 0x50, ADR, data); // データーを書き込む(アドレス/256の値)
if ((ADR & 0xFF) == 0) {
Serial.print('.'); // 書き込み進行中表示
}
}
*/ // ここまで

Serial.println(); // 書き込み完了で改行
Serial.println(); //

Serial.println("EEPROM dump"); // EEPROMのダンプ開始
Serial.println("ADDR 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII CHARACTER");

for (ADR = startADR; ADR <= endADR; ADR++) { // 全アドレス範囲をダンプ
if ((ADR % 16) == 0) { // 行の先頭なら
printADR(ADR); // アドレス表示
for (int n = 0; n <= 15; n++) {
ascii[n] = ' '; // ASCII文字表示バッファを初期化
}
}
data = i2cEEPROM_read(0x50, ADR); // 外付けEEPROMから読み出し
Serial.print(data >> 4, HEX); // 上位4ビットを16進表示
Serial.print(data & 0x0F, HEX); // 下位4ビット
Serial.print(" "); // データ間にスペース入れ
if ((data > 0x20) & (data < 0x7F)) { // 表示可能文字なら
ascii[ADR & 0x0F] = data; // 表示バッファに記録
}
if ((ADR % 16) == 15) { // 行末なら
for (int n = 0; n <= 15; n++) { // ASCIIキャラクタで表示
Serial.print(ascii[n]);
}
Serial.println(); // 改行
}
if ((ADR & 0x00FF) == 0xFF) { // 256バイト毎に
Serial.println(); // 一行開ける
}
}
}

void loop() { // 無限ループで停止
}

void i2cEEPROM_write(int i2cADR, unsigned int eeADR, byte data ) {
Wire.beginTransmission(i2cADR); // i2cアドレス指定
Wire.write((int)(eeADR >> 8)); // EEPROM内アドレス指定 MSB
Wire.write((int)(eeADR & 0xFF)); // LSB
Wire.write(data);
Wire.endTransmission();
delay(5); // 書き込み完了待ち
}

byte i2cEEPROM_read( int i2cADR, unsigned int eeADR ) {
Wire.beginTransmission(i2cADR); // i2cアドレス指定
Wire.write((int)(eeADR >> 8)); // EEPROM内アドレス指定 MSB
Wire.write((int)(eeADR & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(i2cADR, 1); // 1バイトデータリクエスト
while (Wire.available()) { //
data = Wire.read(); // データ受信
}
return data;
}

void printADR(unsigned int a) { // アドレスを4桁表示
String b = "";
if (a < 0x1000) {
b = "0";
}
if (a < 0x100) {
b = "00";
}
if ( a < 0x10) {
b = "000";
}
Serial.print(b);
Serial.print(a, HEX);
Serial.print(" ");
}

これを実行すると、シリアルモニタに以下のようにEEPROMの内容をダンプします。なおこの内容は書き込みテストを実施した場合で、何も書いてないEEPROMでは全データーが0xFFになっているはずです。

Writing................................

EEPROM dump
ADDR 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII CHARACTER
0000 00 00 01 01 02 02 03 03 04 04 05 05 06 06 07 07
0010 08 08 09 09 0A 0A 0B 0B 0C 0C 0D 0D 0E 0E 0F 0F
0020 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17
0030 18 18 19 19 1A 1A 1B 1B 1C 1C 1D 1D 1E 1E 1F 1F
0040 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 !!""##$$%%&&''
0050 28 28 29 29 2A 2A 2B 2B 2C 2C 2D 2D 2E 2E 2F 2F (())**++,,--..//
0060 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 0011223344556677
0070 38 38 39 39 3A 3A 3B 3B 3C 3C 3D 3D 3E 3E 3F 3F 8899::;;<<==>>??
0080 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 @@AABBCCDDEEFFGG
0090 48 48 49 49 4A 4A 4B 4B 4C 4C 4D 4D 4E 4E 4F 4F HHIIJJKKLLMMNNOO
00A0 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 PPQQRRSSTTUUVVWW
00B0 58 58 59 59 5A 5A 5B 5B 5C 5C 5D 5D 5E 5E 5F 5F XXYYZZ[[\\]]^^__
00C0 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 ``aabbccddeeffgg
00D0 68 68 69 69 6A 6A 6B 6B 6C 6C 6D 6D 6E 6E 6F 6F hhiijjkkllmmnnoo
00E0 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 ppqqrrssttuuvvww
00F0 78 78 79 79 7A 7A 7B 7B 7C 7C 7D 7D 7E 7E 7F 7F xxyyzz{{||}}~~

0100 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87
0110 88 88 89 89 8A 8A 8B 8B 8C 8C 8D 8D 8E 8E 8F 8F
0120 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97
以下省略


 このプログラムでは単にインクリメントした値を書いています。フォントや変換テーブルなどランダムなデーターを書きたいという要望が最初の記事にありましたので、配列に定義したデーターを書くスケッチを下記に置いておきます。

 固定データー書き込み&ダンプのスケッチ

 このスケッチでは512バイトのデーターを書いています。Arduino UNOのCPUのATmega328PのRAMは2kバイトあるので、もう少し大きなデータも書けます。ただプログラムを実行するための各種の変数など、いろいろな情報の保存先として同じRAMが使われているので、この方法ではむやみに大きなデータを書くことはできません。
関連記事

コメントの投稿

管理者にだけ表示を許可する

懐かしいダンプリストです

PC-8001が出たばかりの頃にテンキーで一生懸命入力していたことを思い出しました。

HAMの活動が激減したのは、マイコンが個人でも購入可能な価格になった頃からです。

re:懐かしいダンプリストです

mytoshiさん今晩は。

そうですね、私も雑誌に載っていた機械語のプログラムを一生懸命入力していました。

それと、ダンプリストの右にASCII文字があると安心感がありますね。プログラム直してよかったです。
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード