;*********************************************************************************** ; 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種類の動作モードで使うことができます。
I2Cという2種類の動作モードで使うことができます。
↓

RC3/SCK/SCLとRC4/SDI/SDA を使います。
↓
IO Expander が PCF8574AN TEXAS社
16pin Dip で 8bit I/O です
回路を組む上で注意しなければならない事が有ります
それは出力で使うときの電流値です
Low出力は50mA流せますからリレー動きますよね
ところが
High出力はたったの4mA
LEDを点灯しようとしても昔のLEDだと暗くて話しに成りません
もう一つ押さえておきたいことは入力として使用した場合
OPEN = High だという事です、入力端子の空きピン処理は考慮に
入れて置かなければなりませんね
↓


またスレーブアドレスが僅かな型式違いで異なるので知らないと焦ります
驚くのは同じPCF8574Aでもスレーブアドレスが違うって・・・何?
購入するときは良く確認しなければなりません
特にこのマニュアル
どう考えてもおかしい、このスレーブアドレスで設計された記事を
全く見掛けません、マニュアルのダウンロードにもご注意下さい
仮にスレーブアドレス 0x20 とした場合、READ アドレスは 0x21
てなければならない、なのに A0 = High と成ったときに 0x21に
成って居ます、通常は LSBがHigh に成った場合スレーブアドレスは
0x02加算されなければなりません、なんで?
↓
これらを使って LEDの点滅、詰まり Lチカ をやってみようと思います
この組み合わせにした理由ですが下記の様な条件が在ったからです・・・
・GPIOを使う
・LEDを50個ぐらい使う
・スイッチを20個ぐらい使う
・メンブレン・パネルに実装したい
・UART / I2C は可能
・SPI はダメ
・・・とこんな条件なのですがGPIOではピン数が限定的でとても
これだけの I/O はカバー仕切れません、その為に IO Expander を採用しました
I2Cにしたのは過去にハードウェアのみ経験しているからです
ところが採用したい I2C のソフトウェアに問題が在るのです
私はめっきりソフトウェアに弱いので皆様のように C言語でサクッ!! っと
プログラミング出来ません、なのでどうするか・・・・
・アセンブラ言語とする
・可能な限りネット検索してプログラムを引っぱってくる
・ブレッドボードを使う
・・・・こんな地味ぃな戦略なのです
2018/12/07(金)
ブレッドボードに仮組みしてみました
↓
写真で出来て居る事は、出力制御です、8bit 出力の確認をLEDで
行って居ます。
ここで判った事ですが上でも書いたように出力が Low / High で
電流値が大きく異なり、実際のLEDを接続するとこんな感じです。
この写真は出力Highの様子です、LEDは点いているのか消えているのか
良く視ないと判別がつきません
↓
一方でこの写真は出力Lowの様子で、これが正常ですよね。
↓
この様にバッファー・ドライバー無しで使うときは注意が必要です
ソースコードの窓をこのブログに作りたいのですが面倒なので
後回しです、下記の通りです、折り返しが出ていますので
コピペの後、ご注意下さいこのままだとコンパイルエラーが出ます
トランジスタ・アレイ程度ならHighでドライブ出来ると思いますが
確認はマストですね。
話が少し逸れますが、使用している PIC KIT3 ですが壊した経緯が
有ります、原因はVDDに +24V が印加された為、PIC KIT3のあの
スケルトンで中が燃えているのが見えました、ひやぁーーー、でした
まぁ回路屋なので回路図をネット検索して探し、壊れて居そうな部品
をRSコンポーネンツで購入し直しました、ですがもう二度とあんな事は
嫌なのでプロテクタを中間に入れて使用しています。
↓
ツェナーダイオードの大きめのを入れ、抵抗が燃え切れる様にしました
序でなのでPIC KIT3が付いたままだと動かない事、って有りますよね
なので CLK / DAT をスイッチで切れる様にもして居ます、以来
気をつけているのでトラブルは無いですが、また在ると嫌だな。
↓
ブレッドボードで製作した回路ではプログラムに書かれた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
何故か同期はビデオだと良く見えました、なんで?
↓
—記事制作中—
ACE AR-200 2 transister ラヂヲ
昭和何年か不明の2石トランジスタ・ラヂヲのキットとして販売されて
居た様子です、もう忘れてしまったのですがYahoo!オークションで
購入したものです。
2石ということでいわゆる「再生式検波回路」のラヂヲですね
電池が006Pの9Vですが、イアフォンは通常のマグネティック型では
回路の実力不足で音を出すことが出来ません、つまり当時は
クリスタル・イアフォンだったという事に成ります
アンテナ端子は有るには有るのですが東京都ですと近隣に送信所
が多いためかアンテナを接続すると混信変調が掛かってしまい
チューニング出来ません、小さいながらもバーアンテナの向きで
受信した方が良く聞こえます。
当時はこうしたラヂヲでも貴重品でした、増してやラヂヲ少年少女
の皆様には入門機として大いに学習の役に立った事でしょう。