CCS News

Tech Note: pin_select()を使用してPIC® MCUのRPピンを設定

Thursday 15 June, 2017

最新の多くのマイクロチップPIC®マイクロコントローラは再プログラム可能なペリフェラルピン(RP)を持っています。
これらのピンを使用すると、外部割り込み、入力キャプチャ、PWM、シリアル、タイマー等の周辺機能をこれらのピンに動的に割り当てることができます。 これにより設計時にこれらのピンの機能が実行時に変更される可能性があるため設計者は柔軟に製品を設計することができます。 デバイスのデータシートにはピン割り当てがリストされ、これらのピンはRPxx又は、RPIxxのいずれかで示されます(xxはRPピン番号です)。 RPxxxxピンは入力(タイマ入力、シリアル入力、割り込み入力等)としてのみプログラムすることができますが、RPxxピンは入力又は、出力(PWM出力、シリアル出力等) としてプログラムすることができます。この機能を持つPICSUP>® MCUはpin_selectプリプロセッサと関数を使用してCCS Cコンパイラで設定できます。

I/Oピンをペリフェラルに割り当てる最初の方法は#pin_selectディレクティブです。#pin_selectディレクティブはI/Oピンを周辺機器に割り当てるプリプロセッサ・ディレクティブで main()が起動する前に実行されます。
このコマンドの構文は次のとおりです:

#pin_select function=pin

#pin_selectディレクティブで使用できる関数とピンのリストはデバイスのヘッダー・ファイルを開いて#pin_selectを検索するのが それらを見つける最も簡単な方法です。UART1 RXピンとTXピンにピンを割り当てる方法の例を以下に示します:

#pin_select U1TX=PIN_C6
#pin_select U1RX=PIN_C7

#use rs232()などの周辺ライブラリでRPピンを使用する場合、#pin_selectは#useディレクティブの前に来なければなりません。 例えば:

#pin_select U1TX=PIN_C6
#pin_select U1RX=PIN_C7
#use rs232(UART1, baud=9600, stream=U1)

#pin_selectに加えてCCS Cコンパイラにはピンをペリフェラルに割り当てるためのpin_select()関数も用意されています。 pin_select()関数を使用して実行時にピンを周辺装置との間で割り当て、再割り当て、及び、割り当て解除することが できます。 これは複数のペリフェラルに同じピンを使用したり、周辺ピンとI/Oピン両方としてピンを使用したりする柔軟性が可能として評価さます。 pin_select()関数は次の構文を使用します:
pin_select("function", pin);
関数とピンは#pin_selectディレクティブで使用されるものと同じですが、唯一の違いは関数が定数文字列として渡されることです。 UART1ペリフェラルにピンを割り当てる方法の例を次に示します:

pin_select("U1TX", PIN_C6);
pin_select("U1RX", PIN_C7);

周辺機器からピンの割り付け解除するには入力周辺機器か出力周辺機器かによって決まります。 出力ペリフェラルからピンを割り当て解除するには、次のようにします。:

pin_select("NULL", PIN_C6); //出力周辺機器からPIN_C6を割り当て解除

入力ペリフェラルからピンを割り当て解除するには次のようにします:

pin_select("U1RX", FALSE); //U1RX入力ペリフェラルからピンを割り当て解除

出力ペリフェラルがRPピンにどのように割り当てられるかによりpin_select()ディレクティブを使用する場合、 複数のピンを同じ出力ペリフェラルに割り当てることができます。例えば、次のようにすると複数のピンがCCP1ペリフェラルに 割り当てられます:

pin_select("CCP1OUT", PIN_B0);
pin_select("CCP1OUT", PIN_B1);

複数のピンを同じ出力に結ぶこの方法はpin_select()関数でのみ実行できますが#pin_selectを使用してこれを行うことはできません。


Tech Note: CCS Cコンパイラで浮動小数点の代わりに固定小数点を使用してコードを最適化する

Thursday 15 June, 2017

Microchip PIC® MCUファミリを含むほとんどの組込みマイクロプロセッサ、及び、マイクロコントローラには、ハードウェアで実装された浮動小数点カリキュレータは含まれていません。 これは全ての浮動小数点演算は非常にリソースを消費する整数演算を使用してソフトウェアで実装する必要があることを意味します。 代わりにパフォーマンスの重いアプリケーションやリソースが制限されたプラットフォームでは実装で浮動小数点数を利用できないことがあります。 これに対する解決はCCS Cコンパイラの固定型機能によって簡素化された固定小数点演算を代わりに使用することです。

固定小数点演算は整数形式で10進数を表すためにスケーリング係数を使用する実装です。 CCS Cコンパイラは16又は、32ビットの整数と10-nのスケーリング係数を使用してこれを実装します。 固定型は次のように宣言できます:

int16 _fixed(n) foo;ここで、0 < n < 6
int32 _fixed(n) foo;ここで、0 < n < 11

値nは変数に含める精度の小数点以下の桁数、同様に表現可能な最大値を決定します。 nは型の一部であり生成される命令を決定するので、コンパイル時には定数として与えられなければいけません。

int16 _fixed(2)の場合: Max = 65,535 * 10-2 = 655.35
int32 _fixed(5)の場合: Max = 4,294,967,295 10-5 = 42,949.67295

任意の数に対する2進/16進表示はスケーリング係数の逆数を掛けて変換することによって決定することが出来ます。

237.16 * 10-2 = 23716 = 0x5CA4

固定型は4つの基本算術演算の同じnの別の固定型と互換性があります。それらは異なるnを持つ固定型と互換性がありません。

int16 _fixed(1) f1 = 5.5;
int16 _fixed(1) f2 = 2.5;
f1 + f2; // 8.0として評価さます
f1 - f2; // 3.0として評価さます
f1 * f2; //13.7として評価さます
f1 / f2; // 2.2として評価さます

また、リテラルやキャスト整数で算術演算を行うこともできます。

int16 _fixed(2) f1 = 22.14;
int16 i1 = 7;
f1 + 19.52; // 41.66として評価さます
f1 - (int16 _fixed(2)) i1; // 15.14として評価さます

インクリメントとデクリメントの動作はバイナリで同じように機能します。これはスケーリング単位の1倍の加算又は、 減算に相当します。

int16 _fixed(3) f1= 5.234;
f1++; //f1 = 5.235

固定型を整数にキャストすると小数点以下が切り捨てられます。 これは、オリジナルの整数型のキャストを減算することによって小数点以下の桁を分離するためにも使用できます。

int16 _fixed(2) f1 = 6.94;
int16 noDec = (int16) f1; //noDec = 6
int16 _fixed(2) decOnly = f1 - noDec; //decOnly = 0.94

また、CCS Cコンパイラは"%w"フォーマット・フラグを使用する固定小数点型のprintf、sprintfなどの使用もサポートしています。 精度に等しい10進数の後ろに先行ゼロと桁のない値が出力されます。

Code:
int16 _fixed(2) f1 = 1.5;
int16 _fixed(2) f2 = 22.78;
int16 _fixed(3) f3 = 5.21
printf("%w - %w - %w", f1, f2, f3);
出力:
1.50 - 22.78 - 5.210

等しいと評価される式が非常に小さい小数点でオフになる小数点を表現する場合、浮動小数点数は避けられないエラーを伴います。 これはbase10の一部の10進数、0.1など、をbase2で完全に表すことができず丸め誤差の原因となるために起こります。 これは1/3がbase10でどのように表現できないかに似ておりそして必要な精度0.33 ...に丸められます。 CCS Cコンパイラの固定小数点の実装ではDECIMALスカラーが使用されるため、base10では100%の精度があります。 これによりこの精度が必要とされるお金やその他の値を処理するのに最適です。

固定小数点演算は浮動小数点よりも大幅にパフォーマンスが向上します。 これを定量化するために、 PIC18F45K22とCCS Cコンパイラを使用してベンチマークを実施しました。 オンチップタイマーの1つが算術演算に要した時間に近似するために使用されました。 浮動小数点と16ビット固定小数点の両方の2箇所の精度では、各演算のタイミングが取られ値のばらつきが平均50倍になりました。 それぞれの平均時間を比較してパフォーマンスを一般化することができます。

ベンチマークの結果は次のとおりです:
  • 加算 (+): フロートより ~19.6倍高速
  • 減算 (-): フロートより ~19.4倍高速
  • 乗算 (*): 固定より ~2.7倍高速
  • 除算 (/): フロートより ~3.3倍高速

浮動小数点演算のパフォーマンスが向上するのは唯一乗算の操作です。 これは浮動小数点数は乗法形式(仮数x base 指数)で格納されるため論理的です。 しかし、固定小数点は他の3つでは特に加算と減算の方が優れています。

また、固定小数点と浮動小数点の実装にはプログラム・メモリの使用方法の違いがあります。 算術演算を実装するための実際の命令数は両者で大きく異なります。 次のプログラムはPIC18F45K22で両方のオプションを使用してコンパイルされました。

#ifdef USE_FIXED
int16 _fixed(2) a, b, c;
#else
float a, b, c;
#endif

void main() {
a = 2.25;
b = 0.85;
c = a + b;
printf("Add: %w", c);
c = a - b;
printf("Subtract: %w", c);
c = a * b;
printf("Multiply: %w", c);
c = a / b;
printf("Divide: %w", c);
}

コンパイルされたプログラムのメモリ統計は以下の通りです。
固定オプション:
  • 364 instructions
  • 0.84KB ROM usage
  • 2.6% ROM usage

Float Option:
  • 787 instructions
  • 2.03KB ROM usage
  • 6.3% ROM usage

固定実装から浮動小数点への切り替えは命令数を400以上増加させました。 これはプログラムの複雑さに応じてPIC18F45K22では重要である場合と重要でない場合があります。 但し、32KBのROMでは、それはプログラム・メモリの上位にあります。 PIC18ファミリのより限定的なユニットでは、これは非常に重要なスペースです


CCSはマイクロチップのPIC18ファミリー - PIC18F24K42のオーバーホールの準備が整いました!

Friday 26 May, 2017

CCS CコンパイラはPIC18F24K42ファミリのデバイスをサポートするようになりました。
現在利用可能なデバイスは最大32KBのプログラム・フラッシュ・メモリ、256BのデータEEPROMと最大2KBのデータSRAMを持っています。
さらに、25個のI / Oピン、24個の12ビットADCチャネル、 1個の5ビットDAC、2個のコンパレータ、3個の8ビットタイマ、3個の16ビットタイマ、ウィンドウ付きウォッチドッグタイマ、 SMT(Signal Measurement Timer)、4個の10ビットPWMペリフェラル、3個のCWG(Complementary Waveform Generator)、 NCO(Numerically Controlled Oscillator)、4個のCLCペリフェラル、ゼロクロス検出、2個のUARTペリフェラル、 2個のI2Cペリフェラル、1個のSPIペリフェラルがあります。

さらに、CCS Cコンパイラの#pin_selectディレクティブを使用して各I/Oピンをほぼ全てのペリフェラル に割り当てることができ、特定のハードウェア実装に対して高度に構成可能にします。 このファミリの今後のデバイスには最大128 KBのプログラム・フラッシュ・メモリ、 最大1 KBのデータEEPROM、最大8 KBのデータSRAM、最大44のI/Oピンと最大43のADCチャネルがあります。
これまでのアーキテクチャでは4KBのRAMしかサポートしていなかったため8KBのRAMはPIC18ファミリに とって重要なアップグレードです。

このファミリが持つ最新の機能はオプションでinterrupt vector table(IVT)を有効に出来ます。 IVTを使用するとペリフェラルの割り込みサービスルーチン(ISR)に素早く入ることができます。 通常、コンパイラは割り込み有効と割り込みフラグビットを検索して、正しいISRにジャンプするために どのペリフェラルが割り込みを発生させたかを判断する必要があります。IVTが有効にされた時に各割り込みは 特定のアドレスを持ちそのペリフェラルのISRのアドレスを含む割り込みが発生した時にそのアドレスに移動し ISRの高速化のサービスを行います。このデバイス・ファミリのコードに#device vector_intsを追加することにより CCS Cコンパイラでこれらのデバイスに対してIVTを有効にすることができます。


CCS CコンパイラによりPIC® MCUのCRCモジュールを使用してCRCを簡単に計算できます。

Friday 26 May, 2017

2つのデバイス間で確実にデータを送信するには通常チェックサムが必要です。 データのチェックサムを作成することはデータが正常に受信されたことを検出するための優れた方法です: 受信したチェックサムを数学的に決定されたチェックサムと比較することによってデータが適切に送受信されたか どうかを判定することができます。チェックサムを実行する一般的で簡単な方法はデータ内のすべてのバイトを 加算、又は、排他的論理和演算(XORing)することです。残念ながらこの方法はデータが正しく受信された状況を 正確に検出します。例えば、0 XOR 0の結果は依然として0です。つまりXORに基づくチェックサムは0x0000、 又は、0x00の違いを判別できません。

Cyclic Redundancy Check(CRC)[巡回冗長検査]はデータをハッシュするためのより堅牢な方法です。 前の例を参照すると0x0000のCRCは0x00ではありません。最近リリースされた多くの新しいPIC® MCUには ハードウェアでこのアルゴリズムを迅速に実行するCRCモジュールが含まれており、そして、 CCSはこのモジュールにアクセスするためのライブラリを提供しています。

ある種のMicrochip PIC® MCUは2つの基本的なCRCモジュールを持っています、 16ビット・モジュールと32ビット・モジュール。次のgetenv()文を使用してCCS Cコンパイラでデバイスに CRCモジュールがあるかどうかを判断できます:

getenv("CRC") // デバイスがHW CRCモジュールを持っている場合は1を返します。

CRCモジュールの両方のバージョンはプログラム可能な多項式CRC式を持っています、16ビット・モジュールの多項式は 最大16ビット幅であり、32ビット・モジュールの多項式は最大32ビット幅であり得ます。 setup_crc()関数はCRC多項式を設定するためにCCS Cコンパイラで使用できます。
例えば、CRC-16 CCITT多項式x ^ 16 + x ^ 12 + x ^ 5 + 1を使用してチェックサムを生成するように CRCモジュールを設定します。CRC-16 CCITT多項式、x^16 + x^12 + X^5 + 1を使用してチェックサムを生成するように CRCモジュールを設定します:

setup_crc(16, 12, 5, 0);

CRCチェックサムを計算するためにCCS Cコンパイラは32ビットCRCモジュールのみのデバイスに対して、 crc_calc8()、crc_calc16とcrc_calc32()関数を提供します。使用されるべき関数はsetup_crc()関数で セットされた多項式のサイズに依存します。8ビット以下の多項式ではcrc_calc8()関数を使用する必要があり、 多項式が8ビット以上16ビット以下の場合、crc_calc16()関数を使用、そして、16ビット以上32ビット以下の 多項式ではcrc_calc32()関数を使用する必要があります。 さらにcrc_calc8()、crc_calc16()とcrc_calc32()にはCRCチェックサムが計算されるデータの幅を設定できる オプションのパラメータがあります。データ幅のデフォルトは関数の幅、crc_calc8()では8ビット、 crc_calc16()では16ビット、crc_calc32()では32ビットです。最後にCCS CコンパイラはそのCRCジェネレータの 初期値を設定するためにcrc_init()関数が使用されます。この関数は正しい結果を保証するために CRC計算関数のいずれかを呼び出す前に呼び出される必要があります。

以下は、CRCモジュールを使用してUARTペリフェラルで送信されるある8ビットデータのための16ビットCRCを 生成する例です:

#use rs232(UART1, baud=9600, errors)
#define START 0x01
#define END 0x0D
void tx_data(unsigned int8 *Data, unsigned int8 Length)
{
unsigned int16 CRC;

crc_init(0);
CRC = crc_calc16(Data, Length, 8);
putc(START);
printf("%s%04LX", Data, CRC);
putc(END);

}

void main(void)
{
unsigned int8 Data[32];
unsigned int8 Length;
unsigned int16 Count = 0;

setup_crc(16, 12, 5, 0);

while(TRUE)
{
Length = sprintf(Data, "Count=%lu,", Count++);
tx_data(Data, Length);
delay_ms(100);
}
}


EZ App Lynxアップデート 3.0

Thursday 06 April, 2017

EZ App Lynxコンパイラ・ライブラリ、AndroidアプリケーションとiOSアプリケーションは 全てバージョン3.0にアップデートされました!
このバージョンにはアプリで使用する3つの新しいフィールド・タイプが含まれています。

最初の新しい追加はImageフィールドで、これはアプリがWebから画像を読み込んだり、又は、 アプリケーション・バンドル内に既にプリロードされている画像の一部を使用したりすることができます。 Webからロードされた画像はデバイスにキャッシュされるため最初に接続したときにダウンロードするだけで済みます。
Imageフィールドを使用してプレーンな画像を表示したり、又は、Imageはボタンとして使用することができます。 ボタン・イメージは通常のボタン・フィールドと同様に機能するone-state又は、two-stateボタンです。 これらのフィールドは2つの別個のイメージをロードすることができ、最初は"on"/"pressed"状態であり、 2番目は"off"/"unpressed"状態です。1つのイメージしか指定されていない場合、Imagesフィールドは両方の状態で 同じイメージを使用します。Imageフィールドの使用方法の詳細については現在のCCS Cコンパイラに含まれている EZApp.h及び、ex_ezapp_images.cを参照して下さい。



残りの2つの新しいフィールドはGraphとSeriesフィールド・タイプです。これによりアプリケーションに 棒グラフや折れ線グラフを追加することができます。Graphフィールドではグラフの種類、グリッド線、 ラベル、データ範囲等が設定され、Seriesフィールドでは色、線種、シリーズ名等データのグラフの 表示方法が設定されます。 Multiple Seriesフィールドを1つのGraphフィールドに結び付け複数のデータセットを 同じグラフ上に表示することができます。

GraphとSeriesフィールドの使用方法の詳細については現在のCCS Cコンパイラに付属のEZApp.hと ex_ezapp_graphing.cを参照して下さい。


EZ App Lynxに関する更に詳しくはをご覧下さい。


生産中のシリアル・ナンバリングを簡単に!

Thursday 06 April, 2017

CCS CコンパイラとPrime8プロタクション・プログラマーを使用することで実稼働環境でのデバイスの シリアライズは簡単で容易です。CCS Cコンパイラでは#serializeプリプロセッサ・ディレクティブを使用して シリアライゼーションを設定できます。シリアル番号はバイナリ形式又は、ストリング形式で保存することができ、 ROM又は、EEPROMに保存することもできます(可能な場合)。

この例は、EEPROM又は、ROMの何れかに32ビットのバイナリー・シリアル番号(4バイト)を格納する簡単な方法を示しています。 ターゲットデバイスには256バイトのEEPROMと32Kバイトのフラッシュ・プログラム・メモリがあり シリアル番号は定義された場所に応じて最後の4バイトに格納されます。ROMバリアントの#ORGはシリアル番号を 含むプログラム・メモリをコンパイラが別の場所で使用することを予約することです。



バイナリー・シリアル番号をメモリから読み取るのはその変数へのバイト・ポインタを使って生データを変数に 直接読み込むのと同じくらい簡単です。この例では、生データバイトのインデックスに使用される32ビット変数に ポインタが作成されます。結果はプログラマが設定した32ビットの数値です。

シリアライゼーション設定、又は、"burntime"の設定はコンパイル時にヘキサ・ファイルに保存され、 ヘキサ・ファイルを書き込むときにPrime8の内部メモリにロードされます。その後、ジョブ設定画面で 初期シリアル番号を設定又は、変更することができます。

シリアル番号は書き込みが成功するたびに自動的に増分されるため接続されている各ターゲットには別の シリアル番号が書き込まれます。



Prime8の現在のシリアル番号を変更するには現在のジョブのConfigボタンを選択します。 Config[設定]画面では、"Name/Location"セッティングをタッチし、"Internal Memory"を選択し、 ファイルが書き込まれたメモリー・スロットを選択することによってファイルを選択できます。 これでConfig画面にファイル名と場所が表示されます。"Serial Number"セッティングが表示されるまで 下矢印をタッチします。新しいシリアル番号を入力できるキーパッドを開くためにこのセッティングをタッチします。 数字を入力したら、セッティングをセーブするためにEnterボタンを押します。



プログラムがターゲットに書き込まれると、入力されたシリアル番号が最初に書き込まれたシリアル番号 (この場合は65536)になり、そして、それぞれの連続するターゲットはインクリメントされたシリアル番号(65537,6538、...) となります。この番号はjob configuration[ジョブ設定]画面で再度設定を変更することによって常に変更 又は、リセットすることができます。

Prime8プロダクション・プログラマー
CCS Cコンパイラ IDE機能


New! タッチスクリーン開発ボードとInterface Designer GUI

Wednesday 11 January, 2017

CCSにはIDEコンパイラの一部として提供される新しいソフトウェアパッケージInterface Designerがあります。 これでユーザーはInterface Designerのユーザー・フレンドリーなインターフェイスを使って精巧なグラフィカル・ ユーザー・インターフェイス(GUI)を作成することができます。革新的なプログラムはユーザーが Interface Designer自体でGUIを視覚的に作成できるようにすることにより、Cコードの開発からGUIを完全に 作成する必要性を排除します。

Touchscreen on PC

Interface Designerは使いやすいインターフェイスでユーザー・フレンドリーなノウハウを提供します。

  • カスタム・イメージをインポートするか、又は、GUIで使用するイメージ・ライブラリから選択します。
  • エリアでボタンとテキスト・ボックスを簡単に作成できます。(タッチスクリーン上にユーザー・タッチを登録する座標定義位置)
  • タッチスクリーン上に視覚的に表示されるコンテナであるWindowsを使用して任意の数の画像で必要な数の異なる画面を実装します。
  • アクションを追加すると定義されたエリアがタッチスクリーンにタッチされたときに実行されます。
  • ボタンのワンクリックで適切なCコードを生成。


Interface DesignerはCCSによって開発された新しいTouch Display開発ボードを中心に設計されています。
タッチ・ディスプレイ 4.3 開発キット:
Touch Display 4.3 Prototyping Board
この新しい開発ボードには480 x 272の画面解像度を備えた4.3インチ抵抗膜式タッチスクリーンと 最も革新的なGUIを実行するために必要なすべてのハードウェアが含まれています。全てのコンポーネントが 1つの開発ボード上に配置されているため、タッチディスプレイは別個のマイクロコントローラを 外部タッチ・スクリーン・ディスプレイに接続してスペースを節約するという一般的な必要性を排除します。

CCSは開発に必要なハードウェアとソフトウェアが全て含まれているタッチディスプレイ開発ボードを 使用するための署名キットを設計しました。Interface DesignerをCCS Cコンパイラの一部として組み込んでいます。


Prime8プロダクション・プログラマー・アップデート

Wednesday 11 January, 2017

Prime8はこれまでよりも良いものにするための再設計が行われました!
Prime8プロダクションプログラマーは8つのPIC® MCUを同時にプログラムできるギャング・プログラマーです。
USB接続によるソフトウェア制御を介して動作することもメモリにファイルを保存することによってPCなしで スタンド・アローンで動作することもできます。
Prime8
最もメジャーなアップデートははるかに簡単で使い易いユーザー・インターフェイスを備えたタッチスクリーンLCDです。 この新しいUIによりファイルを選択してファイルを簡単に設定できるだけでなくユニットの設定も簡単になります。 UIもアップグレードされメモリに保存されているファイルに関する詳細情報が表示されます。

PIC® MCUのプログラミング速度も改善されています。例えば、完全にPIC24EP256GP206を プログラミングすると新しいPrime8を使用した場合と古いモデルを使用した場合、時間がほぼ75%短縮されます。

内部メモリは8MBにアップグレードされ、ユーザーは1MBのファイルを8個保存することができます(旧モデルは2MBと4ファイル)。 1MBを超えるファイルでもPrime 8の内部メモリの複数のスロットを使用して保存することができます。 8MBのメモリで十分でない場合は、Prime8に接続されたUSBサムドライブを使用して拡張できます。



CCS Cコンパイラを使用した新しいSignal Measurement Timer(SMT)[信号測定タイマ] PIC® MCUペリフェラルの活用

Tuesday 06 December, 2016

Signal Measurement Timer(SMT)[信号測定タイマ]はPIC16F18877ファミリやPIC18F67K40ファミリ等の 新しいPIC® MCUデバイスのいくつかで使用されている強力な新しいタイミング・ペリフェラルです。 各SMTは幾つかのモードの1つで動作することが出来る24ビットタイマです:

*Timer - Timer0又は、Timer1ペリフェラルに似たシンプルな24ビットタイマ

* Gated Timer - 上記のタイマモードと同様ですが、信号GPIO信号がハイの場合にのみインクリメントします。

* Period and duty cycle measurement - ゲートされたタイマと同様に、信号GPIO信号がハイのときにカウンタを インクリメントします。しかし、信号GPIOがローになるとタイマ値は将来の使用のためにストアされカウンタは0に リセットされます。

* High and low measurement - 上記の周期とデューティサイクル・モードと同様ですが、すべての信号エッジでリセットとストアします。

* Window Measurement - 上記の周期とデューティ・サイクル測定に類似していますが、ウィンドウGPIOピンの2つの立ち上がりエッジ信号間の時間を測定します。

* Gated window measurement - 上記のウインドウ測定と同様ですが、信号GPIOピンがハイのときに時間のみをインクリメントします。

* Time of flight - ウインドウ測定と同様ですが、ウインドウGPIOピンがハイの時タイミングを開始しウインドウGPIOピン又は、信号GPIOピンがハイの時タイマーはストアされ0にリセットされます。

* 24bit capture - ウィンドウGPIOピンが状態を変えると単にタイマ値をストアします。

* 24bit counter - シグナルGPIOピンの全ての立ち上がりエッジをカウントします。

* Gated counter - 24ビット・カウンター・モードに相当しますが、ウィンドウGPIOピンがハイの時のみインクリメントします。

* Windows counter - ゲートされたカウンター・モードと同様ですが、ウィンドウGPIOピンの立ち上がりエッジは既存のタイマー・カウンタをストアし、 その後0にリセットします。

CCS CコンパイラがアップデートされPICmicro CプロジェクトでSMTの制御、設定、使用が可能なライブラリが追加されました。 追加された関数はsetup_smtX() (又は、最初のSMTペリフェラルをセットアップするためめのsetup_smt1() ), smtX_status(), smtX_start(), smtX_stop(), smtX_update(), smtX_reset_timer(), smtX_read()smtX_write().
詳細はCCS Cコンパイラのヘルプ・ファイル又は、リファレンス・マニュアルを参照してください。

Timerモードを使用してLEDを1Hzレートで点滅させる例を示します:

#define LED_PIN PIN_B4
#define SMT_PERIOD (getenv("CLOCK") - 1)

#INT_SMT1
void my_smt_isr(void)
{
output_toggle(LED_PIN);
}

void my_smt_init(void)
{
setup_smt1(SMT_ENABLED | SMT_MODE_TIMER | SMT_CLK_FOSC, SMT_PERIOD);
smt1_start();

enable_interrupts(INT_SMT1);
enable_interrupts(GLOBAL);
}

CCS CコンパイラにはSMTの使用方法を示す2つの完全なサンプルプログラムも用意されています。 このプログラムはCCS Cコンパイラのexamplesディレクトリにあります。最初のex_smt_timer.cはTimerモードで SMTペリフェラルを使用してI/Oピンをトグルする例で、2番目のex_smt_period_duty.cは入力信号の周期と デューティ・サイクルを決定するためにPeriod and Duty Cycle AcquisitionモードのSMTペリフェラルを使用します。

CCS CコンパイラによるEvent Timersのキャプチャ

Tuesday 06 December, 2016

PIC16及び、PIC18 PIC® MCUのキャプチャコンペア(CCP)ペリフェラルとdsPIC及び、 PIC24® PIC MCUのインプットキャプチャ(IC)ペリフェラルは特定の入力ピンが ユーザ定義状態に達するとMCUがタイマ値をキャプチャして保持することを可能にします。 このペリフェラルはイベント間の継続時間を測定したり、又は、入力信号の周波数又は、 デューティ・サイクルを決定したりするのに便利です。このペリフェラルはMCUの動作とは独立して動作します。 つまり、入力信号が発生するのを待つコード実行をブロックすることなく入力信号上のタイマを捕捉できます。

CCS Cコンパイラのバージョン5ではCCP又は、ICペリフェラルの使用を容易にする#use capture() ライブラリが追加されました。このライブラリのAPIはペリフェラルとタイマーの使用と設定、 使いやすいPIC® MCUデバイスから別のPIC® MCUデバイスへの移植方法を 提供します。その使用法のサンプルを以下に示します:

#use capture(CCP1, input=PIN_C2, capture_rising, stream=CAPTURE1)

unsigned int16 WaitForEvent(void)
{
while(!get_capture_event(CAPTURE1));
return(get_capture_time(CAPTURE1));
}

#use capture()はCCP又は、ICペリフェラルを使用するように設定し、 STREAMオプションを使用することによりいくつかの周辺機器を#use capture()のいくつかの実例で 設定することができます。#use capture()は使用するタイマー・ペリフェラルとタイマーの ティック[tick]・レートを設定する方法も提供します。その他の設定オプションがいくつかあります。 コンパイラのヘルプ・マニュアルを参照してください。

get_capture_event()はCCP又は、ICペリフェラルが読み込み可能なイベントを捉えていればTRUEを返し、 get_capture_time()はイベントが発生した時刻を返します。

このライブラリはCCS Cコンパイラのexamplesディレクトリにあるex_use_caputure.cで、 CCS Cコンパイラはこのライブラリを使用する例を提供しています。このサンプルはバージョン5の CCS Cコンパイラで使用できます。