PIC16F18313の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
デジタル I/O
2020-06-14

16F18325のDigital I/Oに関連するレジスターを示します。Power On Reset後は、すべてのピンは入力(TRISx = 1)に設定されていますが、Analog入力と併用できるピンは、すべてアナログ入力(ANSx = 1)に設定されます。 また、デジタル入力に設定したPortは、20KΩ程度の抵抗で、Vddにプルアップ(WPUx=1)することもできます。

デジタル入力として使用する場合 デジタル出力として使用する場合
  1. 該当のTRISを 1にセット
  2. RA3 以外のピンなら、
    該当ANSELのAN bitを0にリセット
  3. 該当のPORTレジスタからデータを読む
  1. 該当のTRISを 0にリセット
  2. 該当のANSELのAN bitを0にリセット
  3. 該当のLATレジスタにデータを書く
弱プルアップするには
  1. 該当の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

デジタル I/Oのプログラム例

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