goo blog サービス終了のお知らせ 

としぶぅ~の「工作部屋」...毎日少しのお勉強

趣味・関心事を書いていこうと思います。

PIC16F690を動かす。。。その9(I2C-LCDモジュール)

2013-03-13 08:06:46 | PIC16F690

おはようございます。
としぶぅ~です。

本日はコーディングして動作確認してたら投稿の時間なくなりました(^_^;)
ま、まだうまくlcdの表示ができてないんですが。。。
明日は、回路の配線が間違ってないか?から始めて、信号がちゃんと出てるかをかくにんします。

ちょっと時間かかるかな~

今日はスマホから現状の報告&投稿でした。
それでわ皆様よいいちにちを(^○^)


PIC16F690を動かす。。。その8(I2C-LCDモジュール)

2013-03-12 05:26:58 | PIC16F690

おはようございます。

としぶぅ~です。

 

なんか眠たいです。。。。休みはちゃんと寝たはずなんですが。。。。

春!。。。。ということでしょうか(笑)

 

さて今日は、プログラムを少しさわってタイミングを調整しました。

プログラムは大分すっきりしましたかね。。。

一応リスト載せときます。(あまり参考にならないかもしれませんが・・・・)

#include
#include    "delay.h"

void I2C_DELAY();
void I2C_DELAY_DT();
void i2c_stop();


//i2cの初期化
void i2cinit(unsigned char i2cmode)
{

    /*************************************************
    SPIモード
    spimode = 0000 :spi-master-mode OSC/4
    spimode = 0001 :spi-master-mode OSC/16
    spimode = 0010 :spi-master-mode OSC/64
    spimode = 0011 :spi-master-mode TMR2 output/2
    spimode = 0010 :spi-slave-mode SSpin Disable
    spimode = 0010 :spi-slave-mode SSpin Enable
    **************************************************/

    unsigned char i2cmode0;
    
    i2cmode0=(SSPCON & 0xf0) | i2cmode;
    SSPCON=i2cmode0;
//    SSPM=i2cmode;        //I2Cモードの設定
    CKP=1;                //送信up-受信down
    SMP=0;                //I2C mode:clear
    CKE=0;                //I2C mode:clear
    D_nA=0;                //I2C mode:(0:ADDRESS/1:DATA)
    R_nW=0;                //I2C mode:(0:write/1:read)
    P=0;                //I2C mode:STOP bit(0:not detected/1:detect)
    S=0;                //I2C mode:START bit(0:not detected/1:detect)
    
    TRISB4=0;            //RB4/SDA:output select
    TRISB6=0;            //RB1/SCL:output select

//initialize Start bit
    RB4=1;                //RB4/SDA
    RB6=1;                //RB1/SCL

    SSPEN=1;            //SPI port enable
    SSPIE=1;            //SSP Interrupt enable
    SSPIF=0;            //SSP Interrupt status

}

//I2C start bit output
void i2c_start()
{
    TRISB4=1;            //RB4/SDA _|
    DelayUs(5);
    TRISB6=1;            //RB1/SCL _|

    DelayUs(5);

    TRISB4=0;            //RB4/SDA |_
    DelayUs(5);
    TRISB6=0;            //RB1/SCL |_
    DelayUs(5);
}

//I2C stop bit output
void i2c_stop()
{
    TRISB6=0;            //RB4/SDA _|
    DelayUs(5);
    TRISB6=0;            //RB1/SCL _|

    DelayUs(5);

    TRISB6=1;            //RB4/SDA |_
    DelayUs(5);
    TRISB4=1;            //RB1/SCL |_
    DelayUs(5);
}


//I2C data 1バイト送信
void i2c_8bit_out(unsigned char out_data)
{
    unsigned char dtcnt,point;
    unsigned char data;
    unsigned char outdata;

    outdata=out_data;
    point=0x80;
    data=0;
    dtcnt=8;
    
    while(dtcnt!=0)
    {
        dtcnt--;
        if(outdata & point){
            data=1;
        }else data=0;
        point=point >> 1;

//bit7    
        TRISB4=data;            //RB4/SDA **
        DelayUs(5);
//CLOCK
        TRISB6=1;            //RB1/SCL _|
        DelayUs(10);
        TRISB6=0;            //RB1/SCL |_
        DelayUs(5);
    }
//ACC CLOCK
    DelayUs(20);
    TRISB6=1;            //RB1/SCL _|
    DelayUs(10);
    TRISB6=0;            //RB1/SCL |_
    DelayUs(5);    
}

上記で作った関数をmain()に組み込みます

//I2Cモードイニシャライズ
    i2cinit(i2cmode);
    i2c_start();
    i2c_8bit_out(0x70);
    while(!I2C_ACK){I2C_ACK=0;}
    i2c_8bit_out(1);
    i2c_stop();

 

こんな感じですかね。。。

まず

①イニシャライズ

②スタートビット出力

③アドレス出力

④アクノレッジ信号待ち(割り込み)

⑤データ出力

⑥ストップビット出力

こんな手順です。

上記プログラムを使うことで、周波数は50KHzくらいになりました。。。

100KHzでもできますが(一応動いてました)。。。。なんせシーケンスで”H"”L"出力しているので。。。大変!

ということで50KHzで通信するようにします。

波形は下記

上記プログラムを実行すると下記ののように波形が出力されます。

上がデータ(SDA)、下がクロック(SCL)

周波数は50KHz

上がデータ(SDA)、下がクロック(SCL)

”H"パルス幅は、5.6uS

上がデータ(SDA)、下がクロック(SCL)

動作的には問題ないかな・・・・

ちなみにPICのマスタークロックは外部のセラロック20MHzを使用しています。

 

さて、タイミングの調整はこの辺でいいかなと思いますので。。。

明日からはLCD用の関数に、I2C通信を埋め込んでいこうと思います。

。。。。順調に行けばいいですが。。。。うまくいかないほうが楽しめる?(笑)

 

さあきょうはこの辺にしておきます。

 

それでは今日も一日よい一日を~(^o^)/

 

 

 


PIC16F690を動かす。。。その7(I2C-LCDモジュール)

2013-03-11 06:08:49 | PIC16F690

おはようございます。

としぶぅ~です。

今日は寒いですね~。。。。また冬に逆戻りでしょうか。。。。憂鬱です。

 

さて本日は、昨日I2Cの通信がなんとかうまくいったので本日はプログラムを少しさわりました。

まずは、現状外部クロックを使っていていままでの内部クロック8MHz→20MHzと大幅にクロックが

高くなっているのでタイマー関連がくるっているので調整しました。

8MHzで20000サイクルで10mSにしていましたが、20MHzで50000サイクルで10mSに修正

これでLEDの点滅も1秒おきにONとOFFを繰り返すようになりました。

こうすると。。。。I2Cの周波数、wait時間も大幅にくるってきます。。。。これは明日以降に^^;

もう一点は、昨日はとりあえず動かすことを目的にプログラムを作ったので。。。。とりあえず順番に

ポート制御しただけのコードになっていますので、少し見やすいように修正しました。

 

後、ちゃんとI2Cエクスパンだーが動いているかわからないので、1秒おきにON-OFFを繰り返すように

プログラムを変更!

動作は、

LED-OFF

LED-ON

動いているようです。

 

波形も。。。。ポート0でON-OFFさせているので一番最後のbitが変化するようになっています。

さて、今日はこの辺です。

 

今日は東日本大震災よりちょうど2年なんですね。。。。われわれは忘れてはいけませんね。。

未だ復興しない東北・・・・・悲しくなりますね。。。本日よりまた、心に留めて行動していきたいと思います。

 

それでは皆さま本日もよい一日を~(^o^)/

 

 


PIC16F690を動かす。。。その6(I2C-LCDモジュール)

2013-03-10 18:07:32 | PIC16F690

 

 

こんにちわ(もう夕方ですが・・・)

としぶぅ~です。

 

先日Pickit3も治ったし、ICD3も買ったし。。。。さてやるかと朝からしばらく止まっていた

PIC16F690でI2Cを・・・・・

ということで、PCF8574というI2Cエクスパンダーつまり、I2C-パラレル変換ICですね。。。

の制御をやりました。

とりあえず動かしてみることが重要ということで、プログラムは応用を考えずに順番にポート

の制御を1行ずつかいて無限ループをかけました。。。

通信速度は100KHz/maxということでかな~りおそい。。。1行づつ並べてもタイミングがまず

あわない(^^;

Delayの関数を使って結構調整しました。

タイミングを合わせましたが。。。。!?why?

動かない(笑)

まずタイミング。。。問題ないようだ。。。

割り込みは入っているか?。。。。。入っていない

 → どうの型式によってアドレスが違うようなので再度ICと取り説を確認!

    現在使っているのはPCF8574Aという型式なのでアドレスが”111”にしないといけないらしい

    ずっとPCF8574だと思って”100”にしていた(^^;

さて動くか、、、、うごかん!

今度は書き込みのタイミングを取り説を見直し・・・・・おっ!

違うところがありました。。。。アドレスとデータの間のアクノレッジ信号用にもクロックを出さないといけ 

ない!!抜けてました。。。。。。そこいれると。。。。あ~ら不思議!(笑)

動き始めました!!!

チェック用にターゲットボードのP0ポートにLEDをつけておきました。

OK!ちゃんとついてます。(^^)

 

よかった~

とりあえず写真

こんな感じ。

新しいICD3が光ってます(^^)

ターゲットボードは。。。。LCDをはずしてLEDをつけてあります。(未使用ポート)

波形もこんな感じ

大丈夫っぽいでしょ!

 

さて今日はこの辺にして。。。。。あすからは応用が利くようにまずプログラムを修正していきます。

 

それでは今日はこの辺で(^^)/~

 

 


PIC16F690を動かす。。。その5(I2C-LCDモジュール)

2013-02-17 18:07:47 | PIC16F690

こんにちわ

としぶぅ~です。

 

昨日、今日とほとんど外に出なかった・・・・^^;

何をしていたかって?

それは。。。。しばらくブログかけなかったので、書けるようにチェック用のボードを

作ってました!

なんか一から作ると時間かかりすぎ~

だからやらなくなってくるんだな・・・・(笑)

とりあえずPIC16F690ののせたシンプルなボードです。

写真はこちら・・・

回路図はこちら

今回はI2Cの確認をするためのボードなのでシンプルです。

今後いろいろ追加する事になると思いますが・・・

で、I2Cエクスパンダ経由でLCDを制御するボードも作りました。

なかなか手をつけてなかったんですが。。。。今回何とか一気に作っちゃいました。

ケーブルも手作り!!

結構大変でしたよ^^

回路は・・・・以前アップしたけど・・・・

これですかね・・・チェック用のLEDと電源ラインに47uFの電解コンデンサ追加・・・とプルアップは1KΩⅡ変更

また。。。動かし始めたら修正します。

で、ボード作成後のチェックにて。。。PICKIT3を壊してしまったようです(;_;)

PIC16F690のボードに電源を入れたとき、配線ミスで電源とグランドがひっくり返っていました・・・

PICKIT3の供給口ですね。。。動かないので探っている間に。。。。。。逝ってしまったようです。

状況は接続時に、デバイスIDを読み出せない・・・・という状況です。

(ボードとのラインに入っているICが燃えたかな・・・)

 

また買わねば。。。。予定外の出費。。。ま、しょうがない・・・しばらくはPICKIT2で頑張ります。

 

後、回路は今回外部クロック使っています。。。というか使えるようにと言ったほうがいいだろうか・・

とりあえずICソケットつけて抜き差し可能にしました。

現在プログラムで、LEDが1秒ずつついたり消えたりしてます。(内部クロック8MHz使用時)

外部クロックで使うと、プログラムそのままだと、LEDは0.4秒ごとについたり消えたりします。

(外部取り付けセラロック20MHz)

とりあえず早くなる事はわかります。

ちょっとスピードアップしようかな。。。ということです。

 

さて、それではこのハードを使って今後確認進めていきます。

 

とりあえず今日はこの辺で(^o^)/