年の瀬
AQM1602 LCD I2C PIC16F886 アセンブラ
2018年の御礼
今年も一年間、ブログをご高覧下さり誠に有り難う御座いました
当たり前ですが一週間後は既に 2019/01/02 三が日の中日なのですね
ダウンカウントに入ってきました、クリスマスが終わりいつもの様に
全国の売り場で喧しく正月商戦が繰り広げられています
年の瀬は何か追い立てられるような気持ちに成るのです、何でも年内に
と云う気持ちからでしょうか、大掃除もしなければ・・・いやだぁ・・・
今年を振り返ってみますと色々と在りすぎた年でした、自宅、事務所の
引越から始まり義母実母の葬儀、姪御甥御の婚儀、避けては通れない様々な
営みは人が生まれて滅するまでの何所にでも在る出来事と判って居ても
特に永久のお別れはイザ自分の番に成ると・・・然し乍ら順番であれば
別な意味で幸福なことです、そもそも、そんな事をボヤいて居ては度重なる
自然災害にも関わらず全てを失い悲壮絶望のどん底で全てを受け入れて
忍耐と共に希望を抱いて生き抜いておられる多くの方々に対してとても
恥ずかしい、という気持ちに成ってきます
皆様はどの様にお過ごしか知るよしもありませんが、兎に角風邪など
召されませんようにお過ごし下さい、インフルエンザがまた流行って
来て居ますのでこっちが問題ですね、でも最近は「タミフル」「イナビル」
「リレンザ」から更に進化した「ゾフルーザ」と云う飲み薬で回復する
と聞いています、でも罹りたくないです
引き続き、ブログ、宜しくお願い申し上げます。
2018年の御礼
今年も一年間、ブログをご高覧下さり誠に有り難う御座いました
当たり前ですが一週間後は既に 2019/01/02 三が日の中日なのですね
ダウンカウントに入ってきました、クリスマスが終わりいつもの様に
全国の売り場で喧しく正月商戦が繰り広げられています
年の瀬は何か追い立てられるような気持ちに成るのです、何でも年内に
と云う気持ちからでしょうか、大掃除もしなければ・・・いやだぁ・・・
今年を振り返ってみますと色々と在りすぎた年でした、自宅、事務所の
引越から始まり義母実母の葬儀、姪御甥御の婚儀、避けては通れない様々な
営みは人が生まれて滅するまでの何所にでも在る出来事と判って居ても
特に永久のお別れはイザ自分の番に成ると・・・然し乍ら順番であれば
別な意味で幸福なことです、そもそも、そんな事をボヤいて居ては度重なる
自然災害にも関わらず全てを失い悲壮絶望のどん底で全てを受け入れて
忍耐と共に希望を抱いて生き抜いておられる多くの方々に対してとても
恥ずかしい、という気持ちに成ってきます
皆様はどの様にお過ごしか知るよしもありませんが、兎に角風邪など
召されませんようにお過ごし下さい、インフルエンザがまた流行って
来て居ますのでこっちが問題ですね、でも最近は「タミフル」「イナビル」
「リレンザ」から更に進化した「ゾフルーザ」と云う飲み薬で回復する
と聞いています、でも罹りたくないです
引き続き、ブログ、宜しくお願い申し上げます。
PIC16F886--I2C-- S-5851A アセンブラ
PIC16F886--I2C-- S-5851A アセンブラ
PIC16F886--I2C--MCP23017 アセンブラ
PIC16F886 24LC64 EEPROM I2C アセンブラ
全体回路図
CBLOCK H'20' ;20hからユーザーのメモリが連続して割り当てられる開始宣言 W_TEMP ;For Interupt S_TEMP ;For Interupt COUNT ;For サブルーチン変数 COUNT2 ;For サブルーチン変数 COUNT3 ;For サブルーチン変数 COUNT4 ;For サブルーチン変数 COUNT10 ;For サブルーチン変数 COUNT11 ;For サブルーチン変数 COUNT12 ;For サブルーチン変数 COUNT13 ;For サブルーチン変数 TMR0_INT_C ;TMR0割込回数カウンタ(65.28msでインクリメント但し水晶=4MHz) TMR0_INT_D ;上記カウンタが255を超えたら+1するカウンタ ; MAX = 4244.8秒 ( 65.28ms x 255 x 255 ) およそ70分 FLAG ;FLAG RESISTER ;0= ;1= ;2= ;3= ;4= ;5= ;6= ;7= SWFLAG ;SW FLAG ONLY RESISTER ;0=SWの状態ビット0 ;1=SWの状態ビット1 ;2=SW ON ビット、MAINプログラムではこれが立った事でSW ONを知る ;3= ;4= ;5= ;6= ;7= SWFLAG2 ;SW FLAG ONLY RESISTER ;0=SWの状態ビット0 ;1=SWの状態ビット1 ;2=SW ON ビット、MAINプログラムではこれが立った事でSW ONを知る ;3= ;4= ;5= ;6= ;7= COUNTB ;For Interrupt 避難用 COUNT2B ;For Interrupt 避難用 COUNT3B ;For Interrupt 避難用 COUNT4B ;For Interrupt 避難用 TEMP1 ;For A/D value MSB TEMP2 ;For A/D value LSB TEMP3 ;For Adjustable timer routin PTA ;For I/O register PTB ;For I/O register PTC ;For I/O register PTE ;For I/O register WRITEADRS ;スレーブアドレス・ライト WRITEHADRS ;メモリ上位アドレス・ライト WRITELADRS ;メモリ下位アドレス・ライト EPROMWDATA ;書き込むデータ READADRS ;スレーブアドレス・リード READHADRS ;メモリ上位アドレス・リード READLADRS ;メモリ下位アドレス・リード
;*************************************************************************************************************** ;This software is provided in an “AS IS” condition,NO WARRANTIES in any form apply to this software. ; picmicrolab.com 5.31.2014 ; Modified Dec,10,2018 by maru ;*************************************************************************************************************** ; PCF8574 I2C 8-bit IO expander interface with PIC16F876A; ;-------------------------------------------------------------------------------------; LIST P=PIC16F886 include P16f886.inc errorlevel -302 ; 翻訳時に302エラーが出ないようにします errorlevel -205 ; 翻訳時に205エラーが出ないようにします errorlevel -305 ; 翻訳時に305エラーが出ないようにします ;サブルーチンは別ファイルをコール ; EXTERN TIMADJ,TIM8ms,TIM100ms,TIM500ms,TIM10ms,ADGET,OUT_A,OUT_B,OUT_C,SWON,SWON2 EXTERN E24LC64_READ,I2C_INIT,START_I2C,STOP_I2C,E24LC64_WRITE,IDLE EXTERN TIM100ms,TIM8ms,TIM10ms ;別ファイルに存在するサブルーチンのラベル名を宣言する ;別ファイルでは必ず GLOBAL で受ける、つまり EXTERN と GLOBAL はペア。 ; __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _LVP_OFF & _DEBUG_OFF & _CPD_OFF __CONFIG _CONFIG1 , _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTOSCIO & _BOR_OFF org 0x00 reset: goto start org 0x04 start: ;=============================================================================== ;スレーブアドレスとデータの宣言 ;-------------- WSADRS EQU H'00A0' ;スレーブアドレス WRITE WSHADRS EQU H'0000' ;メモリアドレス上位 WRITE WSLADRS EQU H'0000' ;メモリアドレス下位 WRITE ROMWDATA EQU H'0055' ;E24LC64 に書き込むデータ ;-------------- RSADRS EQU H'00A1' ;スレーブアドレス READ RSHADRS EQU H'0000' ;メモリアドレス上位 READ RSLADRS EQU H'0000' ;メモリアドレス下位 READ ;-------------- MOVLW WSADRS ;data -> W MOVWF WRITEADRS ;W -> F MOVLW WSHADRS ;data -> W MOVWF WRITEHADRS ;W -> F MOVLW WSLADRS ;data -> W MOVWF WRITELADRS ;W -> F ;-------------- MOVLW ROMWDATA ;data -> W MOVWF EPROMWDATA ;W -> F ;-------------- MOVLW RSADRS ;data -> W MOVWF READADRS ;W -> F MOVLW RSHADRS ;data -> W MOVWF READHADRS ;W -> F MOVLW RSLADRS ;data -> W MOVWF READLADRS ;W -> F ;-------------- ; READADRS ;スレーブアドレス・リード・レジスタ ; WRITEADRS ;スレーブアドレス・ライト・レジスタ ;=============================================================================== ;For PORTA RA0=OUT using trigger pulse for oscilloscope BANKSEL TRISA MOVLW b'00000000' MOVWF TRISA banksel PORTA CLRF PORTA ;=============================================================================== ;For MCLR INIT 1pin MCLR to use reset sw 1pin (PORTE-RE3) BANKSEL PORTE CLRF PORTE BANKSEL ANSEL CLRF ANSEL BANKSEL TRISE MOVLW b'00001000' MOVWF TRISE ;=============================================================================== ;*** iNTERNAL OSC 設定 ( OSCCON-8Fh ) ;OSCINIT BANKSEL OSCCON MOVLW 70h ;CLOCK=4MHz (70H=8MHzでMAX) MOVWF OSCCON BCF STATUS,5 ;Back to BANK0 ;=============================================================================== ;I2C の為の初期化 LOOP: CALL I2C_INIT ;=============================================================================== ;LOOP: ;=============================================================================== ;E24LC64WRITE CALL IDLE CALL START_I2C CALL E24LC64_WRITE CALL STOP_I2C ;=============================================================================== ;For EEPROM WRITE WAITING TIME(Musd be 5ms minimum) if no wait gonna be freeze CALL TIM10ms ;=============================================================================== ;E24LC64READ BANKSEL PORTA ;For oscilloscope trigger CLRF PORTA ;↑ BSF PORTA,0 ;↑ CALL IDLE CALL START_I2C CALL E24LC64_READ CALL STOP_I2C banksel PORTA ;For oscilloscope trigger BCF PORTA,0 ;↑ ;=============================================================================== BANKSEL W_TEMP MOVF W_TEMP,W ;W_TEMP -> W MOVWF PORTB ;W → PORTB に即出力(LEDモニタとして使用) ;=============================================================================== GOTO LOOP end
list p=16F886 ; 翻訳時にリストファイルを作ります #include; 定義ファイルを読み込みます errorlevel -302 ; 翻訳時に302エラーが出ないようにします errorlevel -205 ; 翻訳時に205エラーが出ないようにします errorlevel -305 ; 翻訳時に305エラーが出ないようにします ;*********************************************************************** ;サブルーチン、E24LC64を読む GLOBAL E24LC64_READ ;サブルーチンのラベル名がメインプログラムでEXTERNで宣言されて居る ;その為、必ずGLOBALで受ける、つまり EXTERN と GLOBAL はペア ;=============================================================================== CODE ;サブルーチン、ここから ;=============================================================================== ; WRITEADRS ;スレーブアドレス・リードの為のライト E24LC64_READ BANKSEL WRITEADRS MOVF WRITEADRS,W ;F -> W スレーブアドレス一発目はライトモード MOVWF SSPBUF ;W -> F INITIATE SEND この瞬間に送信される ;SLAVE ADDRESS SENDC3: BANKSEL PIR1 BTFSS PIR1, SSPIF ;SEND COMPLETED? YES,SKIP NEXT 送信完了? GOTO SENDC3 BCF PIR1, SSPIF ;YES,CLEAR FLAG 割り込みフラグ・クリア BANKSEL SSPCON2 BTFSC SSPCON2,ACKSTAT ;ACK RECEIVED FROM SLAVE?IF YES SKIP ; スレーブからの ACK待ち 0=受信済み次ぎをスキップ GOTO $-1 ;IF NO,END ;=============================================================================== ; メモリアドレス上位送信 BANKSEL READHADRS MOVF READHADRS,W ;F -> W MOVWF SSPBUF ;W -> F INITIATE SEND この瞬間に送信される ;SLAVE ADDRESS SENDC3B: BANKSEL PIR1 BTFSS PIR1, SSPIF ;SEND COMPLETED? YES,SKIP NEXT 送信完了? GOTO SENDC3B BCF PIR1, SSPIF ;YES,CLEAR FLAG 割り込みフラグ・クリア BANKSEL SSPCON2 BTFSC SSPCON2,ACKSTAT ;ACK RECEIVED FROM SLAVE?IF YES SKIP ; スレーブからの ACK待ち 0=受信済み次ぎをスキップ GOTO $-1 ;IF NO,END ; RETURN ;=============================================================================== ; メモリアドレス下位送信 BANKSEL READLADRS MOVF READLADRS,W ;F -> W MOVWF SSPBUF ;W -> F INITIATE SEND この瞬間に送信される SENDC3C: BANKSEL PIR1 BTFSS PIR1, SSPIF ;SEND COMPLETED? YES,SKIP NEXT 送信完了? GOTO SENDC3C BCF PIR1, SSPIF ;YES,CLEAR FLAG 割り込みフラグ・クリア BANKSEL SSPCON2 BTFSC SSPCON2,ACKSTAT ;ACK RECEIVED FROM SLAVE?IF YES SKIP ; スレーブからの ACK待ち 0=受信済み次ぎをスキップ GOTO $-1 ;IF NO,END ;=============================================================================== ;repeated start banksel SSPCON2 bsf SSPCON2,RSEN btfsc SSPCON2,RSEN goto $-1 ;=============================================================================== ; READADRS ;スレーブアドレス・リード BANKSEL READADRS ;bank0 MOVF READADRS,W ;F -> W スレーブアドレス・リード MOVWF SSPBUF ;W -> F INITIATE SEND この瞬間に送信される SENDC3D: BANKSEL PIR1 bcf PIR1,SSPIF BTFSS PIR1, SSPIF ;SEND COMPLETED? YES,SKIP NEXT 送信完了? GOTO SENDC3D BCF PIR1, SSPIF ;YES,CLEAR FLAG 割り込みフラグ・クリア BANKSEL SSPCON2 BTFSC SSPCON2,ACKSTAT ;ACK RECEIVED FROM SLAVE?IF YES SKIP ; スレーブからの ACK待ち 0=受信済み次ぎをスキップ GOTO $-1 ; Wait to ACK END ;=============================================================================== ; I2Cから1byte入力しWREGに格納する。デバイスへはNACKを返す。 ; i2c_last_read 最終1byte入力 bsf SSPCON2,RCEN ; 受信を許可 btfsc SSPCON2,RCEN goto $-1 ; PICが受信許可状態になるまでループ banksel PIR1 ;bank0 btfss PIR1,SSPIF goto $-1 bcf PIR1,SSPIF banksel SSPBUF ;bank0 movf SSPBUF,W MOVWF W_TEMP ;W -> W_TEMP I/O EXPANDER へ出力するデータの確保 banksel SSPCON2 ;bank1 bsf SSPCON2,ACKDT ; NACKを出力 bsf SSPCON2,ACKEN ; ACKENをセット btfsc SSPCON2,ACKEN goto $-1 ; ACKの送信が終了するループ banksel PIR1 ;bank0 bcf PIR1,SSPIF return END
list p=16F886 ; 翻訳時にリストファイルを作ります #include; 定義ファイルを読み込みます errorlevel -302 ; 翻訳時に302エラーが出ないようにします errorlevel -205 ; 翻訳時に205エラーが出ないようにします errorlevel -305 ; 翻訳時に305エラーが出ないようにします ;*********************************************************************** ;サブルーチン、PCF8574を読む GLOBAL I2C_INIT,START_I2C,STOP_I2C,IDLE ;サブルーチンのラベル名がメインプログラムでEXTERNで宣言されて居る ;その為、必ずGLOBALで受ける、つまり EXTERN と GLOBAL はペア ;=============================================================================== CODE ;サブルーチン、ここから ;=============================================================================== I2C_INIT ;=============================================================================== ;I2C の為の初期化 BANKSEL SSPCON ;BANK0 movlw 0x28 ;0x28 = シリアルポートを動作させ、SDA とSCL ピンをシリアルポートピンにする。 ;0x28 = I2C マスターモード、クロック= FOSC / (4 * (SSPADD+1) ) movwf SSPCON BANKSEL SSPSTAT ;BANK1 BSF SSPSTAT, SMP BCF SSPSTAT, CKE CLRF TRISB ;BANK1 BSF TRISC, 0x04 ;SDA=IN BSF TRISC, 0x03 ;SCL=IN MOVLW 0x13 ;I2C BUS speed 小さい程早く成る MOVWF SSPADD ;BANK1 NOP RETURN ;********************* START CONDITION ***************************************** START_I2C BANKSEL SSPCON2 BSF SSPCON2, SEN ; INITIATE START SENDB2: BANKSEL PIR1 BTFSS PIR1, SSPIF ;START COMPLETED?YES SKIP NEXT GOTO SENDB2 BCF PIR1, SSPIF ;YES,CLEAR FLAG RETURN ;********************* INITIATE STOP******************************************* STOP_I2C SENDB5: BANKSEL SSPCON2 ;bank1 BSF SSPCON2,PEN BCF STATUS,RP0 ;bank0 SENDBE: BTFSS PIR1,SSPIF GOTO SENDBE BCF PIR1,SSPIF RETURN ;=============================================================================== ;idle IDLE: banksel SSPCON2 ; ; CLRF SSPCON2 ; btfsc SSPCON2,ACKDT ; goto $-1 ; btfsc SSPCON2,ACKEN goto $-1 btfsc SSPCON2,RCEN goto $-3 btfsc SSPCON2,PEN goto $-5 btfsc SSPCON2,RSEN goto $-7 btfsc SSPCON2,SEN goto $-9 RETURN END
list p=16F886 ; 翻訳時にリストファイルを作ります #include; 定義ファイルを読み込みます errorlevel -302 ; 翻訳時に302エラーが出ないようにします errorlevel -205 ; 翻訳時に205エラーが出ないようにします errorlevel -305 ; 翻訳時に305エラーが出ないようにします ;*********************************************************************** ;サブルーチン、PCF8574を読む GLOBAL I2C_INIT,START_I2C,STOP_I2C,IDLE ;サブルーチンのラベル名がメインプログラムでEXTERNで宣言されて居る ;その為、必ずGLOBALで受ける、つまり EXTERN と GLOBAL はペア ;=============================================================================== CODE ;サブルーチン、ここから ;=============================================================================== I2C_INIT ;=============================================================================== ;I2C の為の初期化 BANKSEL SSPCON ;BANK0 movlw 0x28 ;0x28 = シリアルポートを動作させ、SDA とSCL ピンをシリアルポートピンにする。 ;0x28 = I2C マスターモード、クロック= FOSC / (4 * (SSPADD+1) ) movwf SSPCON BANKSEL SSPSTAT ;BANK1 BSF SSPSTAT, SMP BCF SSPSTAT, CKE CLRF TRISB ;BANK1 BSF TRISC, 0x04 ;SDA=IN BSF TRISC, 0x03 ;SCL=IN MOVLW 0x13 ;I2C BUS speed 小さい程早く成る MOVWF SSPADD ;BANK1 NOP RETURN ;********************* START CONDITION ***************************************** START_I2C BANKSEL SSPCON2 BSF SSPCON2, SEN ; INITIATE START SENDB2: BANKSEL PIR1 BTFSS PIR1, SSPIF ;START COMPLETED?YES SKIP NEXT GOTO SENDB2 BCF PIR1, SSPIF ;YES,CLEAR FLAG RETURN ;********************* INITIATE STOP******************************************* STOP_I2C SENDB5: BANKSEL SSPCON2 ;bank1 BSF SSPCON2,PEN BCF STATUS,RP0 ;bank0 SENDBE: BTFSS PIR1,SSPIF GOTO SENDBE BCF PIR1,SSPIF RETURN ;=============================================================================== ;idle IDLE: banksel SSPCON2 ; ; CLRF SSPCON2 ; btfsc SSPCON2,ACKDT ; goto $-1 ; btfsc SSPCON2,ACKEN goto $-1 btfsc SSPCON2,RCEN goto $-3 btfsc SSPCON2,PEN goto $-5 btfsc SSPCON2,RSEN goto $-7 btfsc SSPCON2,SEN goto $-9 RETURN END
;*********************************************************************************** ; PIC16F886 Extra Subroutines Ver 1.00 2009/11/25 ;*********************************************************************************** list p=16F886 ; 翻訳時にリストファイルを作ります #include; 12F683用定義ファイルを読み込みます errorlevel -302 ; 翻訳時に302エラーが出ないようにします errorlevel -205 ; 翻訳時に205エラーが出ないようにします errorlevel -305 ; 翻訳時に305エラーが出ないようにします ;============================================================ GLOBAL TIMADJ,TIM8ms,TIM100ms,TIM500ms,TIM10ms,ADGET,OUT_A,OUT_B,OUT_C,SWON,SWON2 ;サブルーチンのラベル名がメインプログラムでEXTERNで宣言されて居る ;その為、必ずGLOBALで受ける、つまり EXTERN と GLOBAL はペア ;============================================================ CODE ;サブルーチン、ここから ;============================================================ ;A/D コンバータースタート、10bit有る、ADINITで左シフトに設定してあるので上位8ビットがTEMP1に入る ;ADCON0のbit2を1にするとスタートし、それが0に成ったらA/D変換終了 ;A/D回路はノイズが出るらしく、ここではいちいちA/Dを使う設定をし、変換したら使わない設定にするADCON0,0 ADGET ;A/D Convertion BSF ADCON0,0 ;USE A/D Convertion CALL SC01 BSF ADCON0,1 ;A/D Covert to start CALL SC01 ;Wait 40us for A/D Convertion Capacitor Charge Time LP00B CLRWDT ;WATCH DOG TIMER RESET BTFSC ADCON0,1 GOTO LP00B MOVF ADRESH,W ;A/D Value MSB to W MOVWF TEMP1 ;W to TEMP1 BSF STATUS,5 ;Change to Bank1 (STATUS Register Bit5 set to 1) MOVF ADRESL,W ;A/D Value LSB to W BCF STATUS,5 ;Back to Bank0 (STATUS Register Bit5 set to 0) MOVWF TEMP2 ;W to TEMP2 BCF ADCON0,0 ;NO-USE A/D Convertion (For Noise cut) RETURN SC01 ;Timer 40us MOVLW 24H MOVWF COUNT LP01B DECFSZ COUNT,F ;Dec COUNT untill 0 GOTO LP01B RETURN ;============================================================ ;TEMP3レジスタの数値を01--FFhで変化させる事で待ち時間を設定出来る TIMADJ ;Adjustable TIMER MOVLW D'1' ;DataA write to the W register(under the ALU) MOVWF COUNT4 ;Data set to the COUNT4 LP5B MOVLW D'12' ;DataA write to the W register(under the ALU) MOVWF COUNT3 ;Data set to the COUNT3 LP5C DECFSZ COUNT2 ;COUNT2 DEC GOTO LP5C ;CNTR INC UNTILL 0 CLRWDT ;WATCH DOG TIMER RESET MOVF TEMP3,W ;TEMP1 to W MOVWF COUNT2 ;W to COUNT2 DECFSZ COUNT3 ;COUNT3 DEC GOTO LP5C ;REPT DEC UNTILL 0 DECFSZ COUNT4 ;REPT2 DEC GOTO LP5B ;REPT2 DEC UNTILL 0 RETURN ;BACK TO Main Rutin ;============================================================ ;10ms待つ TIM10ms ;10msTIMER MOVLW D'1' ;DataA write to the W register(under the ALU) MOVWF COUNT3 ;Data set to the COUNT2 LP08B MOVLW D'13' ;DataA write to the W register(under the ALU) MOVWF COUNT2 ;Data set to the COUNT LP08C INCFSZ COUNT ;CNTR INC GOTO LP08C ;CNTR INC UNTILL 256 CLRWDT ;WATCH DOG TIMER RESET DECFSZ COUNT2 ;COUNT DEC GOTO LP08C ;COUNT DEC UNTILL 0 DECFSZ COUNT3 ;COUNT2 DEC GOTO LP08B ;COUNT2 DEC UNTILL 0 RETURN ;BACK TO MAIN ;============================================================ ;8ms待つ TIM8ms ;8msTIMER MOVLW D'1' ;DataA write to the W register(under the ALU) MOVWF COUNT3 ;Data set to the COUNT2 LP08D MOVLW D'1' ;DataA write to the W register(under the ALU) MOVWF COUNT2 ;Data set to the COUNT LP08E INCFSZ COUNT ;CNTR INC GOTO LP08E ;CNTR INC UNTILL 256 CLRWDT ;WATCH DOG TIMER RESET DECFSZ COUNT2 ;COUNT DEC GOTO LP08E ;COUNT DEC UNTILL 0 DECFSZ COUNT3 ;COUNT2 DEC GOTO LP08D ;COUNT2 DEC UNTILL 0 RETURN ;BACK TO MAIN ;============================================================ ;100ms待つ TIM100ms ;100msTIMER MOVLW D'10' ;DataA write to the W register(under the ALU) MOVWF COUNT3 ;Data set to the COUNT2 LP08F MOVLW D'13' ;DataA write to the W register(under the ALU) MOVWF COUNT2 ;Data set to the COUNT LP08G INCFSZ COUNT ;CNTR INC GOTO LP08G ;CNTR INC UNTILL 256 CLRWDT ;WATCH DOG TIMER RESET DECFSZ COUNT2 ;COUNT DEC GOTO LP08G ;COUNT DEC UNTILL 0 DECFSZ COUNT3 ;COUNT2 DEC GOTO LP08F ;COUNT2 DEC UNTILL 0 RETURN ;BACK TO MAIN ;============================================================ ;500ms待つ TIM500ms ;100msTIMER MOVLW D'50' ;DataA write to the W register(under the ALU) MOVWF COUNT3 ;Data set to the COUNT2 LP08H MOVLW D'13' ;DataA write to the W register(under the ALU) MOVWF COUNT2 ;Data set to the COUNT LP08I INCFSZ COUNT ;CNTR INC GOTO LP08I ;CNTR INC UNTILL 256 CLRWDT ;WATCH DOG TIMER RESET DECFSZ COUNT2 ;COUNT DEC GOTO LP08I ;COUNT DEC UNTILL 0 DECFSZ COUNT3 ;COUNT2 DEC GOTO LP08H ;COUNT2 DEC UNTILL 0 RETURN ;BACK TO MAIN ;============================================================ ;PORTAが出力に設定されて居る場合PTAレジスタのビットを立てればそのビットを出力する OUT_A NOP ;PORT OUTPUT ROUTIN CLRWDT ;WATCH DOG TIMER RESET MOVF PTA,W ;DATA COPY FROM PTA TO W RESISTER MOVWF PORTA ;DATA COPY FROM W TO PORTA RETURN ;============================================================ ;PORTBが出力に設定されて居る場合PTAレジスタのビットを立てればそのビットを出力する OUT_B NOP ;PORT OUTPUT ROUTIN CLRWDT ;WATCH DOG TIMER RESET MOVF PTB,W ;DATA COPY FROM PTB TO W RESISTER MOVWF PORTB ;DATA COPY FROM W TO PORTB RETURN ;============================================================ ;PORTCが出力に設定されて居る場合PTCレジスタのビットを立てればそのビットを出力する OUT_C NOP ;PORT OUTPUT ROUTIN CLRWDT ;WATCH DOG TIMER RESET MOVF PTC,W ;DATA COPY FROM PTC TO W RESISTER MOVWF PORTC ;DATA COPY FROM W TO PORTC RETURN ;============================================================ ;入力はPA0(17pin) ;ここでは入力が H-->L-->H を一通り経由すると SWFLAGのbit2 が0-->1に成る ;チャタリングは30msに設定されて居る ;特徴は入力の状態をずっと見ているのでは無く時々見に行きフラグを変化させている ;その為、入力を見に行って他のことが何も出来ないのではなく同時に並行して他の ;作業を出来ることである ;------------------------------ SWON CLRWDT BCF SWFLAG,2 ;SW ON のフラグをクリア BCF STATUS,Z BCF STATUS,C BCF STATUS,DC MOVLW D'1' ;D'5'--->W 1= 10ms MOVWF COUNT4 ;W--->COUNT4 ;-----------------------SW ポートの H/Lチェック MOVF TRISA,W ;IO-->W MOVWF PTA ;W-->PTA BTFSC PTA,0 ;SW=Hつまり押されていない、次へ ;SW=Lつまり押された、次をスキップ GOTO SWONC ;押されて居ないへ進む ;-----------------------SW ポートは L チャタリングチェック SWONB CLRWDT CALL TIM10ms CALL TIM10ms CALL TIM10ms MOVF TRISA,W ;IO-->W MOVWF PTA ;W-->PTA BTFSC PTA,0 ;SW=1つまり押されていない、次へ ;SW=0つまり押された、次をスキップ RETURN ;押されて居ない、チャタリング、MAINへ戻る ; CALL TIM10ms ;10ms timer チャタリング対策 ; DECFSZ COUNT4,1 ;COUNT4 = COUNT4 - 1 ゼロに成ったら次をスキップ ;ゼロで無いならば次へ進む ; GOTO SWONB ;再度押されたかチェックを繰り返す ;----------------------- MOVLW D'1' ; 1 --> W SUBWF SWFLAG,1 ;SWFLAG=SWFLAG-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWONB1 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SET0 ;SWFLAGをゼロにしてMAINに戻る SWONB1 SUBWF SWFLAG,1 ;SWFLAG=SWFLAG-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWONB2 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SET2 ;SWFLAGを2にしてMAINに戻る SWONB2 SUBWF SWFLAG,1 ;SWFLAG=SWFLAG-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWONB3 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SET2 ;SWFLAGを2にしてMAINに戻る SWONB3 GOTO SET0 ;SWFLAGをゼロにしてMAINに戻る ;-----------------------SW ポートは H チャタリングチェック SWONC CLRWDT CALL TIM10ms CALL TIM10ms CALL TIM10ms MOVF TRISA,W ;IO-->W MOVWF PTA ;W-->PTA BTFSS PTA,0 ;SW=0つまり押されていない、次をスキップ ;SW=1つまり押された、次へ RETURN ;押されて居ない、チャタリング、MAINへ戻る ; CALL TIM10ms ;10ms timer チャタリング対策 ; DECFSZ COUNT4,1 ;COUNT4 = COUNT4 - 1 ゼロに成ったら次をスキップ ;ゼロで無いならば次へ進む ; GOTO SWONC ;再度押されたかチェックを繰り返す ;----------------------- MOVLW D'1' ; 1 --> W SUBWF SWFLAG,1 ;SWFLAG=SWFLAG-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWONC1 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SET1 ;SWFLAGを1にしてMAINに戻る SWONC1 SUBWF SWFLAG,1 ;SWFLAG=SWFLAG-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWONC2 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SET1 ;SWFLAGを1にしてMAINに戻る SWONC2 SUBWF SWFLAG,1 ;SWFLAG=SWFLAG-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWONC3 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SET3 ;SWFLAGを3にしてMAINに戻る、つまりSWは一通りの経過を経て押された SWONC3 GOTO SET0 ;SWFLAGをゼロにしてMAINに戻る ;----------------------- SET0 CLRF SWFLAG ;SET0 RETURN SET1 MOVLW D'1' ;SET1 MOVWF SWFLAG ;W --> SWFLAG RETURN SET2 MOVLW D'2' ;SET2 MOVWF SWFLAG ;W --> SWFLAG RETURN SET3 MOVLW D'3' ;SET3 つまりSW操作は正しく一通り行われた MOVWF SWFLAG ;W --> SWFLAG BSF SWFLAG,2 ;SW ON のフラグを立てる RETURN ;============================================================ ;入力はPA1(18pin) ;ここでは入力が H-->L-->H を一通り経由すると SWFLAG2のbit2 が0-->1に成る ;チャタリングは30msに設定されて居る ;特徴は入力の状態をずっと見ているのでは無く時々見に行きフラグを変化させている ;その為、入力を見に行って他のことが何も出来ないのではなく同時に並行して他の ;作業を出来ることである SWON2 CLRWDT BCF SWFLAG2,2 ;SW ON のフラグをクリア BCF STATUS,Z BCF STATUS,C BCF STATUS,DC MOVLW D'1' ;D'5'--->W 1= 10ms MOVWF COUNT4 ;W--->COUNT4 ;-----------------------SW ポートの H/Lチェック MOVF TRISA,W ;IO-->W MOVWF PTA ;W-->PTA BTFSC PTA,1 ;SW=Hつまり押されていない、次へ ;SW=Lつまり押された、次をスキップ GOTO SWON2C ;押されて居ないへ進む ;-----------------------SW ポートは L チャタリングチェック SWON2B CLRWDT CALL TIM10ms CALL TIM10ms CALL TIM10ms MOVF TRISA,W ;IO-->W MOVWF PTA ;W-->PTA BTFSC PTA,1 ;SW=1つまり押されていない、次へ ;SW=0つまり押された、次をスキップ RETURN ;押されて居ない、チャタリング、MAINへ戻る ; CALL TIM10ms ;10ms timer チャタリング対策 ; DECFSZ COUNT4,1 ;COUNT4 = COUNT4 - 1 ゼロに成ったら次をスキップ ;ゼロで無いならば次へ進む ; GOTO SWON2B ;再度押されたかチェックを繰り返す ;----------------------- MOVLW D'1' ; 1 --> W SUBWF SWFLAG2,1 ;SWFLAG2=SWFLAG2-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWON2B1 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SETB0 ;SWFLAG2をゼロにしてMAINに戻る SWON2B1 SUBWF SWFLAG2,1 ;SWFLAG2=SWFLAG2-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWON2B2 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SETB2 ;SWFLAG2を2にしてMAINに戻る SWON2B2 SUBWF SWFLAG2,1 ;SWFLAG2=SWFLAG2-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWON2B3 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SETB2 ;SWFLAG2を2にしてMAINに戻る SWON2B3 GOTO SETB0 ;SWFLAG2をゼロにしてMAINに戻る ;-----------------------SW ポートは H チャタリングチェック SWON2C CLRWDT CALL TIM10ms CALL TIM10ms CALL TIM10ms MOVF TRISA,W ;IO-->W MOVWF PTA ;W-->PTA BTFSS PTA,1 ;SW=0つまり押されていない、次をスキップ ;SW=1つまり押された、次へ RETURN ;押されて居ない、チャタリング、MAINへ戻る ; CALL TIM10ms ;10ms timer チャタリング対策 ; DECFSZ COUNT4,1 ;COUNT4 = COUNT4 - 1 ゼロに成ったら次をスキップ ;ゼロで無いならば次へ進む ; GOTO SWON2C ;再度押されたかチェックを繰り返す ;----------------------- MOVLW D'1' ; 1 --> W SUBWF SWFLAG2,1 ;SWFLAG2=SWFLAG2-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWON2C1 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SETB1 ;SWFLAG2を1にしてMAINに戻る SWON2C1 SUBWF SWFLAG2,1 ;SWFLAG2=SWFLAG2-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWON2C2 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SETB1 ;SWFLAG2を1にしてMAINに戻る SWON2C2 SUBWF SWFLAG2,1 ;SWFLAG2=SWFLAG2-1 BTFSC STATUS,C ;C=1(キャリーフラグ)ならばプラス、次へ ;C=0ならばゼロかマイナス次をスキップ GOTO SWON2C3 BTFSS STATUS,Z ;Z=0ならマイナス次 Z=1ならゼロ次をスキップ GOTO SETB3 ;SWFLAG2を3にしてMAINに戻る、つまりSWは一通りの経過を経て押された SWON2C3 GOTO SETB0 ;SWFLAG2をゼロにしてMAINに戻る ;----------------------- SETB0 CLRF SWFLAG2 ;SETB0 RETURN SETB1 MOVLW D'1' ;SETB1 MOVWF SWFLAG2 ;W --> SWFLAG2 RETURN SETB2 MOVLW D'2' ;SETB2 MOVWF SWFLAG2 ;W --> SWFLAG2 RETURN SETB3 MOVLW D'3' ;SETB3 つまりSW操作は正しく一通り行われた MOVWF SWFLAG2 ;W --> SWFLAG2 BSF SWFLAG2,2 ;SW ON のフラグを立てる RETURN ;******************************************************************************************** END
世田谷ボロ市
寒いですねぇ
世田谷のボロ市ってのはいつでも寒い、という印象が在りますが
矢張り今回も寒かったです、北風が良く通るからかもしれません。
そのせいか風邪をひいてしまう方が多い事を過去の経験からも
聞いています、その理由ですが・・・
・普段あんまり長時間外歩きをしない
・自由に歩けない
・長時間、寒い中ゆっくりとしか進まない
・行列に並んで居る様なものだ
・人混みである
・・・と私は分析しています、外歩きでも早歩きならば体は温まるの
ですがボロ市ではそうは行かない。
兎に角、暖かい物がご馳走でした、甘酒は何所で飲んでも100円
と格安です、コンビニではアンマン、肉まんがよく売れていました
今年は明日(12/16)までボロ市はやっていますので沢山の人出で賑わう
事でしょう、ただ、欲しいモノが在るのか無いのかでは無く物見遊山
で来て興味があれば買って帰るという人が圧倒的に多い様に思います
もしお出掛けであれば防寒対策は必須、そして来月もボロ市
は在りますが、、平日と成って居ます。
2018年も余すところ半月と成りましたウチの事務所、年内売上もっと
頑張らねばと焦って居ますが、なかなか思うようには行きませんね。
ソースコード枠
;*********************************************************************************** ; 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という2種類の動作モードで使うことができます。
これらを使って LEDの点滅、詰まり Lチカ をやってみようと思います
;*************************************************************************************************************** ;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を使う PIC16F876A PCF8574AN
I2Cという2種類の動作モードで使うことができます。
これらを使って LEDの点滅、詰まり Lチカ をやってみようと思います
;*************************************************************************************************************** ;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