16F18325のDigital I/Oに関連するレジスターを示します。Power On Reset後は、すべてのピンは入力(TRISx = 1)に設定されていますが、Analog入力と併用できるピンは、すべてアナログ入力(ANSx = 1)に設定されます。 また、デジタル入力に設定したPortは、20KΩ程度の抵抗で、Vddにプルアップ(WPUx=1)することもできます。
デジタル入力として使用する場合 | デジタル出力として使用する場合 |
---|---|
|
|
弱プルアップするには |
---|
|
*注意*
RA3 以外のピンをデジタルで使用する場合は、デジタルの入出力をTRISxで設定するだけでなく、ANSELxもデジタル設定にする必要があります。ANSELxは、デフォルトの設定が、アナログのため、デジタル入力で使用するには、必ず該当ピンをデジタルに設定(ANSAx = 0)します。ANSELxでアナログ設定のまま、デジタル入力でpin状態を読み出すと、常時「0」となります。
デジタル出力で使用する場合、ANSELAがアナログ設定されていても、TRISxを出力に設定すれば、LATxの値が正しくpinに出力されますが、プログラムでは、pinの状態を変更するときに、基本は、read-modify-write で実行されるので、予期されない結果を示すことがあります。
RA3
PortA RA3 は、Master clear 機能と併用されるため、他の pin と異なり、デジタル入力か、Master clearにしか指定することはできません。この指定は、Configuration bit で行い、プログラムで変更はできません。なお、Master clear 機能を選ぶと自動的にRA3の弱プルアップが有効にセットされます。
Open-Drain Control ( ODCONx )
該当するODCONxビットをセット「1」すると、pinドライバーがオープンドレインになります。pinをI2Cで使用する場合には、必ずODCONxビットをセットします。
Slew Rate Control ( SLRCONx )
該当するSLRCONxビットをセット「1」すると、該当pinのスルーレートが制限され、デジタルノイズの発生を抑制できます。
Input Threshold Control ( INLVLx )
該当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 |
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
TRISB | TRISB7 | TRISB6 | TRISB5 | TRISB4 | - | - | - | - |
LATB | LATB7 | LATB6 | LATB5 | LATB4 | - | - | - | - |
PORTB | RB7 | RB6 | RB5 | RB4 | - | - | - | - |
WPUB | WPUB7 | WPUB6 | WPUB5 | WPUB4 | - | - | - | - |
ANSELB | ANSB7 | ANSB6 | ANSB5 | ANSB4 | - | - | - | - |
ODCONB | ODCB7 | ODCB6 | ODCB5 | ODCB4 | - | - | - | - |
SLRCONB | SLRB7 | SLRB6 | SLRB5 | SLRB4 | - | - | - | - |
INLVLB | INLVLB7 | INLVLB6 | INLVLB5 | INLVLB4 | - | - | - | - |
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
TRISC | TRISC7 | TRISC6 | TRISC5 | TRISC4 | TRISC3 | TRISC2 | TRISC1 | TRISC0 |
LATC | LATC7 | LATC6 | LATC5 | LATC4 | LATC3 | LATC2 | LATC1 | LATC0 |
PORTC | RC7 | RC6 | RC5 | RC4 | RC3 | RC2 | RC1 | RC0 |
WPUC | WPUC7 | WPUC6 | WPUC5 | WPUC4 | WPUC3 | WPUC2 | WPUC1 | WPUC0 |
ANSELC | ANSC7 | ANSC6 | ANSC5 | ANSC4 | ANSC3 | ANSC2 | ANSC1 | ANSC0 |
ODCONC | ODCC7 | ODCC6 | ODCC5 | ODCC4 | ODCC3 | ODCC2 | ODCC1 | ODCC0 |
SLRCONC | SLRC7 | SLRC6 | SLRC5 | SLRC4 | SLRC3 | SLRC2 | SLRC1 | SLRC0 |
INLVLC | INLVLC7 | INLVLC6 | INLVLC5 | INLVLC4 | INLVLC3 | INLVLC2 | INLVLC1 | INLVLC0 |
RC4に接続したPushSWを押すと500mS間隔で、離すと100mS間隔で、LED D7 が点滅する。プログラムの確認は、Curiosity ボードにPIC16F18346を挿して行いました。
プログラム
*注意*
config に、「RSTOSC = HFINT1」 が指定されると、内部クロック関連の各レジスターが、”HFOSCを使用しシステムクロックが 1MHz” になるよう自動設定される。このため、プログラム本体に、クロックオシレータ関連の設定を行う命令は必要ない。
// File name: Digital I/O // PushSWを離すと100mS間隔で、 // 押すと500mS間隔でLEDが点滅する。 // Curiosity ボードにPIC16F18346を挿している。 // // Notes: 1MHz内部クロック // LED RC5 // PushSW RC4 // Language: MPLABX XC8 v2.10 // Target: PIC16F18346 // Created on May 18, 2020, 9:44 AM #include <xc.h> #define _XTAL_FREQ 1000000 // delay_ms(x) のための定義 #define LED LATC5 #define PushSW RC4 #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 = ON // RA3をMCLREとして使用 #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 = ON // Low Voltage Programming ON #pragma config CP = OFF // ROMエリア code protection なし #pragma config CPD = OFF // EEPROMエリア Code Protection なし void main(void) { TRISC = 0b11011111; // RC5:output RC4:input LATC = 0; // LED OFF ANSELC = 0; // デジタル I/O pin while(1){ if(PushSW) __delay_ms(100); // 100mS遅延 else __delay_ms(500); // 500mS遅延 LED = ! LED; // 点滅 } }
pic-as アセンブラプログラムは、[こちら]