nobcha23の日記

PICマイコンやArduinoを使う電子回路遊びを紹介します

セットアップ、ホールドどっちも必要だった

こんにちは、今回PIC16F1827を使い、時計機能付き温湿度計でシリアル出力と言うのを手掛けたわけです。

こんな感じで温度と湿度をシリアル9600bpsで吐きだしてくれます。

今回PIC16F1827を16MHzで動かしてLCD表示したのですが、LCDの表示が8MHzのときはOKだったのに16MHzにするとだめです。そういえば、以前16MHzではだめで8MHzにしぶしぶ戻して実験を終えたことがありました。なぜ16MHzにするとLCDの表示が上手くないのか。
SC1602の仕様書見てもEのエンディングエッジで取り込むとあり、データのセットアップは100ns,ホールドは10nsなので、16MHzにしてもサイクルは4MHzであるから、IO命令IO命令がバックツーバックでも250nsは取れるはずではないですか。

今回

void	LCD_STROBE(unsigned char lcd_data,unsigned char lcd_rs){	// PIC16F1827 対応RA0-RA3:data
	LATA=lcd_data |(PORTA&0xF0 );	// Lower 4bits:data Upper bits remain
	LCD_RS=lcd_rs;			// RS set:RB7
	__delay_us(10);			// タイミング APPEND on 5/25/2014
	LCD_EN=1;			// EN
	__delay_us(10);			// タイミング
	LCD_EN=0;			// EN off:RB6
	__delay_us(10);			// タイミング
	}		

LCD_RS=lcd_rs; // RS set:RB7
の後に __delay_us(10); を追加したら、表示が正常になりました。

更にLCDのメーカや品番を変えると誤動作の挙動が変わりました。

今一つ不明ですが、LCDを4ビット接続で制御するときのテクニックとして覚えておきましょう。