Quantcast
Channel: JH7UBCブログ
Viewing all articles
Browse latest Browse all 440

PIC16F883その5

$
0
0
 PIC16F883/886で、I2C通信を行うためには、次のようにTRISC , SSPCON , SSPSTAT , SSPADDの各レジスタを設定します。(I2C 初期化)
 
イメージ 1
 
 今回使うPIC16F883は、I2Cマスターモードで使用しますので、SSPCONのbit3-bit0は、1000
 
 標準速度モード(100KHz)で使用しますので、SSPSTATのbit7(SMP)=1
 
 SSPADDのbit7-bit0には、マスターモードの場合は、クロックパラメータを入れます。
 
 クロックパラメータの計算は、上の図にあるように計算すると19になります。
 
 I2Cの初期化を実行した後、I2C通信が可能になります。
 
 I2C通信の手順は、次のように行います。(1バイト送信の場合)
 
 1 スタートコンディションの発行
 2 スレーブアドレスの送信
 3 スレーブからのアクノレッジ(ACK)確認
 4 データ送信
 5 ACK確認
 6 ストップコンディションの発行
 
 アセンブラ記述では、次のようになります。(サブルーチン)
 
 1 スタートコンディションの発行
I2C_Start
      BANKSEL SSPCON2
   BSF  SSPCON2,SEN     ;SSPCON2レジスタのbit0(SEN)を1にします。
      BANKSEL PIR1
      BTFSS  PIR1,SSPIF      ;PIR1レジスタのSSPIFが1になるまで待ちます。
      GOTO  $-1
      RETURN
 
2 スレーブアドレスの送信
I2C_Add
     BANKSEL PIR1
     BCF  PIR1,SSPIF        ;SSPIFのクリア
     MOVLW  LCD_ADRS   ;スレーブのアドレスをWレジスタにセット、AQM0802Aのアドレスは、0x7C
     MOVWF  SSPBUF      ;SSPBUFにアドレスを入れる
      BTFSS PIR1,SSPIF   ;PIR1レジスタのSSPIFが1になるまで待ちます。
     GOTO $-1
     RETURN
 
 3 スレーブからのアクノレッジ(ACK)確認
I2C_Ack
     BCF  STATUS,C        ;Cクリア
     BANKSEL  SSPCON2
     BTFSS  SSPCON2,ACKSTAT  ;ACKSTAT=0なら成功 C=0
     RETURN
     BSF  STATUS,C   ;ACKSTAT=1なら失敗 C=1
     RETURN
 
 4 データ送信(Wレジスタにデータがセットしてある)
I2C_Data
      BANKSEL PIR1
      BCF PIR1,SSPIF ;SSPIFのクリア
     MOVWF SSPBUF ;SSPBUFにデータを入れる
     BTFSS PIR1,SSPIF ;PIR1レジスタのSSPIFが1になるまで待ちます。
     GOTO $-1
     RETURN
 
 5 ACK確認
   3と同じ
 
 6 ストップコンディションの発行
I2C_Stop
     BANKSEL  PIR1
     BCF  PIR1,SSPIF      ;SSPIFクリア
     BANKSEL  SSPCON2
     BSF  SSPCON2,PEN  ;ストップコンディションにする。
     BANKSEL  PIR1
     BTFSS  PIR1,SSPIF   ;SSPIFが立つまで待つ。
     GOTO  $-1
     BCF  PIR1,SSPIF   ;SSPIFクリア
     RETURN
 
各サブルーチンを組み合わせて、LCDのコントロールルーチンとLCD表示ルーチンを組みます。
それは、次回 
 

Viewing all articles
Browse latest Browse all 440

Trending Articles