LCDに関する奇妙な問題(HD44780互換)

私はHD 44780と互換性のあるディスプレイ(16 x 2)とインターフェースしようとしていますが、解決できない奇妙な問題がいくつか発生しました。

私の設定:

  • LCDを4ビットモードで使用しています(上位4ビット、D4〜D7、 私が見つけたすべてのガイド、順番は正しい - 私は数回チェックした)
  • LCDは5Vの安定化電源で動作しています。 (私は3.3Vを試してみましたが、同じ結果、コントラストが下がっています)。
  • R/Wラインはプルダウン抵抗( 書き込みモード)
  • コントラストはポットで設定され、起動時に1行の正方形が見えるようになります。
  • 非常に遅いタイミングを使用しています(最大200ms待機 - 最大有効 - 200ms - データ変更 - 最大200ms - 下位有効)

私の初期化シーケンス:

(RSが低い)

  • 0x03 - (three times) (sent as one nibble/byte)
  • 0x02 - Enable four bit mode (sent as one nibble/byte)
  • 0x28 - Function set (2 line, 4 bit) (sent as two nibbles, ms nibble first)
  • 0x01 - Clear (sent as two nibbles)
  • 0x06 - Set entry mode (increment cursor on write, no display shift) (sent as two nibbles)
  • 0x08 - Display, cursor and blink off (sent as two nibbles)
  • 0x0F - Display, cursor and blink on (sent as two nibbles)

ここで、予想通りに起こらないことがいくつかあります。

  • 2行モードが有効になっていないようです(2行目に暗い背景の四角は表示されず、文字は表示されません)。
  • クリアされません
  • カーソルは、このinitシーケンスの最後の最初のマスではなく、3番目のマスにあります。

次に、RSハイの文字をいくつか書いて、1文字につき2ニブルを送ります。

Here too, I get weird behavior: Instead of writing 1 character per 2 nibbles, it writes 2 (one per nibble). I made it go through the chars 0-15 and I get random symbols (eg slash) and Japanese chars. All of them are from random places on the char table, mostly the bottom row, not in any normal order, but always the same chars in the same order get printed.

My question: I've really run out of ideas to fix this. Am I missing anything obvious? What problems could I be having and how can I debug further?

Edit: This is what I see on my screen after init, it may be helpful LCD after init

編集2:

私のメインコード:

GPIOPin lcdEnablePin = PIN_B(11);
GPIOPin lcdRSPin = PIN_B(10);
GPIOPin lcdDataPins[] = {PIN_E(2), PIN_E(3), PIN_E(4), PIN_E(5)};

//Set all pins as outputs
GPIO::pinModeDigital(lcdEnablePin, 1);
GPIO::pinModeDigital(lcdRSPin, 1);
for(int i = 0; i < 4; i++)
 GPIO::pinModeDigital(lcdDataPins[i], 1);

GPIO::writePinDigital(lcdRSPin, 0); //Instruction register
lcdSendData4(lcdEnablePin, lcdDataPins, 2); //Enable 4 bit
lcdSendData8(lcdEnablePin, lcdDataPins, 40); //Function set, 2 line
lcdSendData8(lcdEnablePin, lcdDataPins, 1); //Clear and return home
lcdSendData8(lcdEnablePin, lcdDataPins, 2); //Entry Mode, Increment cursor position, No display shift
lcdSendData8(lcdEnablePin, lcdDataPins, 8); //All off
lcdSendData8(lcdEnablePin, lcdDataPins, 15); //All on

GPIO::writePinDigital(lcdRSPin, 1); //Data register
for(int i = 0; i < 16; i++) //Write test data, 4 bit because that's what seemed to work
 lcdSendData4(lcdEnablePin, lcdDataPins, i);

私のSendData関数:

void lcdSendData4(GPIOPin lcdEnablePin, GPIOPin lcdDataPins[], char data)
{
 simpleBusy();

 //Set enable high
 GPIO::writePinDigital(lcdEnablePin, 1);

 simpleBusy();

 //Write data
 for(int i = 0; i < 4; i++)
  GPIO::writePinDigital(lcdDataPins[i], data & (1 << i));

 simpleBusy();

 //Falling edge
 GPIO::writePinDigital(lcdEnablePin, 0);
}

void lcdSendData8(GPIOPin lcdEnablePin, GPIOPin lcdDataPins[], char data)
{
 lcdSendData4(lcdEnablePin, lcdDataPins, data >> 4); //Send MSB
 lcdSendData4(lcdEnablePin, lcdDataPins, data); //Send LSB
}
3
データシートのタイミングに従いましたか?
追加された 著者 Dan,
書き始めるまでに十分な時間がありますか。そして、「プルダウン」抵抗とは何ですか?
追加された 著者 Spehro Pefhany,
Sphero:抵抗は1kです
追加された 著者 user39579,
イグナシオ:私は特定のLCD用のデータシートを持っていませんが、私が使っている遅延はHD44780データシートで指定された最大時間をはるかに超えています。私が質問で述べたように、私は約200ミリ秒のイネーブルハイで、データが書き込まれる間の約200ミリ秒とイネーブルの立ち下がりエッジの後の約200ミリ秒を費やします。
追加された 著者 user39579,
私も0x03sなしで試してみましたが、残念ながら違いはありませんでした。モードは1回しか設定できないことを読みましたが、この0x03のシーケンスは特別な「ハードリセット」であることも読みました。また、最初に実行した命令が4ビットモードに設定されていることを確認するために、物理的にディスプレイの電源を切ってから再接続し、initシーケンスを開始する前に少し待ちます。これまでのところあなたの提案をみんなありがとう。
追加された 著者 user39579,
initが終了した後に何が起きるのかを示す写真を追加しました。出力は常にこのようになります。
追加された 著者 user39579,
ついに何かがうまくいった!余分なデータピンの1つを接地しようとしたところ、すべての文字が変わりました。 :)面白いのは、順番がキャラクターマップの順番とまったく同じではないということです。だから今の質問は、どうやって私は4ビットモードに入ることを確認するのですか?
追加された 著者 user39579,
ソースを追加しました。 このページもご覧ください。誤ってトリガーされるのを防ぐために、有効にするために10kプルダウンを追加してみました、助けにはならなかった。念のため、明日すべての接続を解決することを試みるかもしれません。
追加された 著者 user39579,
男私は今私がどれほどばかげているかを表す言葉を見つけることができません。私はもう一度自分のつながりを見て、D6とD5が私のブレッドボードからLCDに向かって交換されていることに気づいた。今すべてがうまくいきます。ご意見をお寄せいただきありがとうございます。混乱して申し訳ありません。 Venny - あなたは私が受け入れるべき答えとして同じ上のニブルを持つ文字のあなたの認識を追加するべきです。
追加された 著者 user39579,
最初の3つの0x03が8ビットモードを有効にしていませんか? データシートにあります。 42と46ページのあいまいさがあるようです。
追加された 著者 venny,
このデータシートには素晴らしいフローチャートが記載されています。ページ14(12とラベル付けされています)が表示され、0x02 0x02 0x08のみが必要であると表示されています。
追加された 著者 venny,
文字はまったくランダムではありません。それらはすべて1 1 1 1で下位の4ビットを持っています。 D [0..3]パッドを指で触れて、文字が変わるかどうか確認してください。
追加された 著者 venny,
おそらくあなたのソースコードを追加することができます、データのタイミングとフォーマットに問題があるかもしれません
追加された 著者 venny,

4 答え

一部のモデルでは、初期セットアップコマンドを複数回送信する必要があります。私が積極的な、パルス的な方法で電力を消費するモデルもあるので、電源レールノイズを避けるためにLCDの電源(+ - )の近くに大きなコンデンサを持ってください。

1
追加された

初期化に必要な遅延を考慮しましたか。データシートによると、最初の0x3を送信した後は4.1 ms以上待つ必要があります。

0
追加された
EE.SEへようこそ。私たちはフォーラムではなくQ/Aのようなサイトです。質問へのコメントとして適していると思われる回答を投稿しました。将来的には、答えはより大きく、より複雑な支援のためのものであることを忘れないでください。
追加された 著者 Funkyguy,
@Funkyguy IIRC StackExchangeは、15ポイント未満の担当者がコメントすることを許可せず、回答するだけです。 chamodはおそらくその時点で彼が許可していたすべてのサイトをやった。 (私の場合はそれほど前ではありませんでした:)
追加された 著者 DaveBoltman,

私は同じような振る舞いをした表示を一度得ました。私はそれを8ビットモードに3回設定する必要があり、4ビットモードに「実際に」持ってくるためにはもう一度4ビットモードに設定する必要がありました。 これが私が4ビットモードで動作する唯一の方法でした。 多分これは役立ちます。

0
追加された
表示が4ビットモードの場合、各トランザクションの上半分と下半分を区別するのは、表示が4ビットモードに切り替えられてから偶数または奇数のトランザクションがあるかどうかだけです。 8ビットに切り替えてから戻すと、ソフトウェアとディスプレイは互いに同期します。
追加された 著者 firedfly,

あなたはこれまでE行について言及していません。

Eは低く、次にデータを提示する必要があり、Eを高く、その後低く設定する必要があります。

0
追加された
ええ、質問で述べたように、それは私がしていることで、各ステップの間に200ミリ秒の遅れがあります。
追加された 著者 user39579,
フォーラムへようこそ!そしてそう、彼はそうしました。 5行目(11行目)にあります。
追加された 著者 venny,