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 アセンブラプログラムは、[こちら]