PIC18F26K22で作るPICduinoソフトウエア編

製作編)   (シールド編 〔PICの動かせ方入門に戻る〕


前ページで、PICduinoきむ茶工房バージョン(PICduinoSK)を製作しました。
このページでは"PICduinoSK"に載せる基本のソフトウエア部分の記事を記載します。
出来るだけArduinoの関数プログラム記述に沿った関数集にしています。
PIC18F26K22のFlash容量は64KByteですが、PICduinoSKの基本プログラムで約1.5%(984byte)程
使い、SRAMが3896byteの内179byte程消費しています。(但し、XC8 v1.40)

《PICduinoSK基本プログラムについて》

先ずは↓ここから基本プログラムファイルをダウンロードして下さい。
PICduinoSK.zip
PICduinoSK.zip skI2CLCDlib/skI2Clib/skSPIlib/skUARTlibを最新版と入れ替えた *5)

Ver 1.20 tone()関数の不具合修正と周波数値の調整 *2)
Ver 1.30 millis(Timer0)とチャタリング防止機能(Timer2)のTimerを入れ替えた *3)
Ver 1.40 キャプチャ機能のCycleCount()関数を追加 *4)

MPLAB X IDE v4.10
MPLAB(R) XC8 C Compiler Version 1.32/1.40

IDEのフォルダー画面
左はMPLAB X IDEの"Projects"ウインドウ画面です。
ダウンロードしたファイルを解凍後、IDEでプロジェクトの作成
したら、解凍ファイルをプロジェクトフォルダーにコピーして
プロジェクトに左図の様に取り込んで下さい。

"exsample"フォルダーに色々なサンプルファイルが有ります。
"main.c"をプロジェクトから取り外し、、
testしたいサンプルを、"Source File"に取り込んだ後、
”#include "../PICduinoSK.h"”と書き換えればパスが
通るでしょう。

基板側の電源を使っている場合に、PICkit3から電源を供給すると
電源がかち合います注意しましょう。


ダウンロードファイルを解凍すると下記の様なファイル構成です。
 main.c・・・・・・・・・・・・・・ PICduinoSKを使う為の基本雛型メインプログラム
 PICduinoSK.c・・・・・・ PICduinoSK用関数ライブラリソースファイル
 PICduinoSK.h・・・・・・ PICduinoSK用関数のヘッダファイ
 memory.c・・・・・・・・・・・ MEMORY Generated Driver File
 memory.h・・・・・・・・・・・ MEMORY Generated Driver API Header File
 skUARTlib.c・・・・・・・・・ USART通信を行う関数ソースファイル
 skUARTlib.h・・・・・・・・・ USART通信を行う関数のヘッダファイル
 skSPIlib.c・・・・・・・・・・・ SPI通信を行う関数ソースファイル
 skSPIlib.h・・・・・・・・・・・ SPI通信を行う関数のヘッダファイル
 skI2Clib.c・・・・・・・・・・・ I2C通信を行う関数ソースファイル
 skI2Clib.h・・・・・・・・・・・ I2C通信を行う関数のヘッダファイル

”exsample”フォルダーのサンプルプログラムファイル
 Digital.c・・・・・・・・・・ スイッチのON/OFFでLEDを点灯させます
 Analog.c・・・・・・・・・・ 半固定抵抗値を読み、LEDの明るさを可変(PWM)させます
 DAC.c・・・・・・・・・・・・ 半固定抵抗値を読み、LEDの明るさを可変(DAC)させます
 Chattering.c・・・・・・ スイッチのチャタリング防止をソフトで行います *3)
 EEPROM.c・・・・・・・・ EEPROMの読書きを行い、読んだ内容をUSBシリアルに出力します
 I2C-LCD.c・・・・・・・・ I2C接続小型LCDモジュールに表示を行います
 Interrupt.c・・・・・・・・ 外部ピン割込みでLEDを点灯させます
 RandomTone.c・・・・ 乱数でtoneの発生周波数を得て、圧電スピーカーを鳴らします
 Serial.c・・・・・・・・・・・ PCのシリアル端末(TerTerm等)から送られて来たデータに+1して返します
 Serial2.c・・・・・・・・・・ USART2のPGC(TX2)/PGD(RX2)から送受信します
 SPI-7SEG.c・・・・・・・ SPI接続7セグメントLEDシリアルドライバモジュールを表示させます
 SWMCLR.c・・・・・・・・ リセット(MCLR)スイッチを入力として、LEDを点灯させます
 Trace.c・・・・・・・・・・・ シリアル端末(TerTerm等)にデバッグ文を出力し表示させます
 CTMU.c・・・・・・・・・・・ 静電容量式タッチ機能で電極に触れたらLEDを点灯させます
 MoveAve.c・・・・・・・・ 半固定抵抗値を読み、移動平均させた内容をUSBシリアルに出力します
 DataDSP.c・・・・・・・・ 半固定抵抗値を読み、"DataDisplay"に表示させます
 Sleep.c・・・・・・・・・・・ スリープしたら、スイッチ割込みでウエイクアップさせます
 Capture.c・・・・・・・・・ キャプチャ(CCP2)のテストサンプル(周波数の計測) *1)
 Stopwatch.c・・・・・・・ キャプチャ(CCP2)のテストサンプル(ストップウォッチ) *1)

サンプルプログラム”I2C-LCD.c”にてLCDに表示を行う為のファイル
 skI2CLCDlib.c・・・・・・・・・・ I2C接続LCD関数ライブラリソースファイル
 skI2CLCDlib.h・・・・・・・・・・ I2C接続LCD関数ライブラリのヘッダファイル

skI2CLCDlib.c
skI2CLCDlib.h
skI2Clib.c
skI2Clib.h

この内容は”秋月電子I2C接続小型LCDモジュールに表示を行う”を参照下さい。

skUARTlib.c
skUARTlib.h

この内容は”FT232RL使用によりUSBをシリアル変換してマイコンと繋ぎます”を参照下さい。
尚、USARTの受信バッファサイズは32byteとしています。

skSPIlib.c
skSPIlib.h

この内容は”マスターにSPIデバイスを複数個接続して見ます”を参照下さい。

memory.c
memory.h

この内容は”MCC(MPLAB Code Configurator)を操作して見る(Memory編)”を参照下さい。

《PICduinoSK用関数説明》

PICduinoSK.h

PICduinoSK用関数のヘッダファイルです。
#include "PICduinoSK.h" メインをプログラムの先頭で記述して下さい。

以下の様に記述されている場所が有ります。
//#define SHIELD_USE_TRACE           // トレース出力利用する場合は、この行を生かします
//#define SHIELD_USE_SWMCLR          // MCLR(REST)をスイッチで利用する場合は、この行を生かします
//#define SHIELD_USE_USART_RECEIVE   // シリアル(USART)で受信する場合は、この行を生かす
//#define SHIELD_USE_I2C             // I2Cを利用する場合は、この行を生かす
//#define SHIELD_USE_SPI             // SPIを利用する場合は、この行を生かす
//#define SHIELD_USE_DAC             // DACモジュールを利用する場合は、この行を生かします
//#define SHIELD_USE_SW_CHATTERING   // チャタリング防止機能を利用する場合は、この行を生かす
//#define SHIELD_USE_TONE            // tone関数を利用する場合は、この行を生かします
//#define SHIELD_USE_EXTINT          // 外部ピン割込み機能を利用する場合は、この行を生かします
//#define SHIELD_USE_PWM             // アナログ(PWM)出力機能を利用する場合は、この行を生かします
//#define SHIELD_USE_CTMU            // 静電容量式タッチ機能を利用する場合は、この行を生かします
//#define SHIELD_USE_CAPTURE         // キャプチャ機能を利用する場合は、この行を生かします *1)
//#define SHIELD_USE_HI_CAPTURE      // HIキャプチャ機能を利用する場合は、この行を生かします *4)
これはPICduinoSK関連の各種モジュール(関数)機能をインプリメント出来る様にする為に有ります。
ですのでぇコメントに書いて有る機能を利用する場合は必ずコメントを外して下さい。
尚、使用しない機能は出来るだけコメントにしましょう、プログラム容量を減らす為に効果が有ります。
又、それぞれの使い方は、"exsample"フォルダーのサンプルプログラムを見て下さい。

PICduinoSK.c

PICduinoSKのCPUクロックは32MHz(内蔵)で作成しています。

millis関数でタイマ−2を使っているのでTimer2は利用出来ません。 *3)
tone関数を利用する場合は、Timer5は利用出来ません。
アナログ(PWM)出力機能を利用する場合は、、Timer6は利用出来ません。
チャタリング防止機能を利用する場合は、Timer0は利用出来ません。 *3)
キャプチャ機能を利用する場合は、Timer1は利用出来ません。 *1)
残りのTimer3(16ビット)とTimer4(8ビット)は使用していないので自由に利用出来ます。

現在用意されている関数機能は以下です。
*    PICduinoInter   - PICduinoSKを使用する時の割込み処理                      *
*    PICduinoBegin   - PICduinoSKを使う場合の初期化処理                        *

EEPROM関連 * EEPROMread - EEPROMから読み出す処理 * * EEPROMwrite - EEPROMの指定アドレスに書き込む処理 *
外部ピン割り込み関連 * GoSleep - スリープモードに入る処理 * * WakePinSetup - スリープから目覚める為の外部割込みピン設定処理 * * attachInterrupt - 外部割込み発生時の実行する関数を指定する処理 * * detachInterrupt - 指定した割り込みを停止させる処理 *
スイッチチャタリング関連 * InterSWscan - スイッチ状態の読込みを行う為の割込み処理 * *3) * SWscanBegin - スイッチのチャタリング除去読込みを行う為の初期化処理 * *3) * SWscanRead - スイッチのON/OFFを調べる時に使用する処理 *
デジタルピン関連 * pinPullUP - デジタルピンに内部プルアップを行う処理 * * pinMode - デジタルピンの入出力を指定する処理 * * digitalWrite - 指定のピンにデジタル出力を行う処理 * * digitalRead - 指定のピンからデジタル入力を行う処理 *
アナログ関連 * analogSet - アナログ入力(A/D)の設定を行う処理 * * analogReference - アナログ入力時のリファレンス電圧設定を行う処理 * * analogRead - アナログ入力(A/D)の読込み行う処理 * * analogWrite - アナログ(PWM)の出力行う処理 * * analogFrequency - アナログ(PWM)の出力周波数を設定する処理 * *1)
DAC関連 * DACReference - DAC出力時のリファレンス電圧設定を行う処理 * * DACWrite - アナログ(DAC)の出力行う処理 *
その他の出力 * tone - 指定した周波数の矩形波を生成させる処理 * *2)
キャプチャ機能関連 * CycleCount - パルスの周波数を計測する処理 * *4) * PulseCount - パルスの長さを計測する処理 * *1) * StopwatchStart - ストップウォッチ機能の計測を開始する処理 * *1) * StopwatchCount - ストップウォッチ機能の計測終了を待つ処理 * *1)
静電容量式タッチ関連 * CTMUBegin - CTMUに接続されている電極の初期値を読み込む処理 * * CTMU_ScanRobe - CTMUに接続されている電極の現在値を読み込む処理 * * CTMU_ReadRob - CTMUに接続されている電極の電圧値を読み取る処理 * * CTMU_StateRobe - CTMUに接続されている電極の状態を調べる処理 *
シリアル(USART1)関連 * SerialBegin - UART1(TX1/RX1)通信の初期化を行う処理 * * SerialPrint - 文字列を送信(改行無し)する処理 * * SerialPrintln - 文字列を送信(改行有り)する処理 * * SerialAvailable - シリアル通信(USART1)で受信したデータの個数を返す処理 * * SerialRead - シリアル通信(USART1)で受信したデータを1byte読込む処理 * * SerialWrite - シリアル通信(USART1)で相手に1byteのデータを送信する処理 *
デバッグトレース関連 * TraceBegin - デバッグ用にトレース機能の初期化を行う処理 * * SerialTrace - デバッグ用にシリアルへ出力する処理 *
シリアル(USART2)関連 * Serial2Begin - USART2(TX2/RX2)通信の初期化を行う処理 * * Serial2Available- シリアル通信(USART2)で受信したデータの個数を返す処理 * * Serial2Read - シリアル通信(USART2)で受信したデータを1byte読込む処理 * * Serial2Write - シリアル通信(USART2)で相手に1byteのデータを送信する処理 * * Serial2Print - シリアル通信(USART2)で文字列を送信する処理 *
SPI関連 * SPIBegin - SPI通信の初期化を行う処理 * * SPIPullUP - SPI通信ラインに内部プルアップを行う処理 *
I2C関連 * I2CBegin - I2C通信の初期化を行う処理 *
時間に関する関数 * Wait - 時間待ちの処理を行う * * usTOctimer - マイクロ秒を経過時間の文字列に変換する処理 * *1) * millis - プログラム実行を開始した時から現在までの時間をms単位で返す処理 * *3)
ビット操作 * bitRead - 指定した数値から、指定した位置のビットを読み取る処理 * * bitSet - 指定した数値の、指定した位置のビットをセットする処理 * * bitClear - 指定した数値の、指定した位置のビットをクリアする処理 *
その他の関数 * random - 疑似乱数を発生させる処理 * * dtostrf - 浮動小数値を文字列に変換する処理 * * map - ある数値から他の数値へレベル変換を行う処理 * * constrain - 指定の数値を、指定した範囲のなかに収める処理 * * FLT_MoveAve - 移動平均の処理を行う * * DataDisplay - ADCから読込んだデータを"DataDisplay"用のデータに変換 *
良く使いそうな標準の関数 * itoa - ある整数値を文字列(HEX/DEC/OCT/BIN)に変換する関数 * * round - 小数点以下を四捨五入する関数 *

(基本メインプログラム記述)

下記がPICDuinoSKを利用する場合の基本記述となります。
Arduinoと同じ記述方法です。
#include <xc.h>
#include "PICduinoSK.h"

// 初期値設定を行う関数
void setup(void)
{

}
// メインの処理を行う関数
void loop(void)
{

}
interrupt PICduinoInter()
 PICduinoSKを使用する時の割込み処理
 御自分で割込み処理を追加する場合は、この関数に追加して下さい。

 ※ 割込みレベル”高い””低い”と割込み順位(priority)が有りますので、割込み処理を追加する場合は、
   "IPR1-5レジスタ"で必ずpriorityを設定して下さい。

void PICduinoBegin()
 PICduinoSKを使う場合の初期化処理
 システムクロックは32MHz、アナログ無、デジタル出力で初期化しています。

(EEPROM関連)

MPLAB X IDEのMCCで出力(Generate)した、"memory.c/memory.h"をそのまま利用しています。
PIC18F26K22の場合、EEPROMは1024バイトです。
又、この機能を使ったサンプルプログラムは"exsample\EEPROM.c"を参考にして下さい。

ans = EEPROMread(add)
 EEPROMから読み出す処理
 uint16_t  add:読み出すデータのアドレス(0-1023)位置を指定
 uint8_t    ans:読み出したデータ1byteを返します

void EEPROMwrite(add,dt)
 EEPROMの指定アドレスに書き込む処理
 uint16_t  add:データの書き込むアドレス(0-1023)位置を指定
 uint8_t      dt:書き込むデータ内容をセットします

 ※ EEPROMの機能を利用すると意外とプログラム容量を消費します。

(外部ピン割り込み関連)

外部ピンのD2(INT2)/D3(INT3)とD10(INT10)/D12(INT12)/D13(INT13)からの割り込み入力機能を
提供します。
但し、D2(INT2)とD3(INT3)は何方か一方しか使用出来ないしぃ
D12(INT12)/D13(INT13)を利用するとぉ SPI機能が使用出来ません。
D12/D13よりD2/D3/D10の割り込みの方が割り込み優先順位は”高い”です。
この機能を使用する場合は、"PICduinoSK.h"に記述している"#define SHIELD_USE_EXTINT"の
コメントを外します。
又、この機能を使ったサンプルプログラムは"exsample\Interrupt.c"を参考にして下さい。

void attachInterrupt(pin,func,mode)
 外部割込み発生時の実行する関数を指定する処理
 割り込みが発生すると指定の関数(func)を実行するので、関数の記述を必ず行って下さい

 uint8_t       pin:割り込みを行う割込みピンを指定
          (INT_D2PIN/INT_D3PIN/INT_D10PIN/INT_D12PIN/INT_D13PIN)
 void  (*func)():割り込み発生時に呼び出す関数を指定
 uint8_t   mode:割り込みする場合のピンのエッジをを指定
           RISING  = ピンの状態がLOWからHIGHに変わったときに発生
           FALLING = ピンの状態がHIGHからLOWに変わったときに発生
           この指定は、INT10/12/13のみ効果有りです。
           INT2/3は0を指定する事、両エッジ(LOW/HIGH)で割込みが発生します。

void detachInterrupt(pin)
 指定した割り込みを停止させる処理
 停止した割り込みピンはデジタル出力ピンに戻ります。

 uint8_t       pin:停止したい割り込みの割込み番号を指定
          (INT_D2PIN/INT_D3PIN/INT_D10PIN/INT_D12PIN/INT_D13PIN)

void GoSleep(void)
 スリープモードに入る処理

void WakePinSetup(pin,mode)
 スリープから目覚める為の外部割込みピン設定処理
 ウエイクアップ用の外部割込みピンは、D2:INT2/D3:INT3とD10:INT10とします。

 uint8_t       pin:割り込みを行う割込みピンを指定(WAKE_D2PIN/WAKE_D3PIN/WAKE_D10PIN)
 uint8_t   mode:割り込みする場合のピンのエッジをを指定
          RISING  = ピンの状態がLOWからHIGHに変わったときに発生
          FALLING = ピンの状態がHIGHからLOWに変わったときに発生
          この指定は、INT10/12/13のみ効果有りです。
          INT2/3は0を指定する事、最初のエッジ(LOW/HIGH)で割込みが発生します。

 ※ スリープからは、全ての外部割込みやスリープ中も動作可能な周辺機能による割込みで
   ウエイクアップしますが、スリープ中の周辺機能等の動作はデータシートの各項目を見て下さい。
 ※ 外部割込みピンでウエイクアップした際に何か処理をさせたい場合は、"attachInterrupt( )"を
   使用して下さい。
 ※ スリープ機能を使ったサンプルプログラムは"exsample\Sleep.c"を参考にして下さい。

(スイッチチャタリング関連)

通常スイッチを接続するとチャタリングが発生します、これをソフトで防止する為の機能を提供します。
スイッチはPORTBの、D2(RB4)/D3(RB5)/D10(RB0)/D11(RB3)/D12(RB2)/D13(RB1)のみ取付け
可能です、他のポートにプログラム書換え出来るが、PORTBは内部でプルアップ出来るのでお勧めです。
尚、ハードでチャタリング除去を行いたい場合はこちらを参考にして下さい。

"PICduinoSK.h"に
#define SW_COUNTER 3     // スイッチ状態の一致は3回調べる
と有ります、これは10ms毎に3回スイッチの状態を見て、同じ状態(LOW or HIGH)が3回続いたら
その状態を採用するとしていますので、スイッチが押されてから10msx3=30ms以上は反応が遅れる事に
なりますが、まだチャタリングしている様なら3回を増やしましょう。 *3)

この機能を使用する場合は、
"PICduinoSK.h"に記述している"#define SHIELD_USE_SW_CHATTERING"のコメントを外します。
又、この機能を使ったサンプルプログラムは"exsample\Chattering.c"を参考にして下さい。

void InterSWscan(void)
 スイッチ状態の読込みを行う為の割込み処理
 タイマ−0の割り込みから10ms毎にコールされる割り込み処理でスイッチの状態を調べます。 *3)
 この関数は、"PICduinoInter()"の割り込み処理内に記述されています、呼び出す必要は有りません

void SWscanBegin(swinf)
 スイッチのチャタリング除去読込みを行う為の初期化処理
 システムクロック32MHzでの初期化でタイマー0の機能を利用しています。 *3)

 uint8_t   swinf:スイッチを接続しているピンの場所を指定(接続ポートはSW_PINによる)
          "SW_PIN"は"#define SW_PIN PORTB"と宣言しているので、
          D2(RB4)とD3(RB5)に接続しているなら、
          "SWscanBegin( SW_D2PIN | SW_D3PIN )"と定義名をORで指定します。

          (D2:SW_D2PIN/D3:SW_D3PIN/D10:SW_D10PIN/D11:SW_D11PIN/
           D12:SW_D12PIN/D13:SW_D13PIN)

void SWscanRead(value)
 スイッチのON/OFF状態を調べる時に使用する処理

 char   value:調べたいピンの位置(ポートのビット位置)を指定する
        D2(RB4)を調べる場合は、"SWscanRead(SW_D2IN)"とします。
        (D2:SW_D2IN/D3:SW_D3IN/D10:SW_D10IN/D11:SW_D11IN/
         D12:SW_D12IN/D13:SW_D13IN)

(デジタルピン関連)

デジタルピンからの入出力を行う機能です。
尚、RA6(OSC2)/RA7(OSC1)も利用できるが無配線です、御自分で追加しましょう。
又、この機能を使ったサンプルプログラムは"exsample\Digital.c"を参考にして下さい。

MCLRのリセットスイッチをデジタル入力ピンで使用出来ます、
MCLR(RE3)は入力専用なので"pinMode()"は必要無いです、"digitalRead(MCLRIN)"のみです。
この機能を利用する場合は、PICduinoSK.h"に記述している"#define SHIELD_USE_SWMCLR"の
コメントを外します。
又、この機能を使ったサンプルプログラムは"exsample\SWMCLR.c"を参考にして下さい。

void pinPullUP(value)
 デジタルピンに内部プルアップを行う処理
 プルアップ出来るピンは、D2:RB4/D3:RB5/D10:RB0/D11:RB3/D12:RB2/D13:RB1のみです。

 uint8_t value:プルアップを行うピンの指示をします
         (PULLUP_D2PIN/PULLUP_D3PIN/
          PULLUP_D10PIN/PULLUP_D11PIN/PULLUP_D12PIN/PULLUP_D13PIN)

 例)D2/D11ピンをプルアップする場合
   pinPullUP( PULLUP_D2PIN | PULLUP_D11PIN ) ;  // 各定義名をORします

void pinMode(pin, mode)
 デジタルピンの入出力を指定する処理
 起動時はデジタル出力がデフォルト状態です。

 unsigned pin:入出力するピンを指定(DxxPIN:xx=0/1/2/3/4/5/6/7/8/9/10/11/12/13)
 char     mode:INPUT=入力 OUTPUT=出力

 ※ アナログピンも指定出来ます。
    (AN0:D14PIN/AN1:D15PIN/AN2:D16PIN/AN3:D17PIN/AN4:D18PIN/AN5:D19PIN)
   例 pinMode(D14PIN,OUTPUT) ; // 入出力指定可能です
 ※ PICkit3を挿すピンのPGC/PGDも指定出来ます。
   例 pinMode(PGCPIN,OUTPUT);

ans = digitalRead(pin)
 指定のピンからデジタル入力を行う処理

 unsigned pin:入力するピンを指定(DxxIN/PGCIN/PGDIN/MCLRIN)
 unsigned ans:読み込んだ値の0か1を返します

 例)D3から読み込む場合
   pinMode(D3PIN,INPUT) ;
   ans = digitalRead(D3IN) ;

void digitalWrite(pin,value)
 指定のピンにデジタル出力を行う処理

 unsigned    pin:出力するピンを指定(DxxOUT/PGCOUT/PGDOUT)
 unsigned value:出力する値を0(LOW)か1(HIGH)で指定します

 例)D2に1(HIGH)を出力する場合
   pinMode(D2PIN,OUTPUT) ;
   digitalWrite(D2OUT,HIGH) ;

(アナログ関連)

アナログピンからアナログ値10Bit(0-1023)を読み取る機能です。
又、この機能を使ったサンプルプログラムは"exsample\Analog.c"を参考にして下さい。

void analogSet(void)
 アナログ入力(A/D)の設定を行う処理
 デフォルトのリファレンスは、VDD/VSSです。
 この関数は、"PICduinoBegin()"の初期化処理内に記述されています、呼び出す必要は有りません

void analogReference(type)
 アナログ入力時のリファレンス電圧設定を行う処理
 この関数の基準電圧選択は、DACReference関数に影響します。

 uint8_t type:リファレンス電圧の選択を行います
         AREF_DEFAULT = 内部の電源電圧(VDD)を使用する(デフォルト)
         AREF_EXTERNAL = 外部ピン(AREF)の電圧を使用する
         AREF_INTERNAL1X = 内部の基準電圧(FVR:1.024V)を使用する
         AREF_INTERNAL2X = 内部の基準電圧(FVR:2.048V)を使用する
         AREF_INTERNAL3X = 内部の基準電圧(FVR:4.096)を使用する

ans = analogRead(ch)
 アナログ入力(A/D)の読込み行う処理

 uint8_t     ch:アナログ入力を行うピンを指定(A0PIN/A1PIN/A2PIN/A3PIN/A4PIN/A5PIN)
 uint16_t ans:読み込んだ値(10ビット)を返します

 例)A5から読み込む場合
   ans = analogRead(A5PIN) ;

void analogWrite(pin,value)
 アナログ(PWM)の出力行う処理
 タイマー6機能で2KHzのPWM周期で出力されます。
 (CPU32MHzでは2KHz以下の周期は無理です、MAX4MHzまでなら作れると思いますがぁ)

 PWM5(D5)とPWM11(D11)は何方かのみ出力可でデフォルトはPWM(D5)です。
 PWM11(D11)を使う場合は、"PICduinoSK.h"の"#pragma config CCP2MX=PORTB3"をを生かし、
 ”#pragma config CCP2MX=PORTC1”をコメントにします。

 uint8_t       pin:PWM出力するピンを指定
          (PWM_D3OUT:D3/PWM_D5OUT:D5/PWM_D6OUT:D6/PWM_D9OUT:D9/
           PWM_D10OUT:D10/PWM_D11OUT:D11)
 uint16_t value:出力する値を指定(デューティ値:0-1023)
          (1023/2がデュティ比50%では有りません、その辺はデータシートを見ましょう。)

 例)D3(PWM3)ピンから出力する場合
   analogWrite(PWM_D3OUT,512) ;

 ※ analogWriteの場合は、"PICduinoSK.h"に記述している"#define SHIELD_USE_PWM"の
   コメントを外します。

ans = analogFrequency(frequency)  *1)
 アナログ(PWM)の出力周波数を設定する処理
 PWMはTimer6を使っているのでTimer6に対する設定となります。

 long frequency:設定する周波数(Hz)を指定(2000-2000000Hz程)
          指定した周波数が発生するわけではないです、出したければ調整が必要です。
 int              ans:-1=設定不可能な周波数ですよ
          それ以外の値は、指定周波数に対する約100%のデュティ比値を返します。
          (周波数が高くなってくると、約90%とかズレて来ます悪しからず)
 例)
     d = analogFrequency(100000) ;     // 100KHzのPWMを作る
     if (d != -1) {
          analogWrite(PWM_D3OUT,d/2) ; // D3からデュティ比 50%のアナログ出力を行う
     }

(DAC関連)

A0/AREFピンからDACを出力(アナログ値を32段階の電圧レベルにて)する事が出来ます。
但し、電流駆動能力が弱々しいのでバッファを通す様にする必要が有ります
尚、DAC関連の記事はこちらを参考にして下さい。
DAC機能を使用する場合は、"PICduinoSK.h"に記述している"#define SHIELD_USE_DAC"の
コメントを外します。
又、この機能を使ったサンプルプログラムは"exsample\DAC.c"を参考にして下さい。

void DACReference(type)
 DAC出力時のリファレンス電圧設定を行う処理
 この関数の基準電圧選択は、analogReference関数に影響します。

 uint8_t type:リファレンス電圧の選択を行います
         AREF_DEFAULT = 内部の電源電圧(VDD)を使用する(デフォルト)
         AREF_INTERNAL1X = 内部の基準電圧(FVR:1.024V)を使用する
         AREF_INTERNAL2X = 内部の基準電圧(FVR:2.048V)を使用する
         AREF_INTERNAL3X = 内部の基準電圧(FVR:4.096)を使用する

void DACWrite(value)
 アナログ電圧(DAC)の出力を行う処理

 uint16_t value:出力する値を指定(0-31)
 出力電圧 = ((VSOURCE+) - (VSOURCE-))*(VREFCON2/(2^5)) + VSOURCE-
 VSOURCE+ = 5V VSOURCE- = 0V value = 13 ならば 5V*(13/2^5)=2.03125V

 例)可変抵抗値(0-1023)を32分割の電圧レベル値でDAC出力する場合
   ans = analogRead(A5PIN) ;
   DACWrite(map(ans,0,1023,0,31)) ;

(その他の出力)

void tone(frequency,duration)
 指定した周波数の矩形波を生成させる処理
 この関数はdurationの時間が終了するまでは関数を実行したままです、注意しましょう
 出力ピンの指定は、"PICduinoSK.h"の"TONE_PIN"で行います。(1ピンのみ出力可)
 #define TONE_PIN D3OUT=~D3IN // 出力するピンを指定します、デジタル3番ピンの場合です
 尚、tone関数を使用しなければタイマー5機能を利用出来ます。
 この機能を使用する場合は、"PICduinoSK.h"に記述している"#define SHIELD_USE_TONE"の
 コメントを外します。
 又、この機能を使ったサンプルプログラムは"exsample\RandomTone.c"を参考にして下さい。

 long      frequency:出力する周波数(Hz)を指定(8-20000Hz) *2)
 uint16_t  duration:出力する時間をミリ秒で指定

 例)D3ピンから262Hzを300msの間だけ出力する場合
   pinMode(D3PIN,OUTPUT)) ;
   tone(262,300) ;

 ※ テスターで周波数を見てみた、31Hz指定で30.99Hz-33.88Hzが表示され、
   262Hz指定で261.4Hz-262.8Hzが表示され、10KHzで9.825KHz-9.866KHzが表示されました。
   なのでぇ、このtone()でメロディーを奏でるとぉ、音痴です。(^▽^)

(キャプチャ機能関連) *1)

PICのCCP(Capture/Compare/PWM Modules)モジュールで"Capture"を使ってパルスを計測する
機能を提供します。

"Capture"は全てのCCP1/2/3/4/5で使用出来ますが、この関数ではCCP2(D5ピン)のみ利用出来ます
尚、D5ピンがデフォルトで、D11ピンに切り替え可能で"PICduinoSK.h"の”#pragma config CCP2MX=PORTB3” を生かし、”#pragma config CCP2MX=PORTC1”をコメントにします。
又、"Capture"はTimer1/3/5から選択出来ますが、この関数ではタイマー1を利用しています。

なのでぇ、このキャプチャ機能を使う場合は、Timer1とCCP2(PWM5orPWM11)のアナログ出力が
利用出来ないと言う事になります。
キャプチャ機能の詳しい話についての記事はこちらを参考にして下さい。

以下の関数を使用する場合は、"PICduinoSK.h"に記述している"#define SHIELD_USE_HI_CAPTURE"の
コメントを外します。
ans = CycleCount(timeout)  *4)
 パルスの周波数を計測する処理
 PulseCount()関数は25KHz位しか測定出来ないのでもう少し高い周波数まで測定出来る様にしました。
 PulseCount()関数のTimer1は1カウント1usですが、この関数は125ns(最小)で設定しています。
 又、キャプチャ設定を"立ち上げ16回カウントでイベント発生"にしたので、16で割った平均値周波数を
 計測する事になります。

 uint16_t timeout:指定した時間(ms)の範囲内で計測する
 long               ans:計測したパルスの周波数(Hz)を返す(-1を返した場合はタイムオーバー)
           2Hz〜100KHz位まで、それ以上は誤差が大きくなる(500KHz位までは測定可)

以下の関数を使用する場合は、"PICduinoSK.h"に記述している"#define SHIELD_USE_CAPTURE"の
コメントを外します。
ans = PulseCount(edge1,edge2,timeout)
 パルスの長さを計測する処理
 開始したらパルスエッジのイベント発生(2回目のエッジ)を待ちます、
 なのでぇ、終了するまでは実行中ですので長いパルスは避けた方が良さげぇみたいなぁかんじぃ。
 (エッジ間はMIN40us(MAX25KHz)程でそれより短くなると何んじゃかぁあやしくなってくるんじゃよ)

 char          edge1:計測するパルスの開始トリガーを指定します(0=LOW 1=HIGH)
 char          edge2:計測するパルスの終了トリガーを指定します(0=LOW 1=HIGH)
 uint16_t timeout:指定した時間(ms)の範囲内で計測する
 long               ans:計測したパルスの長さ(us)を返す(-1を返した場合はタイムオーバー)
  例)           ┌──┐        ┌──┐
            ──┘  └────┘  └─
  PulseCount(HIGH,LOW,3) ↑  ↑
  PulseCount(HIGH,HIGH,3) ↑       ↑
 ※ Arduinoの関数では"pulseIn()"と同じ様な機能です。
 ※ このPulseCountを使ったサンプルプログラムは"exsample\Capture.c"を参考にして下さい。

void StopwatchStart(edge1,edge2)
 ストップウォッチ機能の計測を開始する処理
 開始したらパルスエッジの割り込み待ち状態となります。

 char edge1:計測するパルスの開始トリガーを指定します(0=LOW 1=HIGH)
 char edge2:計測するパルスの終了トリガーを指定します(0=LOW 1=HIGH)

ans = StopwatchCount(void)
 ストップウォッチ機能の計測終了を待つ処理
 "PulseCount()"関数は終了イベントまで待つ処理でしたが、その他の処理をPICに仕事させる場合は
 "PulseCount()"は使えません、そこでこの関数が存在します。
 なのでこの関数は、ループ処理内に置き常に実行させないとダメです
 この関数は、パルスの終了エッジを待ちます、それまでは0を返し、
 終了すれば計測したパルスの長さをus時間で返します。

 long ans:0=まだ計測中 それ以外は計測したパルスの長さ(us)を返す(MAX約71分程)
    例)
    void main()
    {
          char buf[16];
          long c ;

          StopwatchStart(HIGH.HIGH) ;

          while(1) {
               c = StopwatchCount() ;
               if (c != 0) {
                    sprintf(buf,"%ldus",c) ;
               }
          }
    }
 ※ StopwatchCountを使ったサンプルプログラムは"exsample\Stopwatch.c"を参考にして下さい。

(静電容量式タッチ関連)

CTMU(充電時間計測ユニット)を利用したタッチセンシング機能を提供します。
電極を接続出来るタッチピンはD2/D3/D7/D8/D9/D10の6ピンのみです。
タッチピンは、アナログピンで有れば他のピンも利用出来ますが、その場合は御自分で変更しましょう。
尚、この機能は接続する電極や環境等によりセンス反応等を微調整する必要が有るでしょう。
調整項目は、"PICduinoSK.h"に記述している
#define CTMU_55UA           0b11         // 電極に充電する電流は、55uA
#define CTMU_5_5UA          0b10         // 電極に充電する電流は、5.5uA
#define CTMU_0_55UA         0b01         // 電極に充電する電流は、0.55uA
#define CTMU_CHARG_CURRENT  CTMU_5_5UA   // 電極に充電する電流設定値
#define CTMU_CURRENT_ADJUST 0b000000     // 電流調整値(62%増:+0x1F 〜0〜-0x3F:62%減)
#define CTMU_THRESHOLD      0.93         // 電極に触れたと判断する閾値
#define CTMU_DISCHARGE_Time()  __delay_us(400)    // 放電させる時間
#define CTMU_CHARGE_Time()     __delay_us(30)     // 充電させる時間
この項目の詳しい調整方法やCTMUの基礎についての記事はこちらを参考にして下さい。
この機能を使用する場合は、"PICduinoSK.h"に記述している"#define SHIELD_USE_CTMU"の
コメントを外します。
又、この機能を使ったサンプルプログラムは"exsample\CTMU.c"を参考にして下さい。

void CTMUBegin(value)
 CTMUに接続されている電極の初期値を読み込む処理
 指定されたピンの設定を行い、そのピンに接続された電極の初期値を読み込みます。

 uint16_t value:電極を接続したピンを指定
    (CTMU_D2PIN/CTMU_D3PIN/CTMU_D7PIN/CTMU_D8PIN/CTMU_D9PIN/CTMU_D10PIN)

 例)D2/D10ピンに電極を接続する場合
   CTMUBegin( CTMU_D2PIN | CTMU_D10PIN ) ;  // 各定義名をORします

void CTMU_ScanRobe(void)
 CTMUに接続されている電極の現在値を定周期で読み込む処理
 この関数は、"main()"の関数処理内に記述されています、呼び出す必要は有りません

ans = CTMU_ReadRobe(ch)
 CTMUに接続されている電極の電圧値を読み取る処理
 この関数で、電極(静電容量)に対して放電と充電が行われその電圧値を読み込みます。
 但し、返す値は"CTMU_AVERAGE_NUMBER"回の平均値です。

 int   ch:アナログ変換を行うチャンネル番号を指定
 int ans:電極の電圧値を返す

 例)調整等により電極の電圧値を表示させたい場合
  setup() {
       SerialBegin(9600) ;
       CTMUBegin(CTMU_D2PIN) ;
  }
  loop() {
       int cap ;
       char buf[12] ;

       // D2接続の電極の電圧値を読む
       cap = CTMU_ReadRobe(CTMU_D2IN) ;
       // シリアル出力を行う
       sprintf(buf,"%d",cap) ;
       SerialPrintln(buf) ;
       Wait(30) ;
  }
ans = CTMU_StateRobe(pin)
 CTMUに接続されている電極の状態を調べる処理

 int pin: 調べる電極のピンを指定
      (CTMU_D2IN/CTMU_D3IN/CTMU_D7IN/CTMU_D8IN/CTMU_D9IN/CTMU_D10IN)
 int ans:電極の状態を返す(0=触れていない 1=触れている -1=ピン指定エラー)
 例)
     ans = CTMU_StateRobe(CTMU_D10IN) ;
     if (ans == 1) digitalWrite(D3OUT,HIGH) ;     // D3をON(電極にタッチしたら)
     else          digitalWrite(D3OUT,LOW) ;      // D3をOFF

(シリアル(USART1)関連)

USBにてPCのシリアル端末(TeraTerm等)とシリアル通信の送受信を行う機能を提供します。
D0(RX)/D1(TX)ピンからも送受信を行う事が出来ますが、USBにて送受信を行っている際は
D0/D1ピンでデジタルピンとして使用出来ません。

もし、シリアル通信で受信機能を使用しない場合は、"PICduinoSK.h"に記述している
"#define SHIELD_USE_USART_RECEIVE"行をコメントにすればプログラム容量が少なくなります。
又、この機能を使ったサンプルプログラムは"exsample\Serial.c"を参考にして下さい。

void SerialBegin(speed)
 シリアル通信UART1(TX1/RX1)の初期化を行う処理

 long speed:通信速度を指定(4800,9600,10417,19200,57600,115200)

void SerialPrint(*dt)
 文字列を送信する処理
 改行コードは送りません。

 const char *dt:送信するデータを格納した配列を指定します

void SerialPrintln(*dt)
 文字列を送信する処理
 改行コード(\r\n)を送信します。

 const char *dt:送信するデータを格納した配列を指定します

 ※ Arduinoの様に"SerialPrint(x,HEX)"とか記述出来ません、欲しい人は御自分で作成しましょう。
   尚、"sprintf(buf,"%x",x)"とかで出来るのでぇ良かろう。
   又、標準関数のitoa(buf,value,HEX)とかでも変換出来ます。
   (単純に変換するだけなら"itoa"を使いましょう、"sprintf"はプログラメモリを消費しすぎます。)
   例)char buf[12] ;
     SerialPrintln(itoa(buf,64,HEX)) ;
     sprintf(buf,"%x",64) ;
     SerialPrintln(buf) ;
 ※ sprintfのフォーマット指定子(%dとか)一覧は、"若葉プログラミング塾"さんのこちらを見ましょう。
 ※ エスケープシーケンスに付いては、こちらこちらを見ましょう、もっとぉ詳しくはこちらです。
   エスケープシーケンスを利用すると、文字に色を付けたり等の画面制御が出来たりします。
   但し、シリアル端末(TerTerm等)に限ります、"ArduinoIDE"のシリアルモニタはダメです。
   例)Serialprintln("\x1b[31mIt is a red character") ; // 赤色文字です
     Serialprintln("\x1b[1mBold letters") ; // 太文字です
     Serialprint("I will break the line\r\n") ; // 改行します

ans = SerialRead(void)
 シリアル通信(USART1)で受信したデータを1バイト読込む処理

 unsigned int ans:読み込んだデータを返します
           0xffffを返したら受信データは空です。

 ※ 受信バッファは32byteです、処理が追いつかなそうであれば増やせます、
   "skUARTlib.h"の"#define UART_BUFFER_SIZE"を変更しましょう。

void SerialWrite(dt)
 シリアル通信(USART1)で相手に1バイトのデータを送信する処理

 char dt:送信するデータを指定します

ans = SerialAvailable(void)
 シリアル通信(USART1)で受信したデータの個数を返す処理

 int ans:受信していないなら0を返します

(デバッグトレース関連)

現在はシリアル通信で出力しているだけですがぁ、将来的にはファイルに記録したり出来る様な事を
考えていますがぁ....
デバッグを行っているとぉあちらこちらに"print"文を入れたり外したり、
終了したらコメントにしたり消したり、またぁ"print"文挿入したり....でぇたいへん。
#ifdef SHIELD_USE_TRACE
#define TraceBegin(dt) SerialBegin(dt)
#define SerialTrace(s) SerialPrintln(s)
#else
#define TraceBegin(dt) NOP()
#define SerialTrace(s) NOP()
#endif
こんなのを記述しているので"SHIELD_USE_TRACE"をコメントにするだけで"NOP()"行になるのでぇ
便利かもぉ...な機能ですぅ。 ....たぶん。
又、この機能を使ったサンプルプログラムは"exsample\Trace.c"を参考にして下さい。

(シリアル(USART2)関連)

この機能は、PICKit3を挿すコネクタピンのPGC(TX2)/PGD(RX2)ピンからUSART2シリアル通信を
送受信できる様にした機能です。
この機能を利用するには、"skUARTlib.h"の"#define UART2_USE"を生かします。
だからぁ、どちらかぁ、なのでぇ、USART1のD0/D1 or USBは使えなくなります。
(D0/D1はデジタルピンとしては利用出来ます。)

関数は"SerialBegin"等に"Serial2Begin"という感じで""を付けるだけで後はUSART1の場合と
同じなので関数説明は省きます。

又、この機能を使ったサンプルプログラムは"exsample\Serial2.c"を参考にして下さい。

(SPI関連)

この機能は、SPI通信を行う為の手段を提供します。
このSPI機能はマスターのみ対応です、スレーブは御自分で作成しましょう。
SPIの基礎についての記事はこちらを参考にして下さい。
尚、SPI関連の関数説明はこちらを参考にして下さい。
SPI機能を使用する場合は、"PICduinoSK.h"に記述している"#define SHIELD_USE_SPI"の
コメントを外します。
又、この機能を使ったサンプルプログラムは"exsample\SPI-7SEG.c"を参考にして下さい。

SPI関連のピンは、D13/SCK(SCK2)とD12/MISO(SDI2)とD11/MOSI(SDO2)で、
スレーブデバイスの選択信号SSは好きなデジタルI/Oに割り付けても構いません。
D10(SS2)はPICがスレーブになる時に使用する物なので、マスター時は関係なくD10はデジタルで使用出来ます。

void SPIBegin(mode,divider)
 SPI通信の初期化を行う処理
 "SPI_Init()"関数ではなくここの"SPIBegin()"を使って下さい。

 char mode:SPIの転送モードを設定(クロック極性とクロック位相の組合せ)
        SPI_MODE1 = 極性(0:LOW) 位相(0:アイドル0Vで、0V->5Vに変化で転送)
        SPI_MODE0 = 極性(0:LOW) 位相(1:アイドル0Vで、5V->0Vに変化で転送)
        SPI_MODE3 = 極性(1:HIGH) 位相(0:アイドル5Vで、5V->0Vに変化で転送)
        SPI_MODE2 = 極性(1:HIGH) 位相(1:アイドル5Vで、0V->5Vに変化で転送)
 char divider:SPIの通信速度を設定(Fosc=32MHz)
        SPI_CLOCK_DIV4 = Fosc/4
        SPI_CLOCK_DIV16 = Fosc/16
        SPI_CLOCK_DIV64 = Fosc/64

void SPIPullUP(value)
 SPI通信ラインに内部プルアップを行う処理
 SDO(MOSI)/SDI(MISO)/SCKのピンをプルアップさせないと上手く動作しない場合等に使用する。

 uint8_t value:プルアップを行うラインの指示をします
          (PULLUP_SDOPIN/PULLUP_SDIPIN/PULLUP_SCKPIN)

 例)SDO/SDIラインをプルアップする場合
   SPIPullUP( PULLUP_SDOPIN | PULLUP_SDIPIN ) ;  // 各定義名をORします

(I2C関連)

この機能は、I2C通信を行う為の手段を提供します。
このI2C機能はマスターのみ対応です、スレーブは御自分で作成しましょう。
I2Cの基礎についての記事はこちらを参考にして下さい。
尚、I2C関連の関数説明はこちらを参考にして下さい。
I2C機能を使用する場合は、"PICduinoSK.h"に記述している"#define SHIELD_USE_I2C"の
コメントを外します。
又、この機能を使ったサンプルプログラムは"exsample\I2C-LCD.c"を参考にして下さい。

I2C関連のピンは、A5/SCL(SCL1)とA4/SDA(SDA1)にSDA/SCLピンに引き出されています。

void I2CBegin(speed)
 I2C通信の初期化を行う処理
 I2Cを利用する場合は、SDA(A4)/SCL(A5)ピンを必ず外部でプルアップする事
 "InitI2C_Master()"関数ではなくここの"I2CBegin()"を使って下さい。

 int speed:通信速度を指定(100KHz or 400KHz)

(時間に関する関数)

この場所では時間に関する関数類を書きますが、システムクロック32MHzでの内容です。

void Wait(num)
 時間待ちの処理を行う
 18F26K22(XC8コンパイラ)では、__delay_us(24640)/__delay_ms(24)までの数値となるので、
 それ以上待つ為に存在します。

 int num:10ms単位で指定する

 ※ Wait(100)で1秒待つが、きっちり1秒でなく1s+数十usになる事に注意しましょう。

ans = *usTOctimer(timer,*buff)  *1)
 マイクロ秒を経過時間の文字列に変換する処理
 変換文字列は[hh:mm:ss.xxx.xxx\0]で返すので18文字分程buffは確保する事
 例えば、"296660675us"を与えるとぉ、"[0:04:56.660.675]と返されます。

 unsigned long timer:変換を行うマイクロ秒を指定する
 char                 *buff:変換された文字列の格納先を指定する
 char                  *ans:指定した文字列の格納先アドレスをそのまま返す

ans = millis(void)
 プログラムの実行を開始した時から現在までの時間をミリ秒単位で返す処理
 この機能にはタイマ−2(Timer2)機能を使用しています。 *3)
 Timer2の1ms毎割り込みで"unsigned long"変数をカウントアップしているだけなので、
 時刻は少しずつズレて行きます、時計代わりは無理ですよ。
 約50日間でオーバーフローし、ゼロに戻ります、でぇ、また再カウントするだけです。
 尚、この時のオーバーフローを考慮していないのでオーバーフロー時はうまく動作するかは不明。

 unsigned long ans:経過時間(ms)を返します

 ※ このmillisを使ったサンプルプログラムは"exsample\MoveAve.c"を参考にして下さい。

(ビット操作)

ans = bitRead(value,bit)
 指定した数値から、指定した位置のビットを読み取る処理

  value:読み取る対象となる数値
      bit:読み取るビットの位置。右端(LSB)から数えて何ビット目か
     ans:返す値は0か1です

void bitSet(value,bit)
 指定した数値の、指定した位置のビットをセットする処理

  value:セットする対象となる数値
      bit:セットするるビットの位置。右端(LSB)から数えて何ビット目か

 例)int i = 0 ;
   char c = 0 ;
   bitSet(c,4) ;
   // "0x10"となる
   bitSet(i,10) ;
   // "0x0400"となる

void bitClear(value,bit)
 指定した数値の、指定した位置のビットをクリアする処理

  value:クリアする対象となる数値
      bit:クリアするるビットの位置。右端(LSB)から数えて何ビット目か

(その他の関数)

ans = random(min,max)
 疑似乱数を発生させる処理

 long min:発生させる乱数の最小値を指定(負数の指定可)
 long max:発生させる乱数の最大値を指定(負数の指定可)
 long  ans:発生させた乱数を返す

 例)-9から9を発生させる場合
   ans = random(-9,9) ;

ans = *dtostrf(val,width,prec,*sout)
 浮動小数値を文字列に変換する処理

 double             val:変換を行う数値を指定
 signed char width:変換した文字列の個数(負数を指定すると左詰め)
 signed char   prec:小数点の位置を指定
 char             *sout:変換された文字列の格納先を指定
 char              *ans:指定した文字列の格納先アドレスをそのまま返す

 例1) SerialPrint("[") ;
    SerialPrint(dtostrf(123.56,6,1,buf)) ;
    SerialPrintln("]") ;
    // [ 123.5]と表示される
 例2) SerialPrint("[") ;
    SerialPrint(dtostrf(123.56,-6,1,buf)) ;
    SerialPrintln("]") ;
    // [123.5 ]と表示される

ans = map(val,in_min,in_max,out_min,out_max)
 マップ関数(ある数値から他の数値へレベル変換を行う)処理
 範囲の指定に負の数も出来ます。

 long         val:変換したい数値を指定
 long   in_min:変換前の範囲の下限を指定
 long  in_max:変換前の範囲の上限を指定
 long out_min:変換後の範囲の下限を指定
 long out_max:変換後の範囲の上限を指定
 long          ans:変換後の数値を返します

 例)可変抵抗値(0-1023)をDACの電圧レベル値(0-31)にする場合
   ans = analogRead(A5PIN) ;
   ans = map(ans,0,1023,0,31) ;

ans = constrain(amt,low,high)
 指定の数値を、指定した範囲のなかに収める処理
 amtがlow以上high以下のときはamtがそのまま返ります。
 amtがlowより小さいときはlow、highより大きいときはhighが返ります。

  amt:計算対象の数値を指定
   low:範囲の下限を指定
  high:範囲の上限を指定

 例)ある数値を10から150以内に収めたい場合
   ans = constrain(senserVal, 10, 150) ;

ans = FLT_MoveAve(value)
 移動平均の処理を行う
 移動平均の計算バッファ回数は、"PICduino.h"の"#define FLT_MOVEAVE_CALSU"にて指定します。
 この処理を使用しない場合はこの値を出来るだけ小さくして置けばメモリ節約になるでしょう。

 uint16_t value:移動平均する数値を指定する(0-65535)
 long           ans:移動平均された値を返す定

 ※ この移動平均を使ったサンプルプログラムは"exsample\MoveAve.c"を参考にして下さい。

ans = DataDisplay(kosu,d1,d2,d3)
 ADCから読込んだデータを"DataDisplay"用のデータに変換する処理
 アナログに接続されたセンサー等の値をグラフ化して表示(3チャンネル)させる為に使用します。
 変換フォーマットは、[XhhhhYhhhhZhhhh<cr><lf>]でhhhhは16進数で表す。

 int    kosu:3チャンネルの内で、何チャンネル分のデータを送るか指定(1-3)する
 int       d1:1チャンネル(X)用のデータを指定(MAX16bit)
 int       d2:2チャンネル(Y)用のデータを指定(MAX16bit)
 int       d3:3チャンネル(Z)用のデータを指定(MAX16bit)
 char *ans:変換したデータの格納先アドレスを返す

 例)1チャンネルのみ使用する場合
   val = analogRead(A0PIN) ;
   // 変換データ内に”CR/LF”が付くので"SerialPrintln"は使用しない
   SerialPrint( DataDisplay(1,val,0,0) ) ;

 ※ "DataDisplay"の記事についてはこちらを参照下さい。
 ※ この関数を使ったサンプルプログラムは"exsample\DataDSP.c"を参考にして下さい。

(良く使いそうな標準の関数)

ここには標準で用意されている良く使いそうな関数を説明して置きます。

ans = *itoa(*buf,val,base)
 ある整数値を文字列(HEX/DEC/OCT/BIN)に変換する関数
 変換する文字列を格納するバッファは必ず文字列の長さ文は確保する事。
 ANSI C規格では、itoa(val,*buf,base)となる所が少々異なる。

 char  *buf:変換したデータの格納先アドレスを指定
 int       val:変換する整数値を指定
 int    base:変換する基数を指定(HEX/DEC/OCT/BIN)
 char *ans:変換したデータの格納先アドレス(buf)をそのまま返す

 例)char buf[12] ;
   itoa(buf,67,BIN) ;
   // buf="1000011"と返される

ans = round(val)
 小数点以下を四捨五入する関数
 この関数を使う場合は、"#include <math.h>"をインクルードする必要が有ります。

 double   val:四捨五入したい数値を指定
 double  ans:四捨五入した結果を返す




《その他》

次ページでは実際にArduino用のシールドが動作するのかを実験してみます。



skI2CLCDlib/skI2Clib/skSPIlib/skUARTlibを最新版と入れ替えた(*5) 2019/04/16
CycleCount()関数の追加(*4) 2018/04/13
millis(Timer0)とチャタリング防止機能(Timer2)のTimerを入れ替えた(*3) 2018/04/10
tone()関数の不具合修正と周波数値の調整(*2) 2018/04/04
キャプチャ機能の追加(*1) 2018/03/27


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2018 Shigehiro Kimura All Rights Reserved.