fc2ブログ

PIC 16F1827 ENHANCED UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER (EUSART) 簡易送信使用例(備忘録)

PIC 16F1827 の EUSART の簡易な送信機能のみの使用例です。
PICの初期化のベースは「PIC 16F1827,16F8313 A/D利用向け初期化例(備忘録)」を使用しています。

RB5をTXとして使用しています。

■主要部分抜粋
//main.c

    EUSART_Initialize();
    EUSART_Enable();
    EUSART_TransmitEnable();

    HSSync; //動作確認テスト用 本来不要

    while(true){
        while (EUSART_IsTxReady() == false){} EUSART_Write(0x01);        //送信バッファ空きを待ち、1Byte送信
        while (EUSART_IsTxReady() == false){} EUSART_Write(rand()%255);  //送信バッファ空きを待ち、1Byte送信
    }


//uart.c  EUARTをuartと省略しています。

//UART関連レジスタ設定
void EUSART_Initialize(void){

//ビット 4 SCKP: 同期クロック極性選択ビット
//非同期モード:
//   1 = RB7/TX/CKピンへの反転データ送信
//   0 = RB7/TX/CK 端子に非反転データを送信する。
    BAUDCONbits.SCKP = 0;  

//ビット3 BRG16:16ビット・ボーレート・ジェネレータ・ビット
//   1 = 16ビット・ボーレート・ジェネレーターが使用される
//   0 = 8ビット・ボーレート発生器が使用される
    BAUDCONbits.BRG16= 0;  //将来、自動設定するかもしれない。

//    bit 1 WUE:ウェイクアップイネーブルビット
//非同期モード:
//   1 = 受信機は立ち下がりエッジを待っている。
//キャラクタは受信されず、バイト RCIF が設定される。
//RCIF が設定された後、WUE は自動的にクリアされます。
//   0 = 受信機は正常に動作しています。
//同期モード:
//   気にしない
//    BAUDCONbits.WUE = 0;    //R/Wではあるが、設定不要と思われる。
   
//ビット 0 ABDEN: 自動ボー検出イネーブルビット
//非同期モード:
//   1 = 自動ボー検出モードが有効(自動ボーが完了するとクリアされる)
//   0 = オートボー検出モード無効
//同期モード:
//   気にしない    
    BAUDCONbits.ABDEN = 0;


//bit 7 SPEN:シリアルポートイネーブルビット
//   1 = シリアルポートイネーブル(RX/DTおよびTX/CKピンをシリアルポートピンとして設定)
//   0 = シリアルポートディセーブル(リセット状態に保持)    
    RCSTAbits.SPEN = 1;

//bit 6 RX9: 9ビット受信イネーブル bit
//   1 = 9ビット受信を選択
//   0 = 8ビット受信を選択
    RCSTAbits.RX9 = 0;

//bit 5 SREN: シングル受信イネーブルビット
//非同期モード:
//   気にしない
//
//同期モード - マスター:
//   1 = シングル受信を有効にする
//   0 = シングル受信無効
//このビットは受信完了後にクリアされる。
//    RCSTAbits.SREN =  //非同期のため無設定

//ビット4 CREN: 連続受信イネーブルビット
//非同期モード:
//   1 = 受信可能
//   0 = レシーバー無効
//同期モード:
//   1 = イネーブルビット CREN がクリアされるまで連続受信を有効にする(CREN は SREN より優先される)
//   0 = 連続受信を禁止
    RCSTAbits.CREN = 0;     //用途によって変更する事

//ビット 3 ADDEN: アドレス検出イネーブルビット
//非同期モード 9 ビット(RX9 = 1):
//   1 = アドレス検出を有効にし、割り込みを有効にし、RSR<8>が設定されているときに受信バッファをロードする。
//   0 = アドレス検出を無効、全バイトを受信、9ビット目をパリティ・ビットとして使用可能
//非同期モード8ビット(RX9 = 0):
//   気にしない
    RCSTAbits.ADDEN = 0;    //用途によって変更する事


//ボーレート・ジェネレーター(BRG)
// SPBRGH:SPBRGL x = (Fosc/Desired Baud Rate)/64) - 1;
//  32MHz 19.2K の場合 25.04166
//    SPBRGL = 25;
//    SPBRGL = 12; //38.4k
//    SPBRGL = 3; //57.6K (55.55K))
//    SPBRGL = 1; //250000
    SPBRGL = 1; //250000
    SPBRGH = 0;

//ビット 7 CSRC: クロックソース選択ビット
//非同期モード:
//気にしない
//同期モード:
//   1 = マスター・モード(BRGから内部で生成されたクロック)
//   0 = スレーブモード (外部クロック)
    TXSTAbits.CSRC = 0;

//ビット6 TX9:9ビット送信イネーブルビット
//   1 = 9ビット送信を選択
//   0 = 8ビット送信を選択
    TXSTAbits.TX9 = 0;

//ビット5 TXEN:送信イネーブルビット(1)
//   1 = 送信イネーブル
//   0 = 送信無効
    TXSTAbits.TXEN = 0;
//注1:同期モードではSREN/CRENがTXENより優先される
   
//ビット4 SYNC: EUSARTモード選択ビット
//   1 = 同期モード
//   0 = 非同期モード
    TXSTAbits.SYNC = 0;
   
//ビット2 BRGH:高ボーレート選択ビット
//非同期モード:
//   1 = 高速
//   0 = 低速
//同期モード:
//   このモードでは未使用
    TXSTAbits.BRGH = 0;


//bit 7 RXDTSEL: Pin Selection bit
//0 = RX/DT function is on RB1
//1 = RX/DT function is on RB2
    APFCON0bits.RXDTSEL = 1;

//bit 0 TXCKSEL: Pin Selection bit
//0 = TX/CK function is on RB2
//1 = TX/CK function is on RB5
    APFCON1bits.TXCKSEL = 1;
}

void EUSART_Enable(void)
{
    RCSTAbits.SPEN = 1;
}

void EUSART_TransmitEnable(void)
{
    TXSTAbits.TXEN = 1;
}

bool EUSART_IsTxReady(void)
{
    //TXIFビットは読み出し専用で、ソフトウェアで設定または解除することはできません。
    return (bool)(PIR1bits.TXIF && TXSTAbits.TXEN);
}

void EUSART_Write(uint8_t txData)
{
    TXREG = txData;
}

//HSSend.h

#define HSSync while (EUSART_IsTxReady() == false){} EUSART_Write(0x02); while (EUSART_IsTxReady() == false){} EUSART_Write(0xD5);



下図は検証用に使用した回路です。
PIC 16F1827 ENHANCED UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER (EUSART) 簡易送信使用例(備忘録)
PIC 11ピン(RB5)がEUSARTの送信用出力ピンです。

RB5(TX)から送信されたデータは下図の通りです。
PIC 16F1827 ENHANCED UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER (EUSART) 簡易送信使用例(備忘録)


下図は送信データをPCで受け、EUSART_Write(0x01); EUSART_Write(rand()%255);で送信されたものを一組の2Byteデータとして扱い、グラフ化したものです。ランダムな変化を確認しています。
PIC 16F1827 ENHANCED UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER (EUSART) 簡易送信使用例(備忘録)


PIC 16F1827 Analog-to-Digital Converter (ADC) Module使用例(備忘録)

PIC 16F1827 内蔵 Analog-to-Digital Converter (ADC) Module の簡単な使用例です。
PICの初期化のベースは「PIC 16F1827,16F8313 A/D利用向け初期化例(備忘録)」を使用しています。

動作確認の為に Enhanced Universal Synchronous Asynchronous Receiver Transmitter (EUSART) を利用して
PCのCOMポートにデータを送り検証しています。

RB3をAnalog inputとして使用した例です。

■主要部分抜粋

//main.c
    TRISB = 0x08;   //RB3:入力ピン 他:出力pin
    ANSELBbits.ANSB3 = 1; //Analog input

    BatteryVoltageReadInitialize();     //A/D初期化
    BatteryVoltageReadStart();          //A/D起動
    while (true) {
        BatteryVoltageRead();           //一回分の読み取り
    }

//BatteryVoltageRead.c

//↓A/Dを使用するに当たっての最も重要な部分
void BatteryVoltageReadInitialize(void) {
    PortConfiguration();
    ChannelSelection();
    ADCVoltageReferenceSelection();
    ADCConversionClockSource();
    InterruptControl();
    ResultFormat();
    WaitAcquisitionTime();
}

static void PortConfiguration(void) {
    ANSELBbits.ANSB3 = 1; //Analog input
    TRISBbits.TRISB3 = 1; //input (AN9)
}

static void ChannelSelection(void) {
    ADCON0 = 0x25; //AN9;not in progress;ADC is enabled; GO:0;  
}

static void ADCVoltageReferenceSelection(void) {
    //FVRCON:
    // bit7:   1; Fixed Voltage Reference Enable bit; Fixed Voltage Reference is enabled
    // bit6:   1; Fixed Voltage Reference Ready Flag bit(1); Fixed Voltage Reference output is ready for use
    // bit5-4: 00; Reserved: Read as ‘0’. Maintain these bits clear
    // bit3-2: 00: Comparator and DAC Fixed Voltage Reference Peripheral output is off.
    // bit1-0: 10: ADC Fixed Voltage Reference Peripheral output is 2x (2.048V)(2)
    FVRCON = 0xC2;
}

static void ADCConversionClockSource(void) {
    ADCON1bits.ADCS = 7; //A/D Conversion Clock Select bits; 111 = FRC (clock supplied from a dedicated RC oscillator)
    ADCON1bits.ADNREF = 0;  //0 = VREF- is connected to AVSS
    ADCON1bits.ADPREF = 3;  //11 = VREF+ is connected to internal fixed voltage reference
}

static void InterruptControl(void) {
}

static void ResultFormat(void) {
    ADCON1bits.ADFM = 1; //A/D Result Format Select bit;1 = Right justified. Six Most Significant bits of ADRESH are set to ‘0’ when the conversion result is loaded.
}

static void WaitAcquisitionTime(void) {
//    for (int i = 0; 100 > i; i++) {
    for (int i = 0; 2 > i; i++) {  //テストの為、短くしてある
    }
}

//
uint8_t BVRSTS;

void BatteryVoltageReadStart(void) {
    BVRSTS = 0;
}

void BatteryVoltageRead(void) {
    uint8_t L;
    uint8_t H;
    switch (BVRSTS) {
        case 0:
            HSSendP(0x09,0x00);  //検証の為、232Cで通過ポイントを送信
            ADCON0bits.GO = 1;
            BVRSTS++;
            break;
        case 1:
            HSSendP(0x09,0x40); //検証の為、232Cで通過ポイントを送信
            BVRSTS++;
            break;
        case 2:
            HSSendP(0x09,0x80); //検証の為、232Cで通過ポイントを送信
            if ((ADCON0bits.GO_nDONE == 0) && (ADIF == 1)) { //読取り完了
                HSSendP(0x09,0xC0);
                L = ADRESL;
                H = ADRESH;
                HSSendP(0x09,0x00); //検証の為、232Cで通過ポイントを送信
                ADCON0bits.GO = 1;
                BVRSTS = 1;
               
                while (EUSART_IsTxReady() == false){}
                EUSART_Write(H); //検証の為、232CでA/D変換したデータの上位byteを送信
                while (EUSART_IsTxReady() == false){}
                EUSART_Write(L); //検証の為、232CでA/D変換したデータの下位byteを送信
            }
            break;
    }

}

※ HSSendP、EUSART_Writeは検証用であり、本来は必要ありません。
※ main.c で while (true) { BatteryVoltageRead(); } 、 BatteryVoltageRead(void)内の switch (BVRSTS) にて ワンステップ毎に戻り、ループを繰り返しているのはマルチタスク用に作成しタスクの実行権を都度手放すようにしたものを流用している為です。BatteryVoltageRead(void)の中で1データの読み取り開始から完了まで完結しても何ら問題はありません。


下図は検証用に使用した回路です。
PIC 16F1827 Analog-to-Digital Converter (ADC) Module使用例(備忘録)
PIC 9ピン(RB3)がA/D用の入力ピン。
PIC 11ピン(RB5)が232Cの送信用出力ピンです。検証用にA/D変換されたデータを送っています。

RB5(TX)から送信されたデータは下図の通りです。
PIC 16F1827 Analog-to-Digital Converter (ADC) Module使用例(備忘録)
0x02A1が一回のA/Dから読み取ったデータで 1.346V を示しています。この時、電池が装着されています。


下図は電池なしでPICリセット後、電池を装着→取り外しを行った時の様子です。


PIC 16F1827 Analog-to-Digital Converter (ADC) Module使用例(備忘録)
Y軸:電圧(V)
X軸:232Cデータ受信番号(calcの列番号と合わせてある)。
03ch (青色):A/D変換で読み取ったデータ。受信したPC側で「A/D変換値 X 0.002(V)」 の演算を行い電圧値として表示している。
09ch(橙色):ロジアナ的な使い方をした、通過ポイントのデータ。ソースコード上の HSSendP(0x09,hh);で送信されて来たデータを 0x9hh X 0.002(V) に変換して表示。

下図は上図の一部を拡大した所
PIC 16F1827 Analog-to-Digital Converter (ADC) Module使用例(備忘録)
09ch(橙色):
底辺部:HSSendP(0x09,0x00):で ADCON0bits.GO = 1; の発行箇所を通過した事を示す。
一段目:HSSendP(0x09,0x40):GO発行後の安定待ち期間の通過を示す。
二段目:HSSendP(0x09,0x80):A/Dがアナログデータを変換し終わった事をチェックしている箇所を通過した事を示す。
三段目:HSSendP(0x09,0xC0):A/Dが読み取ったデータをADRESL,ADRESHに格納した事を確認した箇所を示す。

PIC 16F1827,16F8313 A/D利用向け初期化例(備忘録)

注意:A/D Converter自身の設定は含みません。

PIC 16F1827



■main.c
/* 
 * File:   main.c
 */

#include "config16F1827.c"


#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

int main(int argc, char** argv) {
   
   //割り込み禁止
    INTCON = 0x00; //すべての割り込みを禁止

    //PORT初期化
    OPTION_REGbits.nWPUEN = 0;  //注意:プルアップは、個々のWPUxラッチ値によって有効になる
    TRISA = 0x00;   //全pin 出力pin
    WPUA = 0;       //pull-upなし
    PORTA = 0;

    ANSELBbits.ANSB3 = 1; //Analog input  ドキュメントの解釈に迷い TRISB = 0x08; 前後で実施
    TRISB = 0x08;   //RB3:入力ピン 他:出力pin
    ANSELBbits.ANSB3 = 1; //Analog input
    TRISB = 0;
    WPUB = 0;       //pull-upなし
    PORTB = 0;

    #include "OSCinitialize16F1827.c"

    for (int i = 0;10000>i;i++) {} //OSC発振周波数安定待ち

    //....

    return (EXIT_SUCCESS);
}



■main.h

#include "all.h"

#ifndef MAIN_H
#define MAIN_H

//発振器関係
#define ppFOSCHz 32000000

#endif



■config16F1827.c

// PIC16F1827 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF     // Clock Out Enable (CLKOUT function is enabled on the CLKOUT pin)
#pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF       // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.




■OSCinitialize16F1827.c
/*
 * 呼び出し側の使い方
 *      mainの #pragma 記述の下辺りで定義
 *      #pragma config PLLEN = OFF と設定すること
 *      内部CR発振の場合は : #pragma config FOSC = INTOSC
 *      #define ppFOSCHz 32000000  //周波数をHz単位で記述すること
 *
 * OSC関係
 * クロックを観測する場合は、 #pragma config CLKOUTEN = ON とすること。
 * #pragma config PLLEN = OFF // PLL Enable (4x PLL enabled) はOFFとすること。 ソフトでOSCCONbit7にて制御するため。
 */

#if ppFOSCHz == 32000000
OSCCON = 0xF0;
#elif ppFOSCHz == 16000000
OSCCON = 0x78;
#elif ppFOSCHz == 8000000
OSCCON = 0x70;
#elif ppFOSCHz == 4000000
OSCCON = 0x68;
#elif ppFOSCHz == 2000000
OSCCON = 0x60;
// 必要に応じて追加すること
#elif ppFOSCHz == 32000
OSCCON = 0x00;
#else  //既定値
OSCCON = 0x68; //4MHz
#endif




//    OSCCON = 0xF0;
//ビット 7 SPLLEN:ソフトウェア PLL イネーブルビット
//コンフィギュレーション ワード 1 の PLLEN = 1 の場合:
//  このビットは無視されます。4x PLL は常に有効です(発振器の要件に従います)。
//コンフィギュレーショ ン ワード1 のPLLEN = 0 の場合:
//      #pragma config PLLEN = OFF に設定している
//1 = 4x PLL が有効
//0 = 4x PLL は無効

//ビット 6-3 IRCF<3:0>: 内部発振周波数選択ビット
//000x = 31 kHz LF
//0010 = 31.25 kHz MF
//0011 = 31.25 kHz HF(1)
//0100 = 62.5 kHz MF
//0101 = 125 kHz MF
//0110 = 250 kHz MF
//0111 = 500 kHz MF(リセット時のデフォルト)
//1000 = 125 kHz HF(1)
//1001 = 250 kHz HF(1)
//1010 = 500 kHz HF(1)
//1011 = 1MHz HF
//1100 = 2MHz HF
//1101 = 4MHz HF
//1110 = 8MHz または Yes:32MHz HF(セクション 5.2.2.1 「HFINTOSC」参照)
//1111 = 16MHz HF

//ビット 2 未実装: 0'として読む
//ビット1-0 SCS<1:0>:システム・クロック・セレクト・ビット
//1x = 内部発振器ブロック
//01 = タイマー1発振器
//00 = コンフィギュレーション・ワード1のFOSC<2:0>で決定されるクロック
//注1:HFINTOSCに由来する重複周波数。


//CLKR を RA6 に出力するテスト
//  RCモードでは不可→ CLKRCONbits.CLKREN = 1; //CLKREN: 基準クロックモジュールイネーブルビット





PIC 16F18313




■main.c
/* 
 * File:   main.c
 */

#include "config16F18313.c"

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

int main(int argc, char** argv) {
   
    //割り込み禁止
    INTCON = 0x00; //すべての割り込みを禁止

    //PORT初期化
    TRISA = 0x00;   //全pin 出力pin
    WPUA = 0;       //pull-upなし
    PORTA = 0;

    RA1PPS = 0x14; //TX->RA1
   
    ANSELAbits.ANSA4 = 1; //Analog input ドキュメントの解釈に迷い TRISA = 0x10; 前後で実施
    TRISA = 0x10;   //RA4:入力ピン 他:出力pin
    ANSELAbits.ANSA4 = 1; //Analog input
    TRISA = 0;
    WPUA = 0;       //pull-upなし
    PORTA = 0;

    #include "OSCinitialize16F18313.c"

    for (int i = 0;10000>i;i++) {} //OSC発振周波数安定待ち

    //..

    return (EXIT_SUCCESS);
}



■main.h

#include "all.h"

#ifndef MAIN_H
#define MAIN_H

#endif



■config16F18313.c

// PIC16F18313 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FEXTOSC = OFF    // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled)

#pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz))

#pragma config CLKOUTEN = OFF   // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2)
#pragma config CSWEN = ON       // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config MCLRE = ON       // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled )
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config WDTE = OFF       // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored)
#pragma config LPBOREN = OFF    // Low-power BOR enable bit (ULPBOR disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored)
#pragma config BORV = LOW       // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
#pragma config PPS1WAY = ON     // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a Reset)
#pragma config DEBUG = OFF      // Debugger enable bit (Background debugger disabled)

// CONFIG3
#pragma config WRT = OFF        // User NVM self-write protection bits (Write protection off)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (Low voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.)

// CONFIG4
#pragma config CP = OFF         // User NVM Program Memory Code Protection bit (User NVM code protection disabled)
#pragma config CPD = OFF        // Data NVM Memory Code Protection bit (Data NVM code protection disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>




■OSCinitialize16F18313.c
// 内部 32MHzの場合、config で
// #pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz))
// と設定されている為、不要



PICデバッグ用の自前疑似オシロスコープ&ロジックアナライザ(備忘録)

ダイソーのニッケル水素充電池用の充電器を自動停止するようPICを使って改造しました。
充電中の電池の端子電圧を監視する為に232CでPCに電圧値を送り、LibreOfficeのCalcでオシロスコープの様にグラフにして観察出来ます。

PICデバッグ用の自前疑似オシロスコープ&ロジックアナライザ(備忘録)縦軸:電池の端子電圧(V) 横軸:時間経過

そこでふと思ったのが、コレを利用すればロジックアナライザで行っていたデバッグも代替え出来るのでは?
それが出来ればロジアナのコード郡も解消し、8ピンPICもピン数制限に悩む事もないし。


結果はこんな感じ


作った後の感想は、到底オシロやロジアナの代替にはなりませんが、それらが無い環境(例えば出先)では有効な手段となりそうです。
ただし、時間情報であるX軸は単に232Cの受信通番である点が要注意です。

PICデバッグ用の自前疑似オシロスコープ&ロジックアナライザ(備忘録)03ch:電池の電圧 05ch:タスクの切替り状態 07ch:電圧監視状態 09ch:A/D変換の状態

■拡大したところ
PICデバッグ用の自前疑似オシロスコープ&ロジックアナライザ(備忘録)03ch:電池の電圧 05ch:タスクの切替り状態 07ch:電圧監視状態 09ch:A/D変換の状態

電圧値以外にロジアナのデータを多量に送っているため、電圧のサンプリング周期が遅くなっています。
今回の用途では問題はありまりせん。

■03ch (青色)(充電中の電池の端子電圧)
ダイソー充電器はAC半坡整流平滑なしの方式の為、電池の電圧を超えた部分でのみ充電をします。
画像の03chは電池の起電力を超えて上昇し充電中の状態です。
ステップで立ち上がった所がA/D変換器で電圧を計測したタイミングで、そのデータを232Cを通じてPCに送信しています。
もちろん、前回と同一電圧であれば、見かけ上平坦です。

■05ch(橙色)(タスクの切替り状態)
※今回の特徴はロジアナと違って送ってくるデータはbyte値である為、各chに値を持たせる事が出来ます。

この波形の
一番底辺は、PICのタスクコントローラ自身が動作している期間です。

二番目のステップはタスク番号0のメイン制御タスクで、外部スイッチなどによる制御を司り、充電動作の停止など指示するタスクの動作期間を表しています。

三番目のステップはA/Dコンバータのデータを読み取るタスク(タスク番号1)の動作期間を表しています。
03ch(電池電圧)がこの期間に変化している所があります。ここが、このタスク期間中に電圧を読み取った所です。
この読み取られた電圧を各タスクが「電池端子電圧」として使用します。
※マルチタスクによる利点: このように、電池の電圧を読み取るタスクは、ただひたすら電池の電圧を読み取りJOBに供給しているだけです。

四番目のステップは読み取られた電圧に基づき、充電制御をするタスク(タスク番号2)です。
電池が充電器にセットされるのを待ち、セットされれば充電状態に移行する。
充電中は「充電完了」「電池の取り外し」などを電圧値を監視する事により、それぞれの状態へ遷移します。

五番目のステップ(タスク番号3)は今回は使っていませんが、低優先度のUSART送信(232C)用のタスクです。
ベストエフォート(渋滞が起こった場合は送信依頼されたデータは捨てられる)の無責任な送信用のタスクです。
※こちらはメインのJOBの処理速度に極力影響を与えず、ただし送信漏れが許される場合に使用します。

■07ch(緑色)(電圧監視状態)
前半にある背の高い方のパルスは電池の電圧が充電完了判定電圧を超えていない事を判定した時に現れます。
後半の背の低い方のパルスは充電判定電圧を超えた時に現れます。

この図では現れていませんが、充電完了の判定は「完了判定電圧以下」を一定期間途切れる事なく検出した時、
具体的には1万回連続検出した時に完了と判定します。または途中取り外しと判定します。
そして、電池の取り外し待ち状態に遷移します。

■09ch(水色)(A/Dコンバータの読み取り状態)
A/Dコンバータの動作は、
1.動作開始指示(GO)をする
2.回路の動作安定期間が過ぎるのを待つ
3.読み取り完了状態を待ち、変換データを読み込む
となります。

図中一番背の低いパルスは「2.回路の動作安定期間が過ぎるのを待つ」の状態で、
一旦、タスクを開放します。開放する事により安定期間の時間稼ぎをします。

図中二番目の高さのパルスは「A/Dの変換動作完了」を確認している所です。
そして、三番目の高さのパルスは「完了を確認した」為、変換データを読み取っている所です。
その三番目の立下がりの部分で次のデータ読み取り指示である GO を出しています。


値を送信


1byteに限りますが、各チャネルのデータとして1byte割り当てられているので、それを利用すると観察したいデータを送ることができます。
■試行
Timer0を時間計測用として用い、USARTで送信指示をするのに必要な時間観察する事を試みました。
A/D変換値(2byte)を232Cで送信指示するのに必要な時間について実物のロジアナと比較しました。
さらに引き続き2byteのダミーデータ(0x01,0x00)を232Cで送信指示すると送信バッファの空き待ちが発生する様子をどの様に捉える事ができるのかテストしてみました。

PICデバッグ用の自前疑似オシロスコープ&ロジックアナライザ(備忘録)ロジックアナライザの波形

テスト用のソースはこちら

■送信指示命令実行期間(上図の赤色)
一番目の幅の狭いパルス:A/Dから読みたったデータH,Lを送信指示する区間
ソースの EUSART_Write(H); EUSART_Write(L);
二番目の幅の広いパルス:ダミーデータを送信指示する区間

■TXREG書込(薄い赤色)
各パルスはTXREG(USART Transmit Data Register)への書き込みが実施された時点を示します。

■232Cの送信データ(緑色)
1. 232C送信データ:A/Dから読み取った2byteのデータを送信
2. ↑の送信指示(赤色、一番目パルス)に要した時間(Timer0の値)を送信
3. ダミーデータ 0x010x00 を送信
4. ↑の送信指示(赤色、二番目パルス)に要した時間(Timer0の値)を送信
5. 依頼されたデータを全て送信し、次の送信指示を待っている IDLE 期間

PICデバッグ用の自前疑似オシロスコープ&ロジックアナライザ(備忘録)
上図はテストの対象となる部分の時間です。

PICデバッグ用の自前疑似オシロスコープ&ロジックアナライザ(備忘録)


横、縦スクロールできます。
232C送られてきたデータを加工後、LibreOffice Calcでグラフ化と対象データを確認しています。


■最終結果
PICデバッグ用の自前疑似オシロスコープ&ロジックアナライザ(備忘録)

T列がロジアナが示す時間(uS)及び232Cを通じて送信されてきた(Timer0の値+0x600)x0.002(V)で電圧値として表現された値。
これを途中計算省略して、CPUサイクル数に換算したものがAA列です。その下二桁がTimer0の値に相当します。

下段の10.005uSの列がA/D変換結果の送信指示に要したCPUサイクル数。
上段の79.975uSの列がダミー送信の送信指示に要したCPUサイクル数。
いずれも232Cで送信して来たTimer0の値(下二桁)と一致しています。



感想


PICのUSARTを使って、限られた環境の中でデバッグの手掛かりになりそうな情報が取れる事がわかりました。

この記事を書くのに結構時間が掛かりましたが、結局役に立つのは自分自身で他者から見れば有用性なし!
しかし、後で自分自身がコレをみても理解できないないのではと疑っています。

この後、関連するソフトの記事も備忘録として残そうと思っています。


関連記事


PIC 16F1827,16F8313 A/D利用向け初期化例(備忘録)
PIC 16F1827 Analog-to-Digital Converter (ADC) Module使用例(備忘録)







Canon DR-2510C ドキュメントスキャナー の Windows11 24H2アップデート による不具合

Windows11のアップデート(24H2)後、Canon DR-2510C ドキュメントスキャナーに不具合が出ました。

1.スキャナー接続時に CaptureOnTouch が自動起動しない
2.CaptureOnTouch の「スタート(S)」ボタンが非アクティブ状態、またはスキャナーが見つからない
3.スキャナー側の3つのボタンも無反応
4.ドライバーやアプリを再インストールするも、CaptureOnTouch 動作時 スキャナーが見つからないエラーとなる
5.デバイスマネージャーのイメージデバイス欄には「CANON DR-2510C USB」と表示される(正常)
6.ドライバーやアプリを再インストールするも、少々状況は異なっても使用することはできない



対策


下記方法でなんとか元通りに運用可能となりましたが、今後安定して動作するかは不明です。
また再発した時の為に覚えている(曖昧)範囲でメモを残します。


■ドライバーのアンイストールとインストール
1.「プログラムと機能」により、「Canon DR-2510C Driver」をアンイストール
2.「プログラムと機能」により、「DR-2510C CaptureOnTouch」をアンイストール

3.ドライバー DR-2510C DriverVer1.3SP4 forWindows をインストール
4.アプリ DR-2510C CaptureOnTouchVer1.10 forWindows をインストール

5.windows再起動


■レジストリキーの重複
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f}
が2つ登録されていた。
これの一つ(中身なしの方)を削除した。


これは、
デバイス カテゴリ : イメージング デバイス
クラス : image
メモ : 静止画像キャプチャ デバイス、デジタル カメラ、スキャナーが含まれます。


■レジストリ Run の項目(CANON DR2510C SVC)が消えている
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

新規追加した
文字列値
値 : CANON DR2510C SVC
データ : rundll32.exe DR251SVC.dll,EntryPointUserMessage


■再起動
レジストリ修正後に再起動


■まだ出るエラー
1.「スタート(S)」ボタンが非アクティブ状態
2.「スタート(S)」ボタンがアクティブ状態でもエラー発生
3.登録してあるスキャナー側のボタンが効かない
4.スキャナーが見つからないなどのダイアログが表示される

等の状態が発生した時は、
ドライバーを再度インストールした。ただし、アンイストールしてからインストールしたかは「記憶にございません」。



この記事の信頼性


2日程格闘しまくりましたので、ここに記載した以外の事もしているかもしれませんし、手順の影響もあると思われます。
したがって信頼性は大変低いのですが、次回発生時の参考程度にメモしました。



感想


今回のWindows11のアップデートでは、このほかに起動時に実行指定していたレジストリの内容も削除されました・・・
Canonの製品もハードは故障もせず頑張っているのに、ソフトの面倒は早々に切り上げるなんて・・・
特にCanonについてはシャープ等の二の舞にならないか心配です。
オリエンタルは黒服姿を見る度希望はうすれるし、
日本政治はもう恐怖しかないし。

...などと言う連想に陥ってしまいました。


PICで簡易マルチタスク方式(非プリエンプティブ スケジューリング)(備忘録)

PIC 16F1827と16F18313で簡易なマルチタスク方式(非プリエンプティブ スケジューリング)のアプリを作ってみました。

ダイソーニッケル水素電池充電器を起電力監視方式で自動停止するように改造」をPIC化しました。

今回の簡易方式では各タスクの起動とデータエリアの分離のみが実現されていて、タスク毎のイベントの管理などはサポートされていません。
また、TCB(タスクコントロールブロック)は構造体ではなく、CallBack関数の配列とタスクデータレコードへのポインタ配列として個別に定義しています。

タスクの実行権の制御方式は、常に「CallBack関数の配列」に登録された関数の先頭から再開されます。
タスクが実行権を返却した次のステップから再開されるのではありません。



動作例(A/D変換器の読み取りとデータ送信の並行動作)


PICで簡易マルチタスク方式(非プリエンプティブ スケジューリング)(備忘録)
上図はPICのA0,A1,B1の出力端子にタスクの動作状況に合わせてパルス信号を出力したものです。

■A0 : 白のグラフ
4つのタスクの制御権の移行状態を表してします。
■A1 : 赤のグラフ
A/D変換器からの一回の読み取り動作状態を表しています。
塗り潰し期間が開始から読み取り完了まで期間を示しています。
■B1 : 水色のグラフ
塗り潰し期間が読み取ったA/DデータをPC等にUART(232C)で送信している期間を表しています。

※読み取りとデータ送信の関係
この例ではA/Dの読み取りが送信時間より短い為、A/D変換のタスクは毎回UARTに対して送信依頼をしていますが、
転送が間に合わない為、送信中の依頼データは捨てています。
この例ではA/D変換3回に一回送信され、2回分は捨てられています。

簡易方式ではありますがマルチタスク方式でのPICプログラミングは、「A/D読み取り」「充電制御」「通信」などの各処理の関係が希薄になり、プログラミングは大変楽になりました。



タスクコントローラー部



■main()
int main(int argc, char** argv) {

    //各種初期設定
    
    taskControlInitialize();    //タスクを順次実行するタスクコントローラを初期化する
    mainControl_Initialize();   //アプリケーションの初期化(各処理をTCBに登録するなど)

    TaskControl();              //タスクを順次実行するループ
    return (EXIT_SUCCESS);      //TaskControl()は永遠にループするため、実行される事はない
}


■タスクコントローラー
void nullTask() {
}

//Task Control Block 
void (*TaskCallBack[NumberOfTasks])(void);  //タスクの入口、CallBack関数の配列 ※必須
void  *TaskData[NumberOfTasks];             //各タスク作業エリア(レコード)へのポインタ配列 ※任意

int CurrentTaskNo;  //現在実行中のタスク番号(配列の要素番号)


//タスクを順次実行するループ
void TaskControl(void) {
    while (true) {
        for (CurrentTaskNo = 0;NumberOfTasks > CurrentTaskNo;CurrentTaskNo++) {
            (TaskCallBack[CurrentTaskNo])();
        }
    }
}

//Task Control Block の初期化
void Initialize_TCB() {
    for (int i = 0; NumberOfTasks > i; i++) {
        TaskCallBack[i] = nullTask; //初期タスクは何もしないでリターンするnullタスク
    }
}

//タスクコントロール全体の初期化
void taskControlInitialize(void) {
    Initialize_TCB();
}


■電池充電用のJobの登録
//SW操作などユーザーインターフェースによるJob制御。
void mainControl(void) {
    //  単純処理の場合は制御なし。
}

//充電jobの初期化をする。
//  1.A/Dの初期化
//  2.TCBに各タスクを登録する
void BatteryInstallationCheckModeSet(void){
    BatteryVoltageReadInitialize();     //PICに内蔵されているA/Dを初期化

    //充電の強制停止などのユーザーインターフェース制御をするタスクを登録(今回ななにもしない)
    TaskCallBack[tcMain] = mainControl; //アプリケーション(job)の制御 例:停止など
   
    //電池の端子電圧をひたすら読み続け、アプリケーションに提供するタスクを登録する
    TaskCallBack[tcBatteryVoltageRead] = BatteryVoltageReadStart; //A/D読み取り開始
    TaskData[tcBatteryVoltageRead] = &bvrTaskData;  //同一のタスク番号で複数の作業を可能とする為
                                                    //各作業専用の作業エリアを作成し登録する。
                                                    //例:同一コードで複数のA/Dを扱う場合
                                                    //例:読み取ったデータとUARTで送信を交互に行う
    
    //電池の装着、充電満了、取り外しなど電池の端子電圧の変化に応じて必要な処理を行うタスクを登録する
    TaskCallBack[tcBatteryVoltageCheck] = BatteryInstallationCheck; //読み取られたA/Dからの電圧情報に基づき
                                                                    //電池の充電状況に応じた遷移を行う。
                                                                    //遷移は同じタスク番号に異なるCallBack関数を
                                                                    //登録する事により行われる。
}

//電池充電用のJobの登録
void mainControl_Initialize(void) {
    Initialize_TCB();                   //TCBを初期化
    BatteryInstallationCheckModeSet();  //電池充電用のJobの最初のモード(電池装着待ち)を登録する
}


マルチタスクに関する記述はここまでです。
この後の記述は上記マルチタスクの機能を使って実現した電池の充電アプリの一部です。


電池充電アプリ部



■A/D読み取り
#define sendHexData_Bytes_MaxSize 4
__pack struct usendRecord_t {
    char preamble;
    char sendHexData_Bytes[sendHexData_Bytes_MaxSize];
//    char postamble;  必要に応じて追加開発
};

union URecord_t {
    struct usendRecord_t usendRecord;
    uint8_t Bytes[USendRecordSize];
};

__pack struct usendTaskData_t {
    void (* returnTaskCallBack)(void);
    void *retrurnTaskData;
    uint8_t sendHexData_Bytes_ln;
    union URecord_t URecord;
    int i; //ループ用
};

struct bvrTaskData_t {
    union CD_t CD;
    uint8_t bvrSTS;
    __pack struct usendTaskData_t utd;
};

struct bvrTaskData_t bvrTaskData;

//A/D読み取り開始
void BatteryVoltageReadStart(void) {
    BVRSTS = 0;
    TaskCallBack[CurrentTaskNo] = BatteryVoltageRead;   //A/D読み取りへ遷移
                                                        //  CallBack関数の入れ替えによる遷移
}

//A/D読み取り (A/D読み取りの状態遷移は BVRSTSのステータス番号を変えることによっておこなっている)
void BatteryVoltageRead(void) {
    switch (BVRSTS) {   //A/D読み取り状態
        case 0: //AD変換開始指示
            ADCON0bits.GO = 1;
            BVRSTS++;           
            break;
        case 1: //起動時間稼ぎ
            BVRSTS++;
            break;
        case 2: //変換完了待ちと読み取り
            if ((ADCON0bits.GO_nDONE == 0) && (ADIF == 1)) {    //読取り完了
                ConversionDataLSB = ADRESL;                     //データを取り込む
                ConversionDataMSB = ADRESH;                     //データを取り込む
                ReadingVoltage = Conversion16;                  //他タスクに読み取りデータ(電圧)を提供
                BVRSTS = 0;                                     //次のAD変換の開始を指示する
                
//                SendReadingData(); //uartで読取りデータを送信する(データ送信後、A/D変換が再開される)
                IndependentDataSend('R',&ConversionDataLSB,2);  //保守用にUARTで読み取り電圧データを送信
                                                                //  通信専用タスクで送信する
                                                                //  ベストエフォート(渋滞が起こった場合は捨てられる)
            }
            break;
    }
}

//PIC内蔵A/Dを初期化
void BatteryVoltageReadInitialize(void) {
    PortConfiguration();
    ChannelSelection();
    ADCVoltageReferenceSelection();
    ADCConversionClockSource();
    InterruptControl();
    ResultFormat();
    WaitAcquisitionTime();
}

//内部関数

static void PortConfiguration(void) {
    ANSELBbits.ANSB3 = 1; //Analog input
    TRISBbits.TRISB3 = 1; //input (AN9)
}

static void ChannelSelection(void) {
    ADCON0 = 0x25; //AN9;not in progress;ADC is enabled; GO:0;   
}

static void ADCVoltageReferenceSelection(void) {
    //FVRCON:
    // bit7:   1; Fixed Voltage Reference Enable bit; Fixed Voltage Reference is enabled
    // bit6:   1; Fixed Voltage Reference Ready Flag bit(1); Fixed Voltage Reference output is ready for use
    // bit5-4: 00; Reserved: Read as ‘0’. Maintain these bits clear
    // bit3-2: 00: Comparator and DAC Fixed Voltage Reference Peripheral output is off.
    // bit1-0: 10: ADC Fixed Voltage Reference Peripheral output is 2x (2.048V)(2)
    FVRCON = 0xC2;
}

static void ADCConversionClockSource(void) {
    ADCON1bits.ADCS = 7;    //A/D Conversion Clock Select bits; 111 = FRC (clock supplied from a dedicated RC oscillator)
    ADCON1bits.ADNREF = 0;  //0 = VREF- is connected to AVSS
    ADCON1bits.ADPREF = 3;  //11 = VREF+ is connected to internal fixed voltage reference
    
}

static void InterruptControl(void) {
}

static void ResultFormat(void) {
    ADCON1bits.ADFM = 1; //A/D Result Format Select bit;1 = Right justified. Six Most Significant bits of ADRESH are set to ‘0’ when the conversion result is loaded.
}

static void WaitAcquisitionTime(void) {
//    for (int i = 0; 100 > i; i++) {
    for (int i = 0; 2 > i; i++) {  //テストの為、短くしてある
    }
}

//現在タスクのA/D読み取り処理にすり替わってPCにデータを送信する
static void SendReadingData() {
    bvrUTD.sendHexData_Bytes_ln = 4;    //転送データサイズを指定
    HEXConvert(&(ConversionDataLSB), 2, //HEX文字列に変換
            &(bvrUTD.URecord.usendRecord.sendHexData_Bytes[0]));

    bvrUTD.returnTaskCallBack = TaskCallBack[CurrentTaskNo];    //現在の読み取り用のCallBack関数を保存
    bvrUTD.retrurnTaskData = TaskData[CurrentTaskNo];           //現在のTask用データを保存
    
    TaskData[CurrentTaskNo] = (void*)&bvrUTD;                   //通信用のTaskのデータエリアを登録
    TaskCallBack[CurrentTaskNo] = uartSend;                     //通信用のTaskのCallBack関数を登録
}


■電池装着チェック
//電池装着チェック
//  状態の遷移はCallBack関数を切り替える事により行っている
void BatteryInstallationCheck(void) {
    if (ChargSW == 1) { //電池へ充電電源が接続されている時
        ChargOff;           //接続を切る
        ADInputDischarge(); //ノイズキャンセル用コンデンサを放電
    } else if (ReadingVoltage > (BatteryInstallationVoltage)) { //電池装着判定
        ChargeCompleteDetectionCount = 0;   //充電完了判定用のカウンタをクリア
        ChargOn;                            //電池に充電電源を接続
        TaskCallBack[tcBatteryVoltageCheck] = BatteryVoltageCheck;  //タスクを充電中の電圧監視へ切り替える
    }
}


■充電中
// 充電中電圧監視
void BatteryVoltageCheck(void) {
    
    //電池端子電圧の最低電圧、すなわち電池の起電力電圧を検出する
    if (ReadingVoltage >= ChargeCompleteVoltage) {  //充電完了起電力以上
        ChargeCompleteDetectionCount++;             //継続期間をカウント
    } else {                                        //以下の電圧が検出
        ChargeCompleteDetectionCount = 0;           //未達の為継続をクリア
    }
    
    //充電完了(または途中取り外し)
    if (ChargeCompleteDetectionCount > 10000) { //半坡充電の無充電部も含め一定期間以上完了電圧を超えた
        ChargOff;                                                   //充電を停止
        TaskCallBack[tcBatteryVoltageCheck] = BatteryRemovalCheck;  //電池取り外し監視タスクに切り替える
    }
}


■電池取り外し待ち
//電池取り外し待ち
void BatteryRemovalCheck(void) {
    if (ReadingVoltage < BatteryRemovalVoltage) {   //電池取り外し判定電圧以下か
        ADInputDischarge();                             //ノイズキャンセル用コンデンサを放電
        TaskCallBack[tcBatteryVoltageCheck] = BatteryInstallationCheck; //電池装着チェック用タスクに切替
    }
}


■定数等
// 利用形態 パラメータ
#define ADvoltageConversionFactor 0.002 //A/D変換 電圧変換係数
#define ChargeCompleteVoltage 725       //(1.45V / ADvoltageConversionFactor)    //充電完了起電力(V)
#define BatteryInstallationVoltage 400  //(0.8V / ADvoltageConversionFactor)     //電池装着を検出する電圧(V)
#define BatteryRemovalVoltage 250       //(0.5V / ADvoltageConversionFactor)     //電池取り外し電圧


//task
//TaskCallBack[]の配列割当番号
#define tcMain 0                    //アプリケーション(job)の制御 例:停止など
#define tcBatteryVoltageRead 1      //A/D読み取り
#define tcBatteryVoltageCheck 2     //読み取ったA/Dデータ(電圧)による制御
                                    //  複数のCallBack関数が入れ替わる
                                    //      電池装着待ち
                                    //      充電中:充電完了監視、途中取り外し監視
#define tcuartIndependentSender 3   //PC等外部機器への情報提供手段 UARTによるデータ送信。 なくてもよい。
#define NumberOfTasks 4             //TaskCallBack[]の配列数 すなわち最大タスク数

//ADコンバータのデータ
union CD_t {
    int16_t Conversion16;
    __pack uint8_t ConversionData[2];   //変換結果データ 8bit x 2
};


補足



下図は「IndependentDataSend('R',&ConversionDataLSB,2); //保守用にUARTで読み取り電圧データを送信」で取得した充電中の電池の端子電圧のグラフです。
波形の山部は充電電流が流れている箇所で、
底辺部は充電電流が流れていません。この部分に電池の起電力が現れます。
充電はAC電源から半坡整流(平滑なし)で行っている為、このような波形になっています。
PICで簡易マルチタスク方式(非プリエンプティブ スケジューリング)(備忘録)充電中の電池端子電圧の波形(LibreOffice Calcで作成)



回路図はこちら
PICで簡易マルチタスク方式(非プリエンプティブ スケジューリング)(備忘録)



動作確認時の信号
PICで簡易マルチタスク方式(非プリエンプティブ スケジューリング)(備忘録)
PICで簡易マルチタスク方式(非プリエンプティブ スケジューリング)(備忘録)

横スクロール出来ます。 window一杯に表示する場合はこちら→ (細部確認用)


はんだごてにてウレタン線被覆剥がし

作業中のはんだごてでウレタン被覆線の被覆を剥がす方法です。

はんだごてにてウレタン線被覆剥がし

上図のようにコテ先に1.5mmのドリルで穴を開けます。
写真は使用後なのでハンダで穴は埋まっていますが3mm程開けました。


■使い方
コテ先に開けた穴にハンダを入れます。(毎回)
ウレタン被覆線にフラックを塗り、穴にいれます。
10秒ほど穴に入れたままにしてから引き抜いて終わりです。


はんだごてにてウレタン線被覆剥がし

0.23mmΦのウレタン被覆線での結果は上図の様になります。
ポイントは10秒程、穴に入れたままにする事です。



感想


ウレタン被覆線は被覆を剥がすことなく半田付けの温度で被覆が剥がれると広告にありましたが、
私の場合ほとんどが失敗でした。

半田槽も試しましたが、半田が大量に必要な事や表面が酸化して使いにくく手間暇がかかり無駄ハンダが多い。
私のように小作業しかしない者には向いていませんでした。


オンボードで剥がす場合は穴の位置をもっと先に方にしないと実用的ではなかったです。


■中間位置での被覆剥がしはできません
私が作業している半田コテ先の温度では被覆に傷のないウレタン被覆線は全く剥がれません。
その場合、カッターナイフで被覆に傷を数か所いれるとなんとかハンダ付けは可能でしたが、
被覆の焼け残りが外へ逃げずにハンダ内に残留したり、部分的にしか剥がれなかったりしました。
また、長時間熱する必要があり、基板や部品に悪影響がありました。



Canon PIXUS TS7530 非純正インクでの補充の試み

Canon PIXUS TS7530の純正インクは BCI-301/300 ですが、TS8030用の互換インク ELECOM THC371,370 を補充インクとして使ってみました。

今回のお試しポイントは


(1)補充方法の改善
TS8030でELECOMの詰め替えインクを補充する方式は、
カートリッジの上部に専用ツールで穴をあけ、そこからノズル付きのボトルでインクを注入する方式でした。
1.満タン状態の判定が難しい
過去のCanonのインクカートリッジは透明で満タン状態が簡単に把握できましたが、Canonの対策により不透明(黒)になり目視は困難。
2.満タン判定方法
インク注入時にノズルを挿入している穴からインクが溢れ出るまでいれる方式で判定
3.インクによる汚れ
注入中のインクカートリッジは動作中と同じくインク排出口が下となる為、幾ばくかインクが漏れる。
これにより、カートリッジ再装着時にプリンター内部を汚す場合がある。
また、満タン判定時の「溢れ」の汚れがある。
4.補充前の残量がわからない
これは、インクカートリッジの補充用の穴から爪楊枝を挿入し、インクの付き具合で判定していた。

(2)色合いの不具合がでるか
機種が変わるたびにインクの品種が変わり、引退機種の補充用インクが無駄になっていました。
1.インクの成分
インクジェットプリンタの草創期ならインクの成分も進化していたかもしれないが、
すでに安定期に入った今、インクの成分は同じではないかという疑いがある。
2.色合い
微妙に各インクの色合いが変わっていた場合、印刷結果として気づく程狂うのか。
純正インクでも、モニターと印刷結果は明らかに一致しない。
最近のユーザー傾向として色合いの再現性能ではなく、見た目の綺麗さに重点が変わっている。

(3)故障につながるか
1.目詰まり
2.掠れ



試してみた方式と結果


(1)補充方法の改善
1.満タン状態の判定の容易化
各色のインクの満タン状態を重さで判定する方式とした。
2.満タン判定方法
購入した時に各カートリッジの重さを計測して於けばよかったと悔やまれる。
計っていないので下記の方法で実施
2-1.プリンタがニアエンドを通知してきた時に、カートリッジ全体の重さを記録する
2-2.ELECOMの補充インクの一回分基準である容器の腹部分を押し、上部のプールに一定量貯める方式で一回分を決めた
2-3.インクカートリッジを秤の皿に排出口を上向きにして置き、インクの排出口のスポンジにインクを垂らして染み込ませる
2-4.染み込み状態を監視しながら、上記一回分をゆっくり注入する ・・・・今回は溢れず一回分が吸い込まれるように入った
3.インクによる汚れ
注入完了後、インクカートリッジの排出口を下側にしても、ポタリは発生しなかった。
4.補充前の残量がわからない
残量警告と無関係に重量で判定可能


(2)色合いの不具合がでるか
今回は純正インクがまだ残っている状態での補充の為、100%補充インクの色合いという訳にはいかないが、
ダンサーさん(ディズニー・ハロウィーンストリート“ウェルカム・トゥ・スプーキーヴィル”)
この画像を印刷した所、満足な結果であった。と言うより今まで使ってきた機種で一番の出来であった。
これも、純正インクの時に印刷して比較すれば良かったと後悔。

(3)故障につながるか
今後、一年程度は様子見となると思われる。



データ


(1)Canonのインクカートリッジに関するデータ
【インクジェットプリンター】インクカートリッジの容量について
インクカートリッジ 容量(ml)
BCI-330PGBK 約18.5ml
BCI-331 BK/C/M/Y/GY 約8.2ml
BCI-300PGBK 約15.4ml ← 今回はこれ
BCI-301 BK/C/M/Y 約6.6ml ← 今回はこれ


(2)今回の各インクの補充前後のカートリッジ全体の重さ
M NE15.19g → 20.20g
C NE15.16g → 20.16g

※NE : ニアエンド


(3)補充前のインク状態
Canon PIXUS TS7530 非純正インクでの補充の試み



感想



吸い込まれるようにインクが入っていく。
非常に入れやすい。
手も汚れない。
補充後、逆さまに向けてもインクはこぼれない。
正規品の新品での重量を計測しなかった事が悔やまれる。

仕様の6.6ml(g)とニアエンド(NE)状態での補充である事を考慮すると5gの補充は妥当とおもわれる。


その後、ノズルチェックパターンの印刷とL版で前出のダンサーさんの写真を印刷すると Y もニアエンドとなった。
このインクの消費量の多さに驚いた。
年賀状など印刷する時には、全数満タン状態にして、頻繁にインクカートリッジの重量測定をして消費量を確認しなくてはならないと思われる。その時までには、インク残量検出機能をOFFにしているので。


牛若丸新ロゴ案

牛若丸新ロゴ案


長らくチシャ猫を愛用していましたが、新ロゴ用に牛若丸のUSを格調高くアール・ヌーヴォー風にしたものを作ってみました。


生成塗りつぶし(photoshop)

生成塗りつぶし(photoshop)


前回の「フィネガンズ・バー&グリル(USJ)」でphotoshopの「生成塗りつぶし」機能を二箇所試してみました。

もはや写真は証拠になりません。

お知らせ
■注意:Google Chrome以外のブラウザでは動作しない事もあります。
お好みに応じて
画像だけの表示でいいよ
やっぱり全部表示して
背景は黒がいいな
背景を元に戻して
サブジャンル
メモリアルマップ
My Favorite Photo
検索フォーム
プロフィール

otsu.usiwakamaru

Author:otsu.usiwakamaru
五条の橋でひらりひらりと欄干を飛び渡る牛若丸のように、興の向くまま電子回路にプログラミングに写真にと飛び回っています。

プロフィール詳細

カレンダー
11 | 2024/12 | 01
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
キーワード
クリックしたキーワードの記事のみ表示します。

ダンサー ミニー ミッキー デイジー ドナルド グーフィー キャラクター  3D 試み MFP 電池 ティンカーベル デザイン 全天球 クラリス プルート パークテーマ チップデール キャスト IXY スモールプラネット スクルージ マレフィセント ダッフィー SPOT 改造 

最新記事
月別アーカイブ
全記事表示リンク

全ての記事を表示する

おすすめプログ(新着記事)
リンク


にほんブログ村
カテゴリ
橋 (1)
カウンタ
訪問者数(UU)

アクセス数

現在の閲覧者数

tael no013用