2020年4月5日日曜日

ピックマイコンPIC16F1829の反応速度を調べてみた


背景

PICマイコンとはMicrochip社が販売している、組み込み製品に使われる事が多い集積回路です。

前回Arduinoに使われるatmega328pの反応速度を調べたので、今回は手元にあるPIC16F1829の反応速度を調べてみました。
備忘録を兼ねて、分かったことを共有します。

使ったもの

  • PIC16F1829
    今回動作を検証するマイコンです。
  • PICKit4
    PICマイコンの書き込み装置です。
    PICKit3でも良いです。
  • ブレッドボード
    PICマイコンの信号線を引き出します。
  • ジャンパワイヤ
    PICマイコンの信号線を周辺機器に接続します。
  • LED + 抵抗
    周波数が期待通りに設定できていることを目視するために配置しました。
    無くても良いです。
  • Analog Discovery2
    USB接続で利用するオシロスコープです。
  • PC
    PICKitを利用したPICマイコンへの書き込みと、Analog Discovery2の操作を行います。
    設定方法はこれらの記事が参考になると思います。
    Ubuntuに開発環境を作り、PIC16F1829でLチカする方法
    Analog Discovery2を利用して電子部品に流れる電流量を計測してみた

回路構成

このような回路で動作を確認しました。


接続するとこうなりました。


PICKitからの給電準備

プロジェクトを作り、Vddから5Vを給電する設定にします。
(今回はtest_interruptというプロジェクトを作りました。)

5Vを給電するために、MPLABXのProjectsタブのプロジェクトを右クリックしてPreferencesを選択します。


プロジェクトの設定画面が出てくるので、PICKitを選択 -> Option categoriesでPowerを選択 -> Power traget circuitをチェック -> OKを選択 すると、5VがPIKCitから供給される準備ができます。
プログラムを書き込む際に5Vの供給が始まります。



Analog Disvoeryからのパルス波準備

WaveGenでW1からパルス波を出す設定にします。


プログラム

下記の動作を行うプログラムを作成しました。
  • 内部振動子を利用して16MHzで動作する。
  • main loopではLED(B7)の点灯・消灯を1秒ごとに行う。
  • B5がhighになったら割り込み処理を行う。
  • 割り込み処理ではB6からパルスを出す。B4がhighなら3回、lowなら2回。

割り込み処理の実装はPICマイコンの割り込み処理について解説していたブログマイコンのデータシートを参考にしました。
Bポートを入力として動作させるには入出力設定(TRISBB)の他にポートのアナログ設定(ANSELB)を無効にする必要があります。(これに時間を取られました。)

#define _XTAL_FREQ 16000000
#include <xc.h>
#pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=OFF, MCLRE=OFF, CP=OFF, CPD=OFF, BOREN=ON, CLKOUTEN=OFF, IESO=OFF, FCMEN=OFF
#pragma config WRT=OFF, PLLEN=OFF, STVREN=OFF, LVP=OFF

void __interrupt() isr(void) {
    LATB6 = 1;
    LATB6 = 0;
    if (RB4) {
        LATB6 = 1;
        LATB6 = 0;
    }
    LATB6 = 1;
    LATB6 = 0;

    IOCBF5 = 0; // Clear flag
}

void main(void) {
    OSCCONbits.IRCF = 0b1111; // Internal oscillator 16MHz mode
    OSCCONbits.SCS = 0b11; // Use internal oscillator as system clock
    TRISB = 0b00110000; // Configre B7 and B6 as output, B5 and B4 as input
    ANSELB = 0x00; // Disable analog input mode for port B

    GIE = 1;
    IOCIE = 1;
    IOCBP5 = 1; // Interrupt at rising B5

    while(1) {
        LATB7 = 1;
        __delay_ms(1000);
        LATB7 = 0;
        __delay_ms(1000);
    }
}


確認できた波形を分析

PICマイコンが出力するパルス波を1番ピン(黄色)で、Analog Discoveryが出力するパルス波を2番ピン(青色)で確認しました。


データシートのFIGURE 8-2:INTERRUPT LATENCYに割り込み時の遅延に関する記述があるので、その情報も踏まえて分析します。
 その表には、下記の内容が示されています。
  • 振動子の周波数4つで1クロックを作成している
    内部の発振子は16MHzで動かしていますが、マイコンは1/4の4MHz(1クロック0.25us)で動くようです。
  • 割り込み時の遅延は3-5クロックかかる
    1クロック0.25usとすると、0.75〜1.25usの遅延が発生するようです。

上記の情報を踏まえて確認できた波形を分析すると、これらのことが言えます。
  • ピンの電位切替は約0.25us(1クロック)でできる
  • 割り込み設定をしたピンの電位が変わってから割り込み処理開始までに約1.5us(6クロック)かかる
    データシートに記載されている遅延クロック数(3-5)に関数呼び出し処理1クロックが追加され、6クロック後に割り込み処理の1行目が開始されるようです。
  • if文の呼び出しとピンの電位の参照に約1.5us(6クロック)かかる

まとめ

16MHzでPIC16F1829を動作させると約1.5us後に割り込み関数の1行目が実行され、ピンの電位の切替は0.5usで行えることが分かりました。

atmega328pの反応速度と比較すると、振動子の振動を1/4したクロック周期で動いているため、atmega328p(ポートレジスタ操作時0.14us)に比べるとピンの電位切替時間は倍の時間かかりました。
しかし、その分割り込み監視を重視しているのか、割り込みの反応時間速度はatmega328p(3us)の半分でした。

atmega328pとPIC16F1829を比較すると、それぞれこのような特徴を持つと分かりました。
atmega328p: 普段から速いけど、割り込みの起動が遅い
PIC16F1829: 普段から遅いけど、割り込みの起動が速い

0 件のコメント :