2019/01/26

PIC18F13K22とPIC18F23K22でI2C通信。

【i2cマスター側】 PIC18F13K22

PIC18F13Kから読み取りリクエスト->PIC18F23K22が応答というパターンです。

MCCのサンプルそのままなので、スレーブ側はI2C1_StatusCallback()内のEEPROM_Bufferを送ってきます。
データが空の時とか工夫しないとダメですね。

 

下図ではマスター側I2Cは640KHzにしてありますが、(800KHzになると通信不能だったため)

640KHzでも不安定なので、結局500KHzまで落としました。

fig1

上図PORTB7とPORTC7はLEDに使ってます。

fig2

fig3

fig4

 

 

#include "mcc_generated_files/mcc.h"
void DelayMs(int dlyms){
    while(dlyms--) __delay_ms(1);
}
void main(void)
{
    int LED_ON=0;
    uint8_t i2cData;//受信データ
    I2C_MESSAGE_STATUS i2cFlag;
    SYSTEM_Initialize();
    DelayMs(1000);
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    while (1)
    {
        LATB7=0;
        if(0==LED_ON){
            LED_ON=1;
            LATC7=1;//赤LED ON
        }else{
            LED_ON=0;
            LATC7=0;//赤LED OFF
        }
        LATB7=0;//緑LED OFF
        DelayMs(50);
        // スレーブアドレス0x08から1データ(uint8)受信要求
        I2C_MasterRead(&i2cData,1,0x08,&i2cFlag);
        while(I2C_MESSAGE_PENDING == i2cFlag){
            //処理完了まで待つ
            __delay_us(0);
        }
        if(0==i2cFlag){
            //No Error
            LATB7=1;//緑LED ON
            DelayMs(1);
        }
    }
}

 

【i2cスレーブ側】PIC18F23K22

MCCの設定はスレーブ、アドレス0x08など。

fig5

PortA1,2はLED用です。

アイドリング中のLED(LATA0)ON/OFF。I2c送受信はi2c1.cの中にあるI2C1_ISR()が行っています。
main.c
#include "mcc_generated_files/mcc.h"
void DelayMs(int dlyms){
    while(dlyms--) __delay_ms(1);
}
void main(void)
{
    int LED_ON=0;
    SYSTEM_Initialize();
    DelayMs(100);
    LATA=0;
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    while (1)
    {
        if(0==LED_ON){
            LED_ON=1;
            LATA0=1;//赤LED ON
        }else{
            LED_ON=0;
            LATA0=0;//赤LED OFF
        }
        DelayMs(50);
    }
}

i2c割り込みから呼ばれる関数の

void I2C1_StatusCallback(I2C1_SLAVE_DRIVER_STATUS i2c_bus_state);

内部switch()で緑LED(LATA1)のON/OFFをしてます。

        case I2C1_SLAVE_READ_REQUEST:
            SSP1BUF = EEPROM_Buffer[eepromAddress++];
            if(sizeof(EEPROM_Buffer) <= eepromAddress)
            {
                eepromAddress = 0;    // wrap to start of eeprom page
            }
            if(0==LED_ON){
                LED_ON=1;
                LATA1=1;//緑LED ON
            }else{
                LED_ON=0;
                LATA1=0;//緑LED OFF
            }
            break;

まぁ、MCCでGenelateすれば即席通信が可能。なハズなんですが、然に非ず。

いろいろ試す必要があると思います。

 

AVI動いただけのAVI。(注意!!!音声有[Mr Roboto / Styx])

 

この後はRS232cのモニターを作ろうかなと考えています。

fig7

何やってるかというと、左端RS232cコネクタの2番3番の信号線をADM3202へ入力->TTLでPIC18F23K22のEUSART1/2に送信

PIC18F23K22がスプールしてPIC18F13K22がi2cでそのデータを読み取る。

読み取ったデータをAE-FT234XでPCへ送信。というかなり回りくどいやりかたしてます。

なんでこうなったかと言うと

ADM3202なんて使わずに、直接PCのRS232cで読めるようにも見えますが、ボーレートが高くなるとフレーミングエラーやパリティエラーが出てきます。

ではADM3202からAE-FT234X2個をUSBポート2つつなぎPCで読み取りさせると、送信->受信の順番データが受信->送信の順でくるという矛盾がたまに発生する始末。
それはソフトウェアのバグなんじゃないの?とも思いますが、FTDIのドライバやUSBのドライバ、232cの割り込みなどが絡まってよくわかりません。
まぁ、最初からハードウェアモニタ買えば良いんだろうけど自力でどこまでできるかなぁと

なので、一旦PICへ取り込んで順次PCへ送信する事にしてみました。
結果はどうなる事やら。。。

 

2019/01/27

なんとなく、イケそうかなという感じになりました。

avi_v2実際に受信してのテストAVI (※※※音声あります※※※)

 

 

旧バージョンコレクション

何も考えずに作ったんだけど、

monitorV00

後になってPIC経由要らないじゃん?と気付いた。

9pinの基盤ひっくり返すの忘れた。

いや、オマエPICでどうやって?

最初はATtiny2313だったんです。

でも、115200bpsを受信するために20MHzのクロックを使いたかったんです。

しかし、クロック上げるとISPの書き込みが出来なくなるらしいし、ライター無いし。作るのメンドイ (げしっ

#昔はあったんだけどねぇ。。。

なのでADM3202からAE-FT234X2個でPCへ

monitorv0

蓋?もしてみた。

monitorv0B

割と気に入ってたが、どうも受信データが変。

レスポンスは送信しなけれゃ受信しないはずなのに送信する前にレスポンスを受信しているという矛盾。

PC側のプログラムは割り込み受信だし。

変だなと。

 

なので、また元の構成にもどるのでした。

おそまつ。

 

次はPC側の受信プログラムを書かなくては。。。

 

 

 

と言う訳でリストボックスに表示する簡易版プログラムを作ってみました。

その前に以前の2PORT USBだと下のように送信後に受信データが来てません。どこかで逆順か、尻切れになっている模様。さらに受信途中で送信データがスクランブルしてます。
#相手はRFIDのリーダライタなのでこんなオカシナ事になったら使い物になりません。見る意味が無いですね。

capture2

 

 

下図、今回の2PICを使ったキャプチャは綺麗に揃ってますね。本来これが正しいハズです。

受信データも正しく読んでます。

capture1

ちなみにプログラムですが、
PIC18F23K22では 232c受信->送受信が判るようにしてi2cデータへプール
PIC18F13K22では i2cで読み出し、送受信が判るようにしてFT234xで送信(タレ流し)
PCでは送られてきたデータが送信データなのか受信データか調べてリストに入れてます。

あとは汎用基盤に乗っけて完成かな。。。

 

2019/01/29

内職してみた。

内職1

あ、i2cの抵抗忘れた。。。

9pinコネクタは足をちょっと曲げて2.54mmピッチに無理矢理入れてます。
#だから斜めに入ってるの。(ぉぃ

 

ポリ線やっつけなんで裏は見せたくないが、、、

その裏

信号線は2,3、GNDのみ。

2019/03/22

DIP4を付けた

kansei

 

 

picMonitorAvi
配線はともかく。。。動作は完璧AVI。
(※※※音声あります※※※[Chicago- Hard To Say I'm Sorry])

 

今はもう少し手を加えてパリティ対応とスピード設定が可能になっています。

PIC18F23K22についてはパラメータが下記の通り

例)EUSART1 @clock 64MHz
-----------------------------------------
RCSTA1 = 0x90;//8bits nonparity
TXSTA1 = 0x04;//8bits

RCSTA1 = 0xD0;//9bits p-even /p-odd
TXSTA1 = 0x44;//9bits
-----------------------------------------
SPBRG1 = 0x82;//9600
SPBRGH1 = 0x06;

SPBRG1 = 0x40;//19200
SPBRGH1 = 0x03;

SPBRG1 = 0xA0;//38400
SPBRGH1 = 0x01;

SPBRG1 = 0x15;//57600
SPBRGH1 = 0x01;

SPBRG1 = 0x8A;//115200
SPBRGH1 = 0x00;
-----------------------------------------
4bitあれば足りるんでディップスイッチにしようかしら。。。

 

今回の回路図です。
初めて水魚堂さんの回路図エディタを使って書いてみました。感謝
まぁ色々失敗してますが勘弁してくりょぉぉ(げしっ

karozu

 

2019/02/19

ディップスイッチの関係で少しサイズを広げないと配線が難しいのでarduino unoのベースでやる事にしました。
透明アクリルケースがオサレ。

base1

例によって斜めですね。。。

konnakanji

 

もう後には引けない。。。

haiti

 

裏側の事情(ぉ

uranojijyo

まぁ、ここまでは楽なんですがね。。。

これからポリ線で接続予定。

悩む。

それ、今になって?

 

でもって、こんなんなりました。

urara-

 

こっちはAVIです。今回の曲はプリンス(イントロカット)です。

20190221AVI

一応これで完成!

ただし、送受信データが区別できるようにPCへ送っているため11.52kbpsの通信で常時送受信している

データのモニタリングは無理なので、スポットでモニタするときだけ使ってます。

 

 

元ネタ

秋月電子さんのラインモニター(57600bpsまで対応)

アナライザやらモニター

福福電子さん

データリンク社さん

鉄板のラインアイ

安曇野電子さん ( 2port USBtype)

 

SEO [PR] !uO z[y[WJ Cu