PIC16F678のI2C通信(マスター)

PIC16F678同士をI2C通信で接続するテストです。ちょっとはまった部分もありましたので記事にします。CCSのCコンパイラを使っています。

ヘッダファイル

#include 
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOPUT                    //No Power Up Timer
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled

#use delay(clock=4000000)
#use i2c(Master,Fast,sda=PIN_B4,scl=PIN_B6)

クロックは4MHz。なぜか20MHzに上げると動作しませんでした。
B4とB6を使ってクロックとデータを送信しています。プルアップの抵抗(5kΩ)をつけた回路。PIN_A0には動作確認のためLEDを付けています。

Cファイル

#include "C:\Documents and Settings\Owner\My Documents\PCW\MKB-33(i2c 7seg)\i2c_7seg_master16F687.h"

void main()
{
   int h,m,s;

 //  output_float(PIN_B4);
  // output_float(PIN_B6);

   h = 0;
   m = 0;
   s = 0;

   while(1){
      output_high(PIN_A0);

      i2c_start();//start condition

      i2c_write(0x10);//address send
      delay_us(100);

      i2c_write(h);//send data 8bytes
      delay_us(100);

      i2c_write(m);
      delay_us(100);

      i2c_write(s);
       delay_us(100);

      i2c_stop();
      delay_ms(50);
      output_low(PIN_A0);
      delay_ms(20);

      s++;
      if (s>60){
         s = 0;
         m++;
         if (m>60){
            m = 0;
            h++;
            if (h>99) h = 0;
         }
      }

   }

}

output_float(PIN_B4)が必要と書いてある記事や本がほとんどでしたが書かなくても動いてます。ストップウォッチのように3つの数字(秒、分、時)を出力します。delayで動いているので正確な時間では当然ありません。