16F18325のDigital I/Oに関連するレジスターを示します。Power On Reset後は、すべてのピンは入力(TRISx = 1)に設定されていますが、Analog入力と併用できるピンは、すべてアナログ入力(ANSx = 1)に設定されます。 また、デジタル入力に設定したPortは、20KΩ程度の抵抗で、Vddにプルアップ(WPUx=1)することもできます。
| デジタル入力として使用する場合 | デジタル出力として使用する場合 |
|---|---|
|
|
| 弱プルアップするには |
|---|
|
*注意*
RA3 以外のピンをデジタルで使用する場合は、ANSELAでデジタル設定にする必要があります。ANSELAは、デフォルトの設定が、アナログのため、デジタル入力で使用するには、必ず該当ピンをデジタルに設定(ANSAx = 0)します。ANSELAでアナログ設定のまま、デジタル入力でpin状態を読み出すと、常時「0」となります。
デジタル出力で使用する場合、ANSELAがアナログ設定されていても、TRISAを出力に設定すれば、LATxの値が正しくpinに出力されますが、プログラムでは、pinの状態を変更するときに、基本は、read-modify-write で実行されるので、予期されない結果を示すことがあります。
RA3
PortA RA3 は、Master clear 機能と併用されるため、他の pin と異なり、デジタル入力か、Master clearにしか指定することはできません。この指定は、Configuration bit で行い、プログラムで変更はできません。なお、Master clear 機能を選ぶと自動的にRA3の弱プルアップが有効にセットされます。
Open-Drain Control ( ODCONx )
リセット後は、全てのビットが「0」になっています。
該当するODCONxビットをセット「1」すると、pinドライバーがオープンドレインになります。pinをI2Cで使用する場合には、必ずODCONxビットをセットします。
Slew Rate Control ( SLRCONx )
リセット後は、全てのビットが「1」になっています。
該当するSLRCONxビットをセット「1」すると、該当pinのスルーレートが制限され、デジタルノイズの発生を抑制できます。
Input Threshold Control ( INLVLx )
リセット後は、全てのビットが「1」になっています。
該当pinの入力スレッシュホールドを変更できます。該当ビットをセット「1」すると、標準であるC-Mosシュミットトリガで入力され、リセット「0」すると、TTLレベルで入力が処理されます。
| レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|---|---|---|---|
| TRISA | TRISA5 | TRISA4 | TRISA2 | TRISA1 | TRISA0 | |||
| LATA | LATA5 | LATA4 | LATA2 | LATA1 | LATA0 | |||
| PORTA | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 | ||
| WPUA | WPUA5 | WPUA4 | WPUA3 | WPUA2 | WPUA1 | WPUA0 | ||
| ANSELA | ANSA5 | ANSA4 | ANSA2 | ANSA1 | ANSA0 | |||
| ODCONA | ODCA5 | ODCA4 | ODCA2 | ODCA1 | ODCA0 | |||
| SLRCONA | SLRA5 | SLRA4 | SLRA2 | SLRA1 | SLRA0 | |||
| INLVLA | INLVLA5 | INLVLA4 | INLVLA3 | INLVLA2 | INLVLA1 | INLVLA0 |
RA5に接続したPushSWを押すと500mS間隔で、離すと100mS間隔で、LEDが点滅する。RA5は、Week Pull Upされている。
プログラム
*注意*
config に、「RSTOSC = HFINT1」 が指定されると、内部クロック関連の各レジスターが、”HFOSCを使用しシステムクロックが 1MHz” になるよう自動設定される。このため、プログラム本体に、クロックオシレータ関連の設定を行う命令は必要ない。
// File name: Digital I/O
// PushSWを離すと100mS間隔で、
// 押すと500mS間隔でLEDが点滅する。
// PushSWの接続される RA5は、Week Pull Upされている。、
//
// Notes: 1MHz内部クロック
// PushSW RA3
// LED RA5
// Language: MPLABX XC8 * 2020-06-14
// Target: PIC16F18313
#include <xc.h>
#define _XTAL_FREQ 1000000 // delay_ms(x) のための定義
#define LED LATA5
#define PushSW RA3
#pragma config FEXTOSC = OFF // EXTOSC作動禁止
#pragma config RSTOSC = HFINT1 // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF // RA4をI/Oとして使用
#pragma config CSWEN = ON // NOSC NDIV によるクロック変更を許可
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor 禁止
#pragma config MCLRE = OFF // RA3をI/Oとして使用
#pragma config PWRTE = OFF // PWRT 禁止
#pragma config WDTE = OFF // Watchdog Timer 禁止
#pragma config LPBOREN = OFF // Low-power BOR 禁止
#pragma config BOREN = OFF // Brown-out Reset 禁止
#pragma config BORV = LOW // Brown-out voltage (Vbor) 2.45V
#pragma config PPS1WAY = OFF // PPS機能変更は随時有効
#pragma config STVREN = ON // Stack Overflowでリセット
#pragma config DEBUG = OFF // debugger 禁止
#pragma config WRT = OFF // ROMエリア書き込み禁止OFF
#pragma config LVP = OFF // Low Voltage Programming 禁止
#pragma config CP = OFF // ROMエリア code protection なし
#pragma config CPD = OFF // EEPROMエリア Code Protection なし
void main(void) {
TRISA = 0b011111;
while(1){
if(PushSW) __delay_ms(100); // 100mS遅延
else __delay_ms(500); // 500mS遅延
LED = ! LED; // 点滅
}
}