SSブログ

I2Cを使う PIC16F876A PCF8574AN

お客様の案件で I2C を使う回路設計の必要が在りました
はい、過去形ですが実は没に成って仕舞った案件です
然し乍ら設計者のさがで一度始めると納得行くまでやって仕舞う
この悪い癖、何とかしなければならないのですが・・・・

でも、やって置けば其れだけ後々何かの役に立つ事も有るでしょう
という訳でドキュメントを残す意味で簡単な回路を組んでみました
まず、使用するICは・・・・

CPU が PIC16F876A  28pin Dip MICROCHIP社
日本語マニュアルが用意されているので製作記事が多いです
このPICにはMSSP(Master Synchronous Serial Port)が内蔵され
これがあることでI2Cが利用しやすいわけです
他のデバイスICと高速にシリアル通信をするためのモジュールで、SPIと
I2Cという2種類の動作モードで使うことができます。

F4671628-01

 RC3/SCK/SCLとRC4/SDI/SDA を使います。

bandicam 2018-12-10 11-31-00-992




IO Expander が PCF8574AN TEXAS社
16pin Dip で 8bit I/O です
回路を組む上で注意しなければならない事が有ります
それは出力で使うときの電流値です
Low出力は50mA流せますからリレー動きますよね
ところが
High出力はたったの4mA
LEDを点灯しようとしても昔のLEDだと暗くて話しに成りません
もう一つ押さえておきたいことは入力として使用した場合
OPEN = High だという事です、入力端子の空きピン処理は考慮に
入れて置かなければなりませんね
F5170249-01
pcf8574a-pin
またスレーブアドレスが僅かな型式違いで異なるので知らないと焦ります
驚くのは同じPCF8574Aでもスレーブアドレスが違うって・・・何?
購入するときは良く確認しなければなりません

bandicam 2018-12-07 00-02-28-302

bandicam 2018-12-10 09-41-15-897


どう考えてもおかしい、このスレーブアドレスで設計された記事を
全く見掛けません、マニュアルのダウンロードにもご注意下さい
仮にスレーブアドレス 0x20 とした場合、READ アドレスは 0x21
てなければならない、なのに A0 = High と成ったときに 0x21に
成って居ます、通常は LSBがHigh に成った場合スレーブアドレスは
0x02加算されなければなりません、なんで?
bandicam 2018-12-06 23-59-09-840




これらを使って LEDの点滅、詰まり Lチカ をやってみようと思います
この組み合わせにした理由ですが下記の様な条件が在ったからです・・・

・GPIOを使う
・LEDを50個ぐらい使う
・スイッチを20個ぐらい使う
・メンブレン・パネルに実装したい
・UART / I2C は可能
・SPI はダメ

・・・とこんな条件なのですがGPIOではピン数が限定的でとても
これだけの I/O はカバー仕切れません、その為に IO Expander を採用しました
I2Cにしたのは過去にハードウェアのみ経験しているからです

ところが採用したい I2C のソフトウェアに問題が在るのです
私はめっきりソフトウェアに弱いので皆様のように C言語でサクッ!! っと
プログラミング出来ません、なのでどうするか・・・・

・アセンブラ言語とする
・可能な限りネット検索してプログラムを引っぱってくる
・ブレッドボードを使う

・・・・こんな地味ぃな戦略なのです

2018/12/07(金)
ブレッドボードに仮組みしてみました

DSCN9756

写真で出来て居る事は、出力制御です、8bit 出力の確認をLEDで
行って居ます。
ここで判った事ですが上でも書いたように出力が Low / High で
電流値が大きく異なり、実際のLEDを接続するとこんな感じです。
この写真は出力Highの様子です、LEDは点いているのか消えているのか
良く視ないと判別がつきません
DSCN9752

一方でこの写真は出力Lowの様子で、これが正常ですよね。
DSCN9753

この様にバッファー・ドライバー無しで使うときは注意が必要です
トランジスタ・アレイ程度ならHighでドライブ出来ると思いますが
確認はマストですね。

話が少し逸れますが、使用している PIC KIT3 ですが壊した経緯が
有ります、原因はVDDに +24V が印加された為、PIC KIT3のあの
スケルトンで中が燃えているのが見えました、ひやぁーーー、でした
まぁ回路屋なので回路図をネット検索して探し、壊れて居そうな部品
をRSコンポーネンツで購入し直しました、ですがもう二度とあんな事は
嫌なのでプロテクタを中間に入れて使用しています。
DSCN9772

ツェナーダイオードの大きめのを入れ、抵抗が燃え切れる様にしました
序でなのでPIC KIT3が付いたままだと動かない事、って有りますよね
なので CLK / DAT をスイッチで切れる様にもして居ます、以来
気をつけているのでトラブルは無いですが、また在ると嫌だな。

DSCN9773

ブレッドボードで製作した回路ではプログラムに書かれたHEXデータ
1byte 分をLED表示するというものです
参考にと言うかコピーしたプログラムで引用元はこちらです

ソースコードの窓をこのブログに作りたいのですが面倒なので
後回しです、下記の通りです、折り返しが出ていますので
コピペの後、ご注意下さいこのままだとコンパイルエラーが出ます
因みにコンパイラは MICROCHIP社MPLABXIDEを使って居ます
ここから
;***************************************************************************************************************

;This software is provided in an “AS IS” condition,NO WARRANTIES in any form apply to this software.

; picmicrolab.com 5.31.2014
;***************************************************************************************************************
; PCF8574 I2C  8-bit IO expander interface with PIC16F876A;
;-------------------------------------------------------------------------------------;
		LIST 	P=PIC16F876A
		include	P16f876A.inc

 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _LVP_OFF & _DEBUG_OFF & _CPD_OFF

	    org		0x00
reset:	goto start
	    org		0x04
start:

	bcf		STATUS, RP0
	bcf		STATUS, RP1
	movlw		0x28
	movwf		SSPCON
	bsf		STATUS, RP0
	BSF		SSPSTAT, SMP
	BCF		SSPSTAT, CKE
	CLRF		TRISB
	BSF		TRISC, 0x04	;SDA
	BSF		TRISC, 0x03	;SCL
	MOVLW		0x21
	MOVWF		SSPADD
LOOP:	
	BCF		STATUS,RP0
SENDB:
	BCF		PIR1,SSPIF	
;*********************START****************************************************
	BSF		STATUS, RP0	
	BSF		SSPCON2, SEN	; INITIATE START
	BCF		STATUS, RP0
SENDB2:
	BTFSS		PIR1, SSPIF	;START COMPLETED?YES SKIP NEXT
;*********************SLAVE ADDRESS-READ AFTER SETTING WORD ADDRESS*************

	GOTO		SENDB2
	BCF		PIR1, SSPIF	;YES,CLEAR FLAG
	MOVLW		0x40;		;0x40 is the  SLAVE ADDRESS   
	MOVWF		SSPBUF		;INITIATE SEND 
;SLAVE ADDRESS
SENDB3:
	BTFSS		PIR1, SSPIF	;SEND COMPLETED? YES,SKIP NEXT
	GOTO		SENDB3
	BCF		PIR1, SSPIF	;YES,CLEAR FLAG
	BSF		STATUS, RP0
	BTFSC		SSPCON2,ACKSTAT	;ACK RECEIVED FROM SLAVE?IF YES SKIP
	GOTO	 	SENDB5		;IF NO,END 

;*********************SEND Control Byte ****************************
	BCF		STATUS, RP0
	MOVLW		0x55		;Port Data		
	MOVWF		SSPBUF		;BEGIN TRANSMISSION
SENDB4:
	BTFSS		PIR1,SSPIF	;SEND COMPLETED?IF YES SKIP NEXT
	GOTO		SENDB4
	BCF		PIR1,SSPIF	;YES,CLEAR FLAG
	BSF		STATUS, RP0
	BTFSC		SSPCON2,ACKSTAT	;ACK RECEIVED FROM SLAVE?IF YES SKIP
	GOTO		SENDB5		;IF NO,END 
;*********************STOP****************************************************

    	BSF		STATUS,RP0
	BSF		SSPCON2,PEN
	BCF		STATUS,RP0
SENDBI:
	BTFSS		PIR1,SSPIF	
	GOTO		SENDBI
	BCF		PIR1,SSPIF
;*********************SEND NOACK TO END TRANSACTION*****************************
	BSF		STATUS,RP0
	BSF		SSPCON2,ACKDT	;SELECT NOACK
	BSF		SSPCON2,ACKEN	;INITIATE ACKNOWLEDGE SEQUENCE
	BCF		STATUS,RP0
SENDBC:
	BTFSS		PIR1,SSPIF	;ACK SEQUENCE COMPLEMENTED;IF YES SKIP
	GOTO		SENDBC	
	BCF		PIR1,SSPIF
;*********************	INITIATE STOP*******************************************
SENDB5:	
	BSF		STATUS,RP0
 	BSF		SSPCON2,PEN
	BCF		STATUS,RP0
SENDBE:	
	BTFSS		PIR1,SSPIF	
	GOTO		SENDBE
	BCF		PIR1,SSPIF

	goto		LOOP

end

ここまで

スレーブアドレス下記の部分です
MOVLW 0x40; ;0x40 is the SLAVE ADDRESS
LED表示データは下記の部分です
MOVLW 0x55 ;Port Data
プログラムの大まかな流れは
・I2Cの設定
・スタート・コンディションの開始
・スレーブアドレス送信 + WRITE モード
・ACK待ち
・LEDに表示するデータ送信
・ACK待ち
・ストップ・コンディションの開始
・LOOP

これらは全てI2Cの様々な解説に書かれていることです、こちらが参考に成ります

実際のCLK/DATの波形です、上がCLK  下がDAT
何故か同期はビデオだと良く見えました、なんで?
DSCN9754

DSCN9761



---記事制作中---

続きを読む


nice!(0)  コメント(0) 

I2Cを使う PIC16F876A PCF8574AN

お客様の案件で I2C を使う回路設計の必要が在りました
はい、過去形ですが実は没に成って仕舞った案件です
然し乍ら設計者のさがで一度始めると納得行くまでやって仕舞う
この悪い癖、何とかしなければならないのですが・・・・

でも、やって置けば其れだけ後々何かの役に立つ事も有るでしょう
という訳でドキュメントを残す意味で簡単な回路を組んでみました
まず、使用するICは・・・・

CPU が PIC16F876A  28pin Dip MICROCHIP社
日本語マニュアルが用意されているので製作記事が多いです
このPICにはMSSP(Master Synchronous Serial Port)が内蔵され
これがあることでI2Cが利用しやすいわけです
他のデバイスICと高速にシリアル通信をするためのモジュールで、SPIと
I2Cという2種類の動作モードで使うことができます。

F4671628-01

 RC3/SCK/SCLとRC4/SDI/SDA を使います。

bandicam 2018-12-10 11-31-00-992




IO Expander が PCF8574AN TEXAS社
16pin Dip で 8bit I/O です
回路を組む上で注意しなければならない事が有ります
それは出力で使うときの電流値です
Low出力は50mA流せますからリレー動きますよね
ところが
High出力はたったの4mA
LEDを点灯しようとしても昔のLEDだと暗くて話しに成りません
もう一つ押さえておきたいことは入力として使用した場合
OPEN = High だという事です、入力端子の空きピン処理は考慮に
入れて置かなければなりませんね
F5170249-01
pcf8574a-pin
またスレーブアドレスが僅かな型式違いで異なるので知らないと焦ります
驚くのは同じPCF8574Aでもスレーブアドレスが違うって・・・何?
購入するときは良く確認しなければなりません

bandicam 2018-12-07 00-02-28-302

bandicam 2018-12-10 09-41-15-897


どう考えてもおかしい、このスレーブアドレスで設計された記事を
全く見掛けません、マニュアルのダウンロードにもご注意下さい
仮にスレーブアドレス 0x20 とした場合、READ アドレスは 0x21
てなければならない、なのに A0 = High と成ったときに 0x21に
成って居ます、通常は LSBがHigh に成った場合スレーブアドレスは
0x02加算されなければなりません、なんで?
bandicam 2018-12-06 23-59-09-840




これらを使って LEDの点滅、詰まり Lチカ をやってみようと思います
この組み合わせにした理由ですが下記の様な条件が在ったからです・・・

・GPIOを使う
・LEDを50個ぐらい使う
・スイッチを20個ぐらい使う
・メンブレン・パネルに実装したい
・UART / I2C は可能
・SPI はダメ

・・・とこんな条件なのですがGPIOではピン数が限定的でとても
これだけの I/O はカバー仕切れません、その為に IO Expander を採用しました
I2Cにしたのは過去にハードウェアのみ経験しているからです

ところが採用したい I2C のソフトウェアに問題が在るのです
私はめっきりソフトウェアに弱いので皆様のように C言語でサクッ!! っと
プログラミング出来ません、なのでどうするか・・・・

・アセンブラ言語とする
・可能な限りネット検索してプログラムを引っぱってくる
・ブレッドボードを使う

・・・・こんな地味ぃな戦略なのです

2018/12/07(金)
ブレッドボードに仮組みしてみました

DSCN9756

写真で出来て居る事は、出力制御です、8bit 出力の確認をLEDで
行って居ます。
ここで判った事ですが上でも書いたように出力が Low / High で
電流値が大きく異なり、実際のLEDを接続するとこんな感じです。
この写真は出力Highの様子です、LEDは点いているのか消えているのか
良く視ないと判別がつきません
DSCN9752

一方でこの写真は出力Lowの様子で、これが正常ですよね。
DSCN9753

この様にバッファー・ドライバー無しで使うときは注意が必要です
トランジスタ・アレイ程度ならHighでドライブ出来ると思いますが
確認はマストですね。

話が少し逸れますが、使用している PIC KIT3 ですが壊した経緯が
有ります、原因はVDDに +24V が印加された為、PIC KIT3のあの
スケルトンで中が燃えているのが見えました、ひやぁーーー、でした
まぁ回路屋なので回路図をネット検索して探し、壊れて居そうな部品
をRSコンポーネンツで購入し直しました、ですがもう二度とあんな事は
嫌なのでプロテクタを中間に入れて使用しています。
DSCN9772

ツェナーダイオードの大きめのを入れ、抵抗が燃え切れる様にしました
序でなのでPIC KIT3が付いたままだと動かない事、って有りますよね
なので CLK / DAT をスイッチで切れる様にもして居ます、以来
気をつけているのでトラブルは無いですが、また在ると嫌だな。

DSCN9773

ブレッドボードで製作した回路ではプログラムに書かれたHEXデータ
1byte 分をLED表示するというものです
参考にと言うかコピーしたプログラムで引用元はこちらです

ソースコードの窓をこのブログに作りたいのですが面倒なので
後回しです、下記の通りです、折り返しが出ていますので
コピペの後、ご注意下さいこのままだとコンパイルエラーが出ます
因みにコンパイラは MICROCHIP社MPLABXIDEを使って居ます
ここから
;***************************************************************************************************************

;This software is provided in an “AS IS” condition,NO WARRANTIES in any form apply to this software.

; picmicrolab.com 5.31.2014
;***************************************************************************************************************
; PCF8574 I2C  8-bit IO expander interface with PIC16F876A;
;-------------------------------------------------------------------------------------;
		LIST 	P=PIC16F876A
		include	P16f876A.inc

 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _LVP_OFF & _DEBUG_OFF & _CPD_OFF

	    org		0x00
reset:	goto start
	    org		0x04
start:

	bcf		STATUS, RP0
	bcf		STATUS, RP1
	movlw		0x28
	movwf		SSPCON
	bsf		STATUS, RP0
	BSF		SSPSTAT, SMP
	BCF		SSPSTAT, CKE
	CLRF		TRISB
	BSF		TRISC, 0x04	;SDA
	BSF		TRISC, 0x03	;SCL
	MOVLW		0x21
	MOVWF		SSPADD
LOOP:	
	BCF		STATUS,RP0
SENDB:
	BCF		PIR1,SSPIF	
;*********************START****************************************************
	BSF		STATUS, RP0	
	BSF		SSPCON2, SEN	; INITIATE START
	BCF		STATUS, RP0
SENDB2:
	BTFSS		PIR1, SSPIF	;START COMPLETED?YES SKIP NEXT
;*********************SLAVE ADDRESS-READ AFTER SETTING WORD ADDRESS*************

	GOTO		SENDB2
	BCF		PIR1, SSPIF	;YES,CLEAR FLAG
	MOVLW		0x40;		;0x40 is the  SLAVE ADDRESS   
	MOVWF		SSPBUF		;INITIATE SEND 
;SLAVE ADDRESS
SENDB3:
	BTFSS		PIR1, SSPIF	;SEND COMPLETED? YES,SKIP NEXT
	GOTO		SENDB3
	BCF		PIR1, SSPIF	;YES,CLEAR FLAG
	BSF		STATUS, RP0
	BTFSC		SSPCON2,ACKSTAT	;ACK RECEIVED FROM SLAVE?IF YES SKIP
	GOTO	 	SENDB5		;IF NO,END 

;*********************SEND Control Byte ****************************
	BCF		STATUS, RP0
	MOVLW		0x55		;Port Data		
	MOVWF		SSPBUF		;BEGIN TRANSMISSION
SENDB4:
	BTFSS		PIR1,SSPIF	;SEND COMPLETED?IF YES SKIP NEXT
	GOTO		SENDB4
	BCF		PIR1,SSPIF	;YES,CLEAR FLAG
	BSF		STATUS, RP0
	BTFSC		SSPCON2,ACKSTAT	;ACK RECEIVED FROM SLAVE?IF YES SKIP
	GOTO		SENDB5		;IF NO,END 
;*********************STOP****************************************************

    	BSF		STATUS,RP0
	BSF		SSPCON2,PEN
	BCF		STATUS,RP0
SENDBI:
	BTFSS		PIR1,SSPIF	
	GOTO		SENDBI
	BCF		PIR1,SSPIF
;*********************SEND NOACK TO END TRANSACTION*****************************
	BSF		STATUS,RP0
	BSF		SSPCON2,ACKDT	;SELECT NOACK
	BSF		SSPCON2,ACKEN	;INITIATE ACKNOWLEDGE SEQUENCE
	BCF		STATUS,RP0
SENDBC:
	BTFSS		PIR1,SSPIF	;ACK SEQUENCE COMPLEMENTED;IF YES SKIP
	GOTO		SENDBC	
	BCF		PIR1,SSPIF
;*********************	INITIATE STOP*******************************************
SENDB5:	
	BSF		STATUS,RP0
 	BSF		SSPCON2,PEN
	BCF		STATUS,RP0
SENDBE:	
	BTFSS		PIR1,SSPIF	
	GOTO		SENDBE
	BCF		PIR1,SSPIF

	goto		LOOP

end

ここまで

スレーブアドレス下記の部分です
MOVLW 0x40; ;0x40 is the SLAVE ADDRESS
LED表示データは下記の部分です
MOVLW 0x55 ;Port Data
プログラムの大まかな流れは
・I2Cの設定
・スタート・コンディションの開始
・スレーブアドレス送信 + WRITE モード
・ACK待ち
・LEDに表示するデータ送信
・ACK待ち
・ストップ・コンディションの開始
・LOOP

これらは全てI2Cの様々な解説に書かれていることです、こちらが参考に成ります

実際のCLK/DATの波形です、上がCLK  下がDAT
何故か同期はビデオだと良く見えました、なんで?
DSCN9754

DSCN9761



---記事制作中---

続きを読む


nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。