Vol.837 21.Jan.2022

MPLAB_X_IDEでMCCが起動しない USB経由でパソコンからPICの制御 Wordで差し込み印刷

M MPLAB_X_IDEでMCCが起動しない

by fjk

 PICの開発にMPLAB_X_IDE(v5.50)とMCC(v5.3.0)を使っているが、最近、PIC16F1455で新規のプロジェクトを作ろうとしたところ、「デバイス未対応」エラーメッセージが出てMCCが起動しなくなった。
 これは、MCCのV5.3.3のバージョンにバグがあるものと思われる。
 同じエラーは他の方からも報告があり、その解決策の一つとして、「趣味と仕事は両立できるのか」に紹介されている方法で、V5.2.1へのダウングレードをすると(V5.0.3と表示されているが・・)、途中で確認メッセージが出てくるが、MCCを起動することができた。
 なお、MCCのCoreのバージョンを一度ダウングレードしたプロジェクトを再度OpenしてもMCCのバージョンは維持されているようです。
 新しいCore v5.4.0のリリースが準備されているので、いずれは解決すると思えるのだが・・。

未対応メッセージ MCC Coreバージョン


P USB通信でパソコンからPICの制御 〜USB割込とLED表示

by fjk

 前報(abc836)でPIC16F1455を使ってパソコンと簡単にUSB通信ができること判ったが、返信データの改行が行えなかった。そこで、送信プログラム変更と、通信に割り込みを使用し、デジタル出力(LEDの点灯)も付け加えることにした。
 前報ではUSBの状態をPOLINGモード確認していたので、USBDeviceTasks()を一定時間毎に呼び出す必要があったが、INTERRUPTモードでは、USBDeviceTasks()ハンドラー内でUSBDeviceTasks()が実行されるので、メインループ内にUSBDeviceTasks()を記述する必要がなくなる。ただし、「グルーバル割り込み」と「通信割り込み」を許可する必要がある。
 なお、テスト回路はabc836より一部変更した

テスト用回路(VRは今回未使用) MCCによるUSB設定
(デフォルトのままINTERRUPTにチェック)
System Moduleでclockを48MHzに設定 Pin ManagerでRA5をデジタル出力に設定
Interrupt Moduleで割込確認 Pin Module設定
(RA5はPinModuleで「LED」と名付けた)

 USB送信サブルーチンでは、送信準備ができるまで待ち、その後、データをセットし、CDCアプリケーションを実行している。
 なお、USB受信で文字列を取得しても受信バッファーに文字列の終わりを示す\0(ヌル文字)が追加(送信?)されず、受信文字の後ろにゴミ文字が残ることがあり、正しい受信文字数とならないことがあるので、受信をする前にclrBuffer()で受信バッファーをクリアしている。

#include "mcc_generated_files/mcc.h"
#define  BFSIZE 64

char NEWLINE[] = "\r\n";

static uint8_t sBuf[BFSIZE];
static uint8_t rBuf[BFSIZE];

void SendUSB_str(uint8_t *str){			// 文字列をUSBで送信
    do
    	CDCTxService();
    while (!USBUSARTIsTxTrfReady());		// 送信準備の確認
    putsUSBUSART((uint8_t *)str);
    CDCTxService();				// 送信開始
}

void clrBuffer(){				// 受信バッファーのクリア
    uint8_t i;
    for(i = 0; i < BFSIZE; i++) rBuf[i] = 0;
}

/*=====   Main application  ===== */
void main(void){
    SYSTEM_Initialize();
    INTERRUPT_GlobalInterruptEnable();		// グローバル割り込み許可
    INTERRUPT_PeripheralInterruptEnable();	// 通信割り込み許可
    int num = 0;
    LED_SetHigh(); 
 
    while (1) {
      	num = getsUSBUSART(rBuf,sizeof(rBuf));	// 受信バッファー取得
        if(num > 0){				// 受信データがあれば
	    SendUSB_str("PIC> ");		// プロンプト表示
            SendUSB_str(rBuf);			// 受信データをそのまま返す
            SendUSB_str(NEWLINE);
            if ((rBuf[0] & 0x01) == 0)		// bit0が1ならLED点灯
                LED_SetLow();
            else				// bit0が0ならLED消灯
                LED_SetHigh();
            clrBuffer();			// 受信バッファーのゴミ対策
        }
    } 
}

【実行結果】
 abc736で開発したUSB通信ソフトを使って、パソコンとPICとのUSB通信を行ったところ、送った文字列がそのままエコーバックされた。また、文字列の最初の文字の最下位ビットが1(例えば'1'や'a')の場合はLEDが点灯し、最下位ビットが0(例えば'0'や‘b’)の場合はLEDが消灯した。
 しかし、文字や改行が正しくエコーバックされないことが時々発生した。そこで、通信データを解析したところ、改行コードとして0DHのみが送受信されていたが、abc736の通信ソフトを再度ビルドし直したところ、0DHと0AHが送受信され、abc736では改行が正常に行われようになった。しかしabc737ではデータは正しいが、改行が1または2度行われることがあり、もう少し検討する余地がありそう。

テスト回路(LED点灯中) パソコン上の通信ソフト画面


W Wordで差し込み印刷 〜1枚に複数のレコードを

by fjk

 Wordで差し込み印刷を行うと、1レコード毎に1ページが印刷される。しかし、宛名や領収書などで1枚の用紙に複数のレコードを差し込んで印刷したいことがある。これを実現するには、

@差し込みに使用するExcelファイルを作る(1行目を項目名とし、2行目からデータを記入)
A差し込みたいWord文書を作成する。
BWordで「差し込み文書」タブを選び、「宛先の選択」で差し込むExcelファイルを選ぶ。
CWord文書の差し込みたい位置で、「差し込みフィールドの選択」し、Excelファイルの項目を選ぶ。
 (差し込みたい位置で、必要な回数、差し込みを行う。)

 このままでは、全て最初のレコードのみが差し込まれるが、「ルール」から<<Next Record>>を選んで挿入すると、それ以降には次のレコードのデータが差し込まれる。そこで、この<<Next Record>>を必要な分だけ差し込むと、複数のレコードを1ページに差し込むことができる。
 希望通りにデータが差し込まれるか確認するには、「結果のプレビュー」で確認できる

【差し込みのルール】    
Ask (問い合わせ)
Fill-in (文字列の書込)
If...Then...Else (条件により・・)
Merge Record # (レコードの差し込み)
Merge Sequence # (差し込み順序)
Next Record (次のレコード)
Next Record If (条件により次レコード)
Set Bookmark (ブックマークの設定)
Skip Record (条件によりレコードをスキップ)
差し込み前 差し込み後


MPLAB_X_IDEでMCCが起動しない USB経由でパソコンからPICの制御 Wordで差し込み印刷