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

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

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

2013-03-14 06:11:27 | PIC16F690

おはようございます。

としぶぅ~です。

 

昨日は暑かった・・・・今日はまた寒くなるようです^^;

 

さて・・・本日は、

LCDの表示をやっています。

昨日の夜、LCDモジュールに表示が「でた!」

でーきーたー!!

と喜んでROM化したら表示が出なくなった・・・・^^;

デバッグ中は出たんですけどね・・・

いろいろさわりましたが。。。未だ復帰せず。

なんかが不安定ですね・・・・・・

現在こんな感じ

LCDの”E"と”RS"信号はこんな感じ・・・

I2Cエクスパンダはちゃんと動いていそうですね。。。。

(ポートが変化している・・・・)

やったことは、DELAY時間をいろいろさわってみました。

 

いまいちですね。。。。変な文字が表示されることも・・・・

外部クロックを使っているのでDELAY関数が全然あっていないのかな・・・

今晩?明日の朝?・・・・

その辺さわってみようと思います・・・・今日ももうこんな時間。。。仕事行く準備しないと。。。

今日はこの辺にします。

 

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

 


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をつけてあります。(未使用ポート)

波形もこんな感じ

大丈夫っぽいでしょ!

 

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

 

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