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; // 点滅 } }