CCS News

Programmable Switch Mode Controller[プログラマブル・スイッチ・モード・コントローラ](PSMC)

Monday 17 May, 2021

Pulse Width Modulation[パルス幅変調](PWM)機能はキャプチャ/比較/PWM(CCP)ユニットを使用してPIC®マイクロコントローラ に初期に追加されました。それ以来、強化されたCCP(ECCP)とそれぞれ独自の機能を備えた様々な電力やモーター制御PWMモジュールを見てきました。 PWMモジュールはプログラマブル・スイッチ・モード・コントローラ(PSMC)と呼ばれます。これは現在迄で最も洗練されたPWMであり、PIC16F1789のようなチップ上にあります。

PSMCは幾つかの古いモジュールと同様に標準PWM、補完PWM、シャットダウン制御とデッドバンド制御を可能にします。 また、デューティと周波数、及び、可変周波数の高分解能が可能になります。 例えば、3相6ステップPWMを実行できます。

入力ピン、コンパレータ出力とCCPトリガーはシャットダウンを制御するだけでなくPWMが実行されているか どうかを制御したりサイクルを開始、又は、停止したりするために使用できます。
一部のPIC® MCUデバイスには最大4つの独立したユニットがありオプションでユニットを相互に同期させることができます。
コンパイラ関数は次のとおりです:
setup_psmc(unit, mode, period, period_time,
rising_edge, rise_time,
falling_edge, fall_time);

psmc_pins(unit, pins_used, pins_active_low);

psmc_duty(unit, fall_time);

psmc_deadband(unit, rising_edge, falling_edge);

psmc_blanking(unit, rising_edge, rise_time, falling_edge, fall_time);

psmc_shutdown(unit, option, source, pins_high);

psmc_freq_adjust(unit, freq_adjust);

psmc_modulation(unit, options);

psmc_sync(slave_unit, master_unit, options);

以下はいくつかの機能を紹介する短いサンプル・プログラムです:
#include <16f1789.h>
#use delay(osc=20mhz)

#define us(time) (int16)(time*(getenv("CLOCK")/1000000))

void main(void) {

setup_psmc(1, PSMC_ECCP_BRIDGE_FORWARD,
PSMC_EVENT_TIME | PSMC_SOURCE_FOSC | PSMC_DIV_2, us(100),
PSMC_EVENT_TIME, us(10),
PSMC_EVENT_TIME, us(35));

psmc_deadband(1, us(2), us(4));
psmc_modulation(1, PSMC_MOD_IN_PIN);
psmc_pins(1, PSMC_A | PSMC_B | PSMC_C | PSMC_D);

setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(sAN0);
set_adc_channel(0);

while(TRUE) {
psmc_duty(1, us(((read_adc()*(int16)10)/25)) );
}
}



他のサンプルはコンパイラのインストール後に含まれているPICC\Exampleフォルダのex_psc_で始まるファイルをご覧下さい。

CCS CコンパイラでのI2Cの使用

Monday 25 January, 2021

I2CプロトコルはPIC®MCUの2つのI/OピンであるSCLとSDAピンのみを使用して 複数のデバイスと通信するための非常に便利なシリアル通信プロトコルです。 SCLピンはデバイスとの間でデータのクロッキングを同期するために使用されるクロック・ピンで、 SDAピンはデータがデバイスに出入りするデータ・ピンです。 両方のピンはオープン・ドレイン構成、つまり、一方のピンにLowを出力するには、 ピンはLowに駆動し、一方のピンでHighを出力するには、ピンはフロートしているため ラインを高電圧レベルに引き上げるために外部プルアップ抵抗が必要です。

全てのI2C通信はマスター・デバイスがバス上でI2Cスタートを実行し、両方のピンがHighの間に SDAピンをLowに、次にSCLピンをLowにすることによって開始されます。 通常、バス上にはマスター・デバイスが1つしかありませんが、この記事の範囲を超えるI2Cプロトコルの マルチ-マスター・バージョンがあります。 次にマスターがアドレス・ビットをクロックアウトし、7-bitアドレスと10-bitアドレス・プロトコルが あり、7-bitアドレスは通常マイクロコントローラー・アプリケーションで使用されるため、 この記事ではそれらに焦点を当てます。7-bitアドレスがクロックされた後、読み取り/書き込みビット はマスターによってクロック・アウトされます。 読み取り/書き込みビットがLowに引き下げられるとマスターはスレーブにデータを書き込み、 Highの場合、マスターはスレーブからデータを読み取ります。 最後に読み取り/書き込みビットに続いてマスターは確認応答(ACK)ビットをクロック・インします。 スレーブ・デバイスがアドレスを確認するとACKビット中にSDAピンがLowになるか、又は、 スレーブ・デバイスがアドレスを確認しない場合にはSDAピンはACKビット中にHighにフロート したままになります。以下は、I2Cの開始とアドレス・バイトがどのように見えるかを示す図です:



スレーブ・デバイスがアドレス・バイトを確認すると仮定しますとマスターはデータ・バイトを クロック・アウト、又は、クロック・インします。 これはマスターが8データ・ビットをクロックし、その後にACKビットが続くことによって行われます。 マスターがスレーブ・デバイスにデータを書き込んでいる場合、マスターは8データビットの間にSDAピンを 制御し、スレーブはACKビットの間にSDAピンを制御します。 スレーブがデータ・バイトを確認するとACKビット中にSDAピンがLowにされ、データ・バイトが 確認されない場合、ACKビット中にSDAピンをHighにフロート出来るようになります。 マスターがスレーブ・デバイスからデータを読み取っている場合、スレーブは8データビットの間に SDAピンを制御し、マスターはACKビットの間にSDAピンを制御します。 マスターは読み取り中にACKビットを使用してスレーブ・デバイスがより多くのデータを読み取るかどうか を通知し、マスターはスレーブ・デバイスから読み取るデータがさらにある場合、ACK中にSDAピンをLowに し、SDAピンをHighにフロートさせます。スレーブ・デバイスからデータの読み取りを行った場合、 ACK中にHighになります。 以下は、I2Cデータの読み取りと書き込みバイトがどのように見えるかを示す図です:


マスターはデータの読み取り、又は、書き込みを終了するとI2C停止を実行してデバイスとの通信が 完了したことを示します。マスターはスレーブ・デバイスがSDAラインを制御しているときにACKビット中に スレーブ・デバイスがSDAラインをLowにプルしないときはいつでもI2C停止を実行する必要があります。 I2C停止はSCLラインが既にHighのときにSDAラインをLowからHighに移行させることによって 行われます。以下はI2C stopがどのように見えるかを示す図です:


I2Cプロトコルについて知っておくべき他のいくつかの機能はI2Cの再起動、又は、繰り返し開始と クロックのストレッチです。I2Cの再起動はマスターが最初にSDAラインをHighにセッティングし 次にSCLラインをHighにし、次にSDAラインを再びLowに引き下げることによって行われます。 再起動はマスターがスレーブ・デバイスとの間でデータの読み取り、又は、書き込みを行っていて 同じスレーブ・デバイスに対して実行している操作を切り替えたい場合に使用されます。 再起動を使用できる場合の例は外部EEPROMからランダムなアドレスからデータを読み取る場合、 マスターは最初にデータをEEPROMに書き込み、読み取りたいEEPROMメモリにアドレスをセッティングし そのアドレスからデータを読み取ります。

クロック・ストレッチはマスターがスレーブ・デバイスとの間でデータをクロックするのを一時停止 するためにスレーブ・デバイスによって使用されます。 スレーブ・デバイスはSCLラインを引っ張ることによってクロック・ストレッチを実行し、 マスターがクロックを再開する準備ができるとクロックを解放してHighにフロートさせます。 クロック・ストレッチが使用される場合の例は、スレーブ・デバイスから複数バイトのデータが 読み取られている場合です。スレーブ・デバイスはマスターがクロック・アウトを開始する前に読み取るデータをロードできるように マスターを一時停止する必要があります。以下はこれら2つの機能を示す図です:



CCS CコンパイラにはI2C通信を実行するためのライブラリが組み込まれています。このライブラリは マスター・デバイス、又は、スレーブ・デバイスで行われるのと同様にSWの実装、又は、 通信を実行するためのPIC®マイクロコントローラのHWペリフェラルの使用が出来ます。

スレーブ・モードはPIC®マイクロコントローラのHWペリフェラルを使用する場合にのみ サポートされます。 殆どのPIC10、PIC12、PIC16とPIC18デバイスにはI2C通信に使用できる1つ、又は、場合によっては 2つの同期シリアル・ポート(SSP)モジュールがあります。SSPモジュールはSPI、又は、I2C通信を 実行するように構成できるSPI、及び、I2Cペリフェラルの組み合わせです。 CCS Cコンパイラの#use library()は正しいパラメータが渡されるとI2C通信用にSSPモジュールを セットアップします。 マスター・デバイスとしてセットアップする場合、i2c_start()、i2c_write()、i2c_read()、及び、 i2c_stop()を使用してI2C通信を実行します。 スレーブ・デバイスとしてセットアップする場合、SSP割り込みとi2c_isr_state()、i2c_read()、 及び、i2c_write()関数がI2C通信に使用されます。 スレーブ通信のセットアップ例についてはex_slave.cを参照してください。 以下はマスターが外部EEPROMからランダムバイトを読み取る方法を示す例です:

#use i2c(I2C1, MASTER, fast, stream=EEPROM_STREAM)

int8 rAddress;
int8 rValue;

i2c_start(EEPROM_STREAM);
i2c_write(EEPROM_STREAM, 0xA0);
i2c_write(EEPROM_STREAM, rAddress);
i2c_start(EEPROM_STREAM);
i2c_write(EEPROM_STREAM, 0xA1);
rValue = i2c_read(EEPROM_STREAM, 0);
i2c_stop(EEPROM_STREAM);


一部の新しいPIC18デバイス、例えばPIC18F47K42ファミリには、I2C通信を行うための新しい 専用I2Cペリフェラルがあります。 これらの新しいデバイスの1つをスレーブとしてセットアップする場合、全ては基本的に同じですが、 唯一の例外は使用されるISRです。 例についてはex_i2c_slave_k42.cを参照してください。 一方、これらの新しいデバイスの1つをマスターとしてセットアップする場合は、状況が異なります。 これは新しい専用I2Cモジュールの動作がSSPモジュールとは異なるためです。 主な違いは古いSSPモジュールには開始、再起動、停止等を行うための個別のビットがあったことです。 新しい専用I2Cモジュールにはこれらがありません。代わりに送信するアドレスをセットするレジスタがあり、 データの書き込みか読み取りか等、転送バイト数をセットします。 全てのI2C通信は起動、再起動、停止等を行うペリフェラルによって処理されます。 このためマスターとしてセットアップしてHWペリフェラルを使用する場合、CCSCコンパイラの レガシーI2C機能はこれらのデバイスと互換性がありません。 そのため、これらのデバイスでHW I2Cペリフェラルを使用するためにi2c_transfer()、 i2c_transfer_out()、i2c_transfer_in()関数が#use i2c()ライブラリに追加されました。 i2c_transfer()関数はスレーブ・デバイスとの間でデータの書き込みと読み取りの両方に使用され、 書き込みと読み取りの間に再起動を実行します。 i2c_transfer_out()関数を使用してスレーブ・デバイスにデータを書き込むことができ、 i2c_transfer_in()関数を使用してスレーブ・デバイスからデータを読み取ることができます。 それらの使用例についてはex_i2c_master_hw_k42.cを参照してください。 また、これらの新機能はソフトウェア実装を使用する場合とHWペリフェラルを使用する場合の両方で、 他の全てのPIC®マイクロコントローラと互換性があるため、これらの新機能を使用して 記述されたコードは全てのPICマイクロコントローラで機能します。 以下はマスターがi2c_transfer()関数を使用して外部EEPROMからランダム・バイトを読み取る方法を 示す例です:

#use i2c(I2C1, MASTER, fast, stream=EEPROM_STREAM)

int8 rAddress;
int8 rValue;

i2c_transfer(EEPROM_STREAM, 0xA0, &rAddress, 1, &rValue, 1);
//実行 - 開始、書き込み、再起動、読み取り、停止

// 又は、

i2c_transfer_out(EEPROM_STREAM, 0xA0, &rAddress, 1);
//実行 - 開始、書き込み、停止
i2c_transfer_in(EEPROM_STREAM, 0xA0, &rValue, 1);
//実行 - 開始、書き込み、停止


PIC24、dsPIC30、及び、dsPIC33デバイスにはI2C通信を行うための専用I2Cモジュールがあります。 それらの専用I2CモジュールはSSPモジュールに似ており、新しいi2c_transfer()関数を含め、 マスターとスレーブの通信に使用される全ての関数は同じです。 これに対して唯一の例外はスレーブ通信に使用されるISRです。これらのデバイスでの スレーブI2C通信の例についてはex_slave_pcd.cを参照してください。

Tech Note: CCS Cコンパイラの新しい高度なRFIDドライバ!

Thursday 29 August, 2019

CCSはPhychips RED5 UHF RFIDリーダーモジュールと通信するための新しいドライバーpr9200.cを追加しました。 RED5はPhychips PR9200高性能UHF RFIDリーダー・チップセット、TCXO、バラン、カプラー、ソー・フィルター、 パワーアンプとローパス・フィルターを統合したハイブリッド・モジュールです。 このドライバーはRED5モジュールと通信してISO-18000-6C EPC Gen 2 UHF RFIDタグを検出、読み取り、 書き込みするために必要な全ての機能と設定が含まれています。

ドライバーはUART接続を介してRED5モジュールと通信しオプションと共に通信に使用するピンを選択するための 定義を持っています。RED5モジュールとの間で送受信されるメッセージに対してCRC16を実行するために PIC®MCUハードウェアCRC周辺機器を使用するかソフトウェアCRCを使用するかを選択することが 含まれます。ドライバーにはRED5モジュールが持つ全てのパラメーターを取得、又は、設定するための機能、 例えば、UHF RFIDタグを検出、読み取りおよび書き込みする機能も同様にリージョン、TX電力レベル、セッション、 周波数ホッピング・テーブル等を取得、及び、設定する機能が含まれます。さらに、ほとんど全ての機能には協調するか 応答を待つかのオプションがあります。 TX電力レベルの設定など一部の機能ではその機能を呼び出して応答を 待つことができます。但し、場合によっては、タグ検出の実行に渡されるパラメータによっては終了するのに数秒かかる ことがありますので、プロセスを開始してから戻ることをお勧めします。これにより、PICはRED5モジュールが応答するのを 待っている間に他のコードを実行し、受信した応答を処理できます。

Phychips RED5モードと通信するためのCCSの新しいpr9200.cドライバーはUHF RFIDプロジェクトを 簡単かつ迅速に開始するために必要な全ての機能を備えています。

Tech Note: CCS Cコンパイラの新しいメッセージベースのSPI関数!

Thursday 29 August, 2019

CCS CコンパイラはSPIスレーブ・デバイスとの間でデータを転送するためのSPIマスターとしてセットアップされる時、 #use spi()ライブラリに3つの新しい関数を追加しました。 関数はspi_transfer(), spi_transfer_out(), spi_transfer_in()関数です。 これらの関数はハードウェアSSPx、又は、SPIxペリフェラルを使用してSPIマスターとしてセットアップする時、又は、 ソフトウェアSPIを実行する時など全てのデバイスで使用できます。
spi_transfer()関数を使用する利点の1つは、spi_xfer()関数を複数回呼び出す代わりに1つの関数を 1回呼び出すだけでSPIスレーブ・デバイスとの間でデータを読み書きする全てのステップを実行できることです。 さらに、#use spi()で有効化ピンが指定されている場合、転送の開始時にイネーブルピンをアクティブ状態に設定し、 全てのバイトを転送し、そして、転送の終わりにspi_xfer()の各呼び出し間でアクティブと非アクティブ状態の間で 有効ピンを切り替える代わりにイネーブルピンを非アクティブ状態に設定します。

spi_transfer_out()関数はスレーブ・デバイスにデータを転送し次のように使用されます:

spi_transfer_out(wData, Count);

有効ピンが指定されている場合、上記関数によりマスターはイネーブルピンをアクティブ状態に設定します。 次に、有効ピンが指定されている場合、カウントバイトをスレーブに書き込み、有効ピンを非アクティブ状態に設定します。

spi_transfer_in()関数はスレーブ・デバイスからデータを転送し次のように使用されます:

spi_transfer_in(rData, Count);

マスターは有効ピンが指定されている場合、有効ピンをアクティブ状態に設定し、スレーブからカウントバイトを読み取り、 そして、有効ピンが指定されている場合、有効ピンを非アクティブ状態に設定します。 spi_transfer_in()関数を使用する場合、データがスレーブ・デバイスからクロックインされている間、 SPI DOピンにLowを出力します。

spi_transfer()関数はスレーブ・デバイスとの間でデータを同時に転送し次のように使用されます:

spi_transfer(wData, rData, Count);

上記によりマスターは有効化ピンが指定されている場合、有効化ピンをアクティブ状態に設定し、 有効化ピンが指定されている場合、スレーブとの間でカウントバイトを読み書きし、有効化ピンを非アクティブ状態に 設定します。

spi_transfer()関数の使用方法を示す例についてはCCS CコンパイラがインストールされたDriversフォルダー の9356.cを参照してください。9356.cドライバは2Kビットのメモリを備えたMicrochip 93C56シリアルEEPROM用です。

さらに、ダイレクト・メモリ・アクセス(DMA)周辺機器を備えたデバイスのために#use spi()がアップデートされました。
ハードウェアSSPx、又は、SPIxペリフェラルを使用してSSPx、又は、SPIxペリフェラルとの間でデータを転送する時に spi_transfer()関数でDMAを使用できるようになりました。
#use spi()でオプションUSE_DMAを使用するとspi_transfer()関数でDMAを使用できるようになり、#use spi()で オプションDMA_RX_CHANNELとDMA_TX_CHANNELを使用しDMA RXとTXチャンネルをデフォルト・ チャンネル以外に 設定できます。デフォルトではライブラリはPCDコンパイラではDMAチャネル0を使用してデータを受信しDMAチャネル1を 使用してデータを送信します。PCHコンパイラでは、ライブラリはDMAチャネル1を使用してデータを受信し、 DMAチャネル2を使用してデータを送信します。

DMAが使用される時、spi_transfer()関数はspi_transfer()関数が転送を完了するのを待つ間、 コードの実行を停止しません。DMAとSPI周辺機器がSPIスレーブとの間でデータを転送している間にPICが他の コードを実行できるためこれは利点です。SPI転送がいつ完了したかを判断するために関数spi_transfer_done()が #use spi()ライブラリに追加されました。さらに、転送の完了を判断するために使用される割り込みフラグを クリアするためにspi_transfer_clear()が#use spi()ライブラリに追加されました。
これらの関数はSPIペリフェラルからの受信に使用されるDMAチャネルの割り込みフラグをチェックしクリアします。
PCDコンパイラはDMAx割り込みフラグを使用し、PCHコンパイラはDMAxDCNT割り込みフラグを使用します。

USE_DMAオプションを使用する場合、ハードウェアSSxOUTピンを持つデバイスを除き、#use spi()ライブラリでは enable=PIN_xxオプションはサポートされません。デバイスはハードウェア・イネーブル・ピンを使用するように設定されます。 その場合、USE_DMAオプションを使用するとspi_transfer()関数が有効ピンを制御します。
PIC18F47K42はSPI周辺機器用のハードウェア制御可能なイネーブルピンを備えたPIC®の例です。

Tech Note: CCS Cコンパイラはデュアル・コア・プロセッサをサポートするようになりました!

Monday 06 May, 2019

CCS CコンパイラはdsPIC33CHファミリのデバイスをサポートするようになりました!
dsPIC33CHファミリはMicrochipが提供する最初のデュアル・コアPIC®MCUであり、ユーザーは 同じデバイスで2つの独立したプログラムを実行できます。さらに、各コアには個別のクロック回路がありマスターコアの 最大周波数は180MHz(90 MIPS)とスレーブ・コアの最大周波数は200MHz(100 MIPS)で、 各コアで異なるクロック周波数を実行できます。

現在、最大512Kバイトのフラッシュ・プログラム・メモリと最大48KバイトのデータRAMを備えたマスター・コア、 と最大72KバイトのプログラムRAM(PRAM)と16KバイトのデータRAMを備えたスレーブコアを備えたデバイスを利用できます。

スレーブ・コアのプログラムメモリはPRAMであるため、その実際のプログラムはマスター・コアのフラッシュ・プログラム ・メモリに格納され、そして、実行時にマスター・コアによってスレーブ・コアのPRAMにロードされます。

CCS Cコンパイラはスレーブ・コアのPRAMをロード、及び、ベリファイするための関数load_slave_program()と verify_slave_program()を提供します。スレーブ・コアのプログラムをビルド、及び、ロードする方法の 例についてはex_ch_master.cとex_ch_slave.cを参照してください。

さらに、マスター・コアとスレーブ・コアには個別のデータRAMがあるため、マイクロチップはコアが相互に通信するための 2つの方法を提供します。

1番目の方法は一連のメール・ボックス・レジスタで、コア間で通信するためにその方向とプロトコルを コンフィギュレーション・ヒューズでプログラムできます。

2番目の方法はコア間の通信に使用できるFIFOレジスタの読み書き専用です。

どちらもマスター・スレーブ・インターフェイス(MSI)ペリフェラルの一部でありCCS Cコンパイラはセットアップ、ステータスの チェック、メールボックスとFIFOレジスタとのデータの読み書きを行うためのいくつかの機能を提供します。

dsPIC33CHファミリのいくつかの機能は次のとおりです; マスター・コアは1つの16ビット・タイマー、6つのDMAチャネル、 8つのSCCP周辺機器、2つのUART周辺機器、2つのSPI周辺機器、2つのI2C周辺機器、2つのCAN FD周辺機器、 2つのSENT周辺機器、1つのCRC周辺機器、1つのQEI周辺機器、4つのCLC周辺機器、 4つの16ビットHigh-Seed PWM周辺機器、最大16チャネルの12ビットADCとアナログ・コンパレータ周辺機器を 備えた1つの12ビットDACを持っています。

スレーブ・コアは1つの16ビット・タイマー、2つのDMAチャネル、4つのSCCP周辺機器、1つのUART周辺機器、 1つのSPI周辺機器、1つのI2C周辺機器、1つのQEI周辺機器、4つのCLC周辺機器、 8つの16ビットHigh-Seed PWM周辺機器、2つの専用ADCコアを備えた12ビットADCと最大18チャネルの1つの共有ADCコア、 そして、アナログ・コンパレータ周辺機器を備えた3つの12ビットDACを持っています。

SCCP周辺機器は入力キャプチャ、出力コンペア、PWMと32ビット・タイマー周辺機器を新たに組み合わせたものです。 このペリフェラルは2つの16ビット・タイマー、又は、単一の32ビット・タイマー、16ビット、又は、32ビット出力コンペア、 16ビット、又は、32ビットの入力キャプチャ、又は、16 PWMとして使用できます。
SCCP周辺機器を持つPCDデバイスの#use pwm()のサポートが追加されました。

Tech Note: CCS Compilerの新しいpin_i2c関数

Monday 06 May, 2019

CCS CコンパイラはI2Cスレーブ・デバイスとの間でデータを転送するためのI2Cマスターとしてセットアップする時、 #use i2c()ライブラリに3つの新しい関数を追加しました。これらの関数はi2c_transfer()、i2c_transfer_out() とi2c_transfer_in()です。
これらの関数はCCS Cコンパイラに追加されI2Cペリフェラルがレガシーi2c_start()、i2c_write()、i2c_read()、 及び、i2c_stop()関数と互換性の無いいくつかの新しいデバイスをサポートします。
但し、これらの機能はハードウェア周辺機器を使用するか、又は、ソフトウェアI2Cを実行してI2Cマスターとしてセットアップすると           全てのデバイスで使用できます。
これらの関数は全てのデバイスでサポートされているため、CCSはコードを全てのデバイスに移植可能にするコードを開発するために レガシー機能の代わりにこれらの機能を使用することをお勧めします。
これらの関数を使用することのもう1つの利点は、従来の関数と比較して、複数の関数呼び出しの代わりに単一の関数呼び出しで 全てのI2Cステップを実行することです。

i2c_transfer_out()関数は以下を使用してスレーブ・デバイスにデータを転送します:

ack=i2c_transfer_out(SlaveAddr, wData, Count);

上記によりマスターはI2C起動を実行し、指定されたスレーブ・アドレスに書き込みコマンドを送信し、カウント・バイトをスレーブに 送信し、I2C停止を実行し、確認ビットを返します。確認ビットがACKの場合、転送は成功です。 如何なる場合もスレーブ・デバイスがデータ・バイトのいずれかをNACKするとi2c_trasnfer_out()関数はすぐにI2C停止を実行し、 転送が失敗したことを示すNACKを返します。

i2c_transfer_in()関数は次のようにスレーブ・デバイスからデータを転送します:

ack=i2c_transfer_in(SlaveAddr, rData, Count);

上記によりマスターはI2Cスタートを実行し、指定されたスレーブ・アドレスに読み取りコマンドを送信し、スレーブからcountバイトを 読み取り、I2Cを停止し、確認ビットを返します。確認ビットがACKの場合、転送は成功です。
スレーブ・デバイスからデータを読み取る時、スレーブが確認するデータの唯一のバイトは読み取りコマンドです。
スレーブが読み取りコマンドにNACKを送信するとi2c_transfer_in()関数は直ちにI2C停止を実行し転送が失敗したことを 示すNACKを返します。

i2c_transfer()関数はi2c_transfer_out()関数とi2c_transfer_in()関数の両方を組み合わせたもので、 スレーブ・デバイスへのデータ転送、又は、スレーブ・デバイスとのデータ転送に使用されます。スレーブ・デバイスへのデータ転送に 使用する場合、i2c_transfer_out()関数と同じように機能します。

スレーブ・デバイスとの間でデータを転送する時は、次を使用します:

ack=i2c_transfer(SlaveAddr, wData, wCount, rData, rCount);

上記により、マスターはI2C開始を実行し、指定されたスレーブ・アドレスに書き込みコマンドを送信し、カウント・バイトをスレーブに 送信し、I2Cを再起動し、指定されたスレーブ・アドレスに読み取りコマンドを送信し、スレーブからカウント・バイトを読み取り、 I2Cを停止し確認ビットを返します。確認ビットがACKの場合、転送は成功です。
i2c_transfer_out()とi2c_transfer_in()関数と同様に、スレーブが転送中のバイトのいずれかをNACKした場合、 i2c_transfer()関数はすぐにI2C停止を実行し転送が失敗したことを示すNACKを返します。

i2c_transfer()関数の使用方法を示すいくつかの例についてはCCS Cコンパイラがインストールされている Driversフォルダの241025.cとds1631.cを参照して下さい。241025.cドライバーは1024Kビットのメモリを搭載した Microchip 24XX1025 I2CシリアルEEPROM用で、ds1631.cドライバーはDallas 1631 I2C温度センサーのためのものです。

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に関する更に詳しくはをご覧下さい。


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

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プロダクション・プログラマーが簡単で使い易いUIを備えたタッチスクリーンLCDにアップデート

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コンパイラで使用できます。