世田谷ボロ市

寒いですねぇ

世田谷のボロ市ってのはいつでも寒い、という印象が在りますが
矢張り今回も寒かったです、北風が良く通るからかもしれません。
そのせいか風邪をひいてしまう方が多い事を過去の経験からも
聞いています、その理由ですが・・・

・普段あんまり長時間外歩きをしない
・自由に歩けない
・長時間、寒い中ゆっくりとしか進まない
・行列に並んで居る様なものだ
・人混みである

・・・と私は分析しています、外歩きでも早歩きならば体は温まるの
ですがボロ市ではそうは行かない。

兎に角、暖かい物がご馳走でした、甘酒は何所で飲んでも100円
と格安です、コンビニではアンマン、肉まんがよく売れていました
今年は明日(12/16)までボロ市はやっていますので沢山の人出で賑わう
事でしょう、ただ、欲しいモノが在るのか無いのかでは無く物見遊山

で来て興味があれば買って帰るという人が圧倒的に多い様に思います
もしお出掛けであれば防寒対策は必須、そして来月もボロ市
は在りますが、、平日と成って居ます。

2018年も余すところ半月と成りましたウチの事務所、年内売上もっと
頑張らねばと焦って居ますが、なかなか思うようには行きませんね。



ソースコード枠

bandicam 2018-12-20 10-09-27-070

;***********************************************************************************
;  Extra Initialize for PIC16F88	Ver 1.00 2009/10/23
;***********************************************************************************
list      	p=16F88	; 翻訳時にリストファイルを作ります
#include 		; 12F683用定義ファイルを読み込みます
errorlevel  	-302		; 翻訳時に302エラーが出ないようにします
errorlevel  	-205		; 翻訳時に205エラーが出ないようにします
errorlevel  	-305		; 翻訳時に305エラーが出ないようにします
;-----------------------------------------------------------
GLOBAL	IOINIT,OPTINIT,OSCINIT,INTINIT,PWMINIT,ADINIT,COMPINIT
;サブルーチンのラベル名がメインプログラムでEXTERNで宣言されて居る
;その為、必ずGLOBALで受ける、つまり EXTERN と GLOBAL はペア
;-----------------------------------------------------------
CODE
;==============================================
;*** IO INITIALIZATION
IOINIT
BSF	STATUS,RP0	;Set BANK1
;-------PORT A TRISA (85h)
MOVLW	B'00000000'	;Port A 0=OUTPUT 1=INPUT(B=bit map / H=hex code)
MOVWF	TRISA		;Port A Setup regist to PORTA
;-------PORT B TRISB (86h)
MOVLW	B'11111111'	;Port B 0=OUTPUT 1=INPUT(B=bit map / H=hex code)
MOVWF	TRISB		;Port B Setup regist to PORTB
BCF 	STATUS,RP0 	;Bank 0 へ戻る
RETURN
;==============================================
;*** OPTION RESISTER INITIALIZATION
OPTINIT
BSF 	STATUS,RP0 	;Bank 1 へ切替
;-----------------------
;	OPTION REGISTER (81h)
;-----------------------
MOVLW	B'00000111'	;Option register setting
;MSB(here)
;PORTB pull-up 		0=使用する 1=使用しない
;RB0/INT割り込みエッジ 	0=H-->L  1=L-->H
;TMR0のクロック 		0=内部クロック(Fosc/4) 1=外部クロック(RA4,TOCKI)
;TMR0が外部クロック(RA4,TOCKI)の場合のインクリメント0=L-->H  1=H-->L
;プリスケーラをどちらに使うか 	0=TMR0  1=WDT
;111=prescaller value=1/256  (2/4/8/16/32/64/128/256)
;LSB(here)
MOVWF	OPTION_REG	;Optionregister to Set abovementioned value
;-----------------------
BCF 	STATUS,RP0 	;Bank 0 へ戻る
RETURN
;==============================================
;***	OSCCON (8Fh) & OSCTUNE (9Fh)
BSF 	STATUS,RP0 	;Bank 1 へ切替
OSCADJ	EQU	3Fh		;内部発振クロックの調整値、デバイスに依って異なる
;00h=Center MAX 1Fh-->1Eh・・・01h-->00h-->3Fh・・・1Fh-->20h MIN
;最大で±12.5%の調整可能、但し 0.4% / 1bitと粗調である
OSCINIT
BSF 	STATUS,RP0 	;Bank 1 へ切替
MOVLW	B'01100100'	;内部発振クロック4MHz stable(安定の意味)0110=4MHz 0111=8MHz
MOVWF	OSCCON		;水晶無し(_INTRC_IO)で内部クロック利用での設定
MOVLW	OSCADJ		;00h=Center MAX 1Fh-->1Eh・・・01h-->00h-->3Fh・・・1Fh-->20h MIN
MOVWF	OSCTUNE		;±12.5% Adjustable
BCF 	STATUS,RP0 	;Bank 0 へ戻る
RETURN
;==============================================
;*** INTERRUPT INITIALIZATION
INTINIT
;-----------------------
;	INTCON REGISTER (0Bh)
;-----------------------
BCF 	STATUS,RP0 	;Bank 0 へ戻る
MOVLW	B'00000000'	;INTCON register setting (0Bh)
;MSB(here) ここでは RB0 を割り込み設定している
;GIE 1=全てのマスクされて居ない割り込み発生を許可する-->(*1)
;EEIE EEライト完了発生割り込み	0=禁止 1=許可
;TOIE TMR0割り込み発生		0=禁止 1=許可
;INTE RB0/INT割り込み発生	0=禁止 1=許可(*3)
;RBIE RBポート変化発生割り込み	0=禁止 1=許可
;TOIF 1=FLAG ON/ 0=OFF TOIF:TMR0オーバーフロー割り込みフラグビット(要クリア)
;INTF 1=FLAG ON/ 0=OFF INTF:RB0/INT割り込みフラグビット(要クリア)
;RBIF 1=FLAG ON/ 0=OFF RBIF:RBポート変更割り込みフラグビット(要クリア)
MOVWF	INTCON		;INTCON register to Set abovementioned value
RETURN
;==============================================
;***	PWM INITIALIZATION CCPR1L(15h) CCP1CON(17h) T2CON(12h)
;PWMのパルスは出力命令無しに勝手に15pinに出てくる
PWMINIT
BCF 		STATUS,RP0 	;Bank 0 へ戻る
CLRF		TMR2		;TMR2カウンタのクリア
;(TMR0,TMR1はPWMには使用不可)
;CCP1パラメータ
MOVLW		B'01111111'	; DUTY 01h(殆どLow)-->FFh(殆どHi) 00h=off
MOVWF		CCPR1L		;SET CCPR1L REGISTER
MOVLW		B'00000000'	;CCP1XY=0 ON=1100(PWM) OFF=0000
MOVWF		CCP1CON		;SET CCP1CON REGISTER
;CCP2パラメータは存在しない(機能無し)
;CCP1パラメータ
BSF		STATUS,RP0	;CHANGE TO BANK1
MOVLW		D'255'		;周期(244Hz/4MHz_X-TAL)
;PR2は、255<-- 遅い--速い-->001
MOVWF		PR2		;SET PR2 REGISTER(PR1は存在せず)
BCF		STATUS,RP0	;CHANGE TO BANK0
MOVLW		B'00000110'	;PST=1:1 TMR2=ON PWM専用プリスケール=1:16
MOVWF		T2CON		;SET T2CON REGISTER
;T1CONはTMR1専用PWMには使用不可
;因みにT0CONは存在せず
RETURN
;==============================================
;***	A/D 設定 ADCON0 (1Fh) & ADCON1(9Fh) & ANSEL(9Bh)
ADINIT
BSF 	STATUS,RP0 	;Bank 1 へ切替
MOVLW	B'00000000'	;ADCON1はPIC16F873とは異なるので要注意!!
;この設定はA/D Conv Value 10 bit resister Left Shift
;Vref+ = AVdd(Vcc) / Vref- = AVss(0V,GND)
MOVWF	ADCON1		;ADCON1 to Set abovementioned value
MOVLW	B'00000000'	;bit7=0 設定無し
;bit6=AN6 13pin 0=I/O 1=A/D
;bit5=AN5 12pin   ↑↑
;bit4=AN4  3pin   ↑↑
;bit3=AN3  2pin   ↑↑
;bit2=AN2  1pin   ↑↑
;bit1=AN1 18pin   ↑↑
;bit0=AN0 17pin   ↑↑
MOVWF	ANSEL		;A/D Input AN0使用
;
BCF	STATUS,RP0	;Back to BANK0
;
MOVLW	B'01000000'	;ADCON0 PIC16F873と同一
;Bit7,6 Fosc/8標準
;Bit5--3 Channel設定、下記
;110	AN6
;101	AN5
;100	AN4
;011	AN3
;010	AN2
;001	AN1
;000	AN0
;bit1は使用せず
;bit0はA/DのON/OFF 1=ON 0=OFF
MOVWF	ADCON0		;ADCON0 to Set abovementioned value
BCF 	STATUS,RP0 	;Bank 0 へ戻る
RETURN
;==============================================
;	COMPARATOR 定義 (CMCON 9Ch)--ここでは使用しない設定--
COMPINIT
BSF 	STATUS,RP0 	;Bank 1 へ切替
MOVLW	B'00000111'	;CMCON resister setting 使用しないのでOPアンプ入力をターミネイトする
MOVWF	CMCON		;CMCON register to Set abovementioned value
BCF 	STATUS,RP0 	;Bank 0 へ戻る
RETURN
;==============================================
;==============================================
;==============================================
;********************************************************************************************
END

“ソースコード枠” の続きを読む

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表示するというものです
参考にと言うかコピーしたプログラムで引用元はこちらです
https://www.picmicrolab.com/pcf8574-i2c-8-bit-io-expander/

ソースコードの窓をこのブログに作りたいのですが面倒なので
後回しです、下記の通りです、折り返しが出ていますので
コピペの後、ご注意下さいこのままだとコンパイルエラーが出ます

因みにコンパイラは 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

—記事制作中—

“I2Cを使う PIC16F876A PCF8574AN” の続きを読む