週末いろいろ

    たまには更新しないとまた塩漬けブログになってしまいそうなので、この辺りで新しい記事を投稿します。


    ◆4月13日(土)

    KSRで筑波山を再訪してみました。
    朝から用事を2つこなして昼前から出発。

    とりあえず県道42号線で経由でつつじヶ丘の駐車場まで移動。
    IMG_20190413_125702.jpg

    KSRにこの時以来6年ぶりにリアキャリが付きましたw
    DIY塗装ですが、3m離れてみればきれいなものです。満足度高し。


    ここから風返し峠の交差点まで戻ります。
    交差点は5差路になっているのですが、登って来た道(=県道42号線)と降りてきた道以外の3方向はすべて終日二輪車通行止めになっていました。
    結局、地図でクネクネ道に見えるところはしっかり通行規制が掛かっており、前回と同じ道をたどって帰ってきたというオチでした。
    行っても行かなくてもどうでもよかった感じです。
    筑波山愛好家の皆さんには申し訳ないですが、やっぱり筑波山はもういいかな。

    途中、農道っぽいところに入ってみると何かの花が満開でした。
    IMG_20190413_131456.jpg


    ◆4月14日(日)

    サクラダファミリアかJR横浜駅かというくらい終わりの見えないKSR用のCDIのプログラムを作成。

    前回までのバージョンはCDIの本体にプッシュスイッチを実装して、スイッチの操作で点火時期の設定をする仕様でした。
    今回、パソコンからUSB経由で設定値を書き込めるようにバージョンアップ中なのです。
    当然、PC側のアプリケーションを作らないといけないのですが、そんなの作ったこともなく…
    去年の秋からC#のお勉強から始めていました。
    超初心者向けと初心者向けの2冊の参考書を買って、あとはインターネッツの検索とコピー&ペーストで↓ここまで来ました。

    CDI.png

    WindowsPCとHIDデバイスとしてプログラムしたPIC24FとUSBで接続できるようになっています。
    点火時期の設定値もPCから変更できるところまで辿り着きました。
    やれやれ、と思ったらまたもや問題発覚。


    ◆4月19日(金)

    この日は働き方改革とやらの事業所全体の休日に指定されており、お休み。
    出掛けたい衝動に駆られるも、CDIのプログラムのデバックに費やしました。

    問題になっていたのはPIC24F側のプログラム。
    PCから送信した設定値がFlashメモリに書き込めていない問題の対策を考えていました。
    CDI用として使用しているPIC24FはEEPROMが無くて点火時期のデータはFLASHメモリに保存する必要があります。

    前回バージョンでは先人のお方の知恵をお借りして目的の機能を実現できていたのが、今回はうまくいかんというモード。
    前回との相違は将来の3Dマップ制御導入に向けて、設定値のデータ数を増やしたことのようです。

    PC側のプログラムとPIC側のプログラムのどちらが原因かの切り分けから始めたのですが、PIC側に問題ありとなるまでにほぼ1日かかってしまいしました。
    何しろ基本コピペプログラマーなのでなかなかすんなりいきません。



    ◆4月20日(土) ~ 4月21日(日)

    引き続きPIC24Fのプログラムを追っかけてました。日曜日の午後、ようやく何とかなったようです。

    ↓こんな感じでヘッダファイルに書きます。
    -------------------------------------------------------------------------
    /*****************************************
    PIC24F フラッシュメモリ
    ・フラッシュメモリ1ページは512命令分、1命令は3バイト  よって、1ページは1536バイト
    ・消去はページ単位
    ・書き込み64命令((196バイト)=8行)単位
    ・1ページ書くのに512/64で8回書き込み操作を行う必要がある

    点火時期テーブル
    ・テーブルのサイズは17x6x4で408バイト
     →3回書く必要ある?
    ・1命令24ビット(3バイト)幅で下位2バイト分だけアクセスできる
     →全部理解できていないかも  
    *****************************************/

    #define FLASH_PAGE 512
    #define PH_TBL_LINE 17       //点火タイミングテーブル要素数 回転数:17 0-16000rpm、1000rpmステップ
    #define PH_TBL_CUL 6       //点火タイミングテーブル要素数 負荷 :6  0-100%、20%ステップ(拡張用)
    #define PH_TBL_SIZE 408      //PH_TBL_LINE:17 x PH_TBL_CUL:6 * 4(PIC24F double型のサイズ)
    #define PAGE_LENGTH FLASH_PAGE*2 //FLASHページサイズ 512*2
    #define PAGE_ADDR 0x4000     //FLASHページ開始アドレス(プログラム領域)


    typedef union{ //点火時期計算用変数、共用体
    double ig_phase[PH_TBL_LINE][PH_TBL_CUL];
    char padding[PAGE_LENGTH];

    } FLASH_DATA;

    extern FLASH_DATA flash_tbl;   //FLASHメモリにアクセスする変数
    extern FLASH_DATA ram_tbl;    //プログラムで使用する変数

    -------------------------------------------------------------------------


    ↓ソースファイルで宣言して初期化します。
    前回バージョン要素数17の1次元配列でしたが、今回は17x6の2次元配列になっているのが書き込みできない原因でした。
    -------------------------------------------------------------------------
    /*****************************************
    // 点火時期計算用変数
    // double変数:4byte x 17行 x 6列 → 408byte 0x184
    //  共用体の定義はsystem.h -> ここで初期化する
    //  "section"で指定した名前で領域を確保する
    //  PAGE_ADDR 0x4000から1ページ分(512命令分))確保する
    // 
    *****************************************/
    FLASH_DATA flash_tbl __attribute__ ((section(".flashdata"),space(prog), address(PAGE_ADDR)))
    ={{{10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    {10.0,30.0,30.0,30.0,30.0,30.0},
    }}; //FLASHメモリ格納変数、初期値

    FLASH_DATA ram_tbl; //プログラムで使用する変数
    -------------------------------------------------------------------------

    PCからram_tblを書き換え、その値をfrash_tblに書き込む関数です。
    はじめは128バイト分しか書き込めませんでした。
    その対策版のコードが↓。
    -------------------------------------------------------------------------
    void writeConfigIntoFlashRow() {

    //フラッシュメモリ1ページは512命令*3バイト=1536バイト
    //3byte,24bit幅のため1536バイトとなるが、
    //書き込みできるのは2byte,16bitこれで512命令分は1024バイトとなる?
    //正しいかは?
    //17x6x4=408バイト分であればsize=512でも書き込み可能。
    int size=1024;

    //ram_tbl変数の先頭アドレス
    int *source = (int*)&ram_tbl;

    _prog_addressT p; // get address in program space
    _init_prog_address(p, flash_tbl); // フラッシュメモリのテーブルの先頭アドレス(=0x4000)
    _erase_flash(p); // erase a page

    while(size>0)
    {

    _write_flash16(p, source); // write first row with 16-bit data


    //1回書き込むごとに128バイト(1行、64命令、2バイト/命令)を書き込む
    //Flash_tbl[0][0]-[5][1]まで128バイト
    size -= 128;

    //1回書き込むごとにフラッシュメモリの書き込み先のアドレスを128シフトする
    p += 128;

    //一回書き込むごとにram_tblのアドレスを64シフトする
    //ここが?128ではないのか?
    //souceをint型のポイントで宣言しているから?
    // →libpic30.hのヘルパー関数の定義がintで定義されているから?
    source += 64;

    }
    -------------------------------------------------------------------------
    フラッシュメモリに1行単位で書き込むプログラムなんだけど、前回バージョンでは
    _erase_flash(p); の後に _write_flash16(p, source); を1回だけ実行するコードになっていた。
    ので、128バイト分しか書き込まなかった模様。

    そこでwhile以下のコードを追加して、1ページ分書くようにしたら無事に全データが更新されるようになった。
    だだし、自分の理解及びコメントに書いた内容が合っているかは自信なし。
    人に説明しろと言われても無理です。

    いいのか?いいんです。
    MPLAB SIMでメモリの内容みても書けているようだし。
    何よりも所詮コピペプログラマーなのでプライドはありません。



    やっぱりちゃんと腰をすえてじっくりやらないとこういうのは解決できませんね。
    兎に角、これでUSB版CDIのプログラムの骨格ができた感じです。
    何よりもPC側のプログラムが進んだことがうれしい。
    少しは先が見えたかな。


    とりあえずこんな感じということで。






    関連記事

    コメント

    非公開コメント