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

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

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 以外のピンをデジタルで使用する場合は、デジタルの入出力を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

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

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