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

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

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

デジタル入力として使用する場合 デジタル出力として使用する場合
  1. 該当のTRISを 1にセット
  2. アナログ併用ピンなら、
      該当ANSELAのANS bitを0にリセット
  3. 該当のPORTレジスタからデータを読む
  1. 該当のTRISを 0にリセット
  2. 該当のLATレジスタにデータを書く
弱プルアップするには
  1. 該当のWPAxを 1にセット
  2. OPTION_REGのWPUEN (bit7)を0にリセット

*注意*
汎用ピンをデジタルで使用する場合は、デジタルの入出力をTRISで設定するだけでなく、アナログ併用ピンかを調べ、併用ピンであれば、ANSELAでデジタル設定にする必要があります。ANSELxは、デフォルトの設定が、アナログのため、デジタル入力で使用するには、必ず該当ピンをデジタルに設定(ANSAx = 0)する必要があります。

I/O ポートの動作

各ポートには、その動作を定める次のようなレジスタがあります。

一般に、ポートピンでペリフェラルが有効になっている場合、そのピンは汎用出力として使用できません。ただし、ピンの電圧レベルは引き続き読み取ることができます。LATxレジスタへの書き込み操作には、対応するPORTxレジスタへの書き込みと同じ効果があります。LATxレジスタの読み取りは I/O PORTラッチに保持されている値を読み取るのに対し、PORTxレジスタの読み取りは実際の I/Oピン値を読み取ります。

アナログ入力が可能なポートには、ANSELxレジスタがあり、ANSELビットがセットされると、そのビットに関連付けられたデジタル入力バッファが無効になります。入力バッファを無効にすることで、ロジックの中間電位であるアナログ信号レベルがロジック入力回路に過剰な電流を発生させる悪影響を回避します。

レジスターのはたらき

PORTx データレジスタ

TRISxビット(= 1)をセットすると、対応するPORTxピンが入力になり、出力ドライバーが無効になります。TRISxビットをクリアすると(= 0)、対応するPORTxピンが出力になり、出力ドライバーを有効にし、出力ラッチの内容をピンに出力します。

RA3は、入力専用であり、そのTRISビットは常に「1」として読み取られます。

PORTxレジスタを読むとピンのステータスが読み取られ、レジスタにデータを書くとPORTラッチに書き込まれます。すべての書き込み操作は、[読み取り -> 変更 -> 書き込み]の一連の動作です。したがって、ポートへの書き込みは、ポートピンが読み取られ、この値が変更されてから、PORTデータラッチ(LATx)に書き込まれることを意味します。

TRISx 方向制御   ( Power On Resetで「1」にセット)

アナログ入力として使用する場合でも、PORTxピンの出力ドライバはTRISxが制御するため、TRISxレジスタの該当ビットはセット「1」状態を維持してください。アナログ入力と設定された I/OピンのPORTデータは常に「0」が読み取られます。

ODCONx オープンドレイン制御   ( Power On Resetで「0」にクリア)

ポートのオープンドレイン機能を制御します。動作は、ピンごとに独立し、ODCONxビットが「1」にセットされている場合、対応するポート出力は、電流の流れ込みだけが可能なオープンドレインドライバーになります。
ODCONxビットが「0」にクリアされている場合、対応するポート出力ピンは、電流の流れ出し、または流れ込みができる標準のプッシュプルドライブです。

SLRCONx スルーレート制御   ( Power On Resetで「0」にクリア)

各ポートピンのスルーレートオプションは各ピンごとに個別に選択できます。
SLRCONxビットが「1」にセットされている場合、対応するポートピンドライブのスルーレートが制限されます。SLRCONxビットが「0」にクリアされると、対応するポートピンドライブは可能な最大レートで変化します。

INLVLx 入力閾値制御   ( Power On Resetで「0」にクリア)

利用可能な各PORTx入力ピンの入力電圧閾値をシュミットトリガーCMOSまたはTTL互換の閾値から選択できます。PORTxレジスタの入力閾値、interrupt-on-change時に割り込みが発生するレベルが変化します。

ANSEL アナログ制御   ( Power On Resetで「1」にセット)

I/Oピンの入力モードをアナログに設定します。ANSELxビットを「1」に設定すると、ピンのアナログ機能が正しく動作できるようになりますが、ピンのデジタル読み取りは常に「0」となります。

ANSELxビットの設定状態は、デジタル出力機能には影響しません。TRISがクリアされてANSELがセットされたピンは、引き続きデジタル出力として動作しますが、入力モードはアナログです。これにより、影響を受けるポートで[読み取り -> 変更 -> 書き込み]の命令を実行すると、予期しない動作が発生する可能性があります。

*注意*
ANSELxビットはリセット後、デフォルトでアナログモードになります。
任意のピンをデジタル汎用または周辺入力として使用するには、対応するANSELビットをユーザーソフトウェアで「0」に初期化する必要があります。

HIDRVC 高電流駆動   ( Power On Resetで「0」にクリア)

RC4 及び RC5の最大電流駆動能力を設定します。
HIDRVCビットが「0」にクリアされると、他の通常ピントと同様の電流駆動能力ですが、HIDRVCビットを「1」にセットした場合、対応するポートピンの最大の電流駆動能力は、流れ出し、流れ込み共に100mAになります。

PORTxの機能と出力の優先順位

リセット後、各ピンはデフォルトのPORTラッチデータに接続されます。その他のペリフェラル機能は、ピン選択ロジック(PPS)で必要により選択し直します。詳細は「ペリフェラルピンセレクト(PPS)モジュール」を参照してください。

ADC入力などのアナログ入力機能は、周辺ピン選択リストには表示されていません。これらの入力は、ANSELxレジスタを使用して I/Oピンがアナログモードに設定されているときにアクティブになります。

アナログモードの場合、デジタル出力機能がピンを制御し続ける場合があります。

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
TRISA - - TRISA5 TRISA4 - TRISA2 TRISA1 TRISA0
LATA - - LATA5 LATA4 LATA3 LATA2 LATA1 LATA9
PORTA - - RA5 RA4 RA3 RA2 RA1 RA0
INLVLA - - INLVLA5 INLVLA4 INLVLA3 INLVLA2 INLVLA1 INLVLA0
ODCONA - - ODA5 ODA4 - ODA2 ODA1 ODA0
SLRCONA - - SLRA5 SLRA4 - SLRA2 SLRA1 SLRA0
WPUA - - WPUA5 WPUA4 WPUA3 WPUA2 WPUA1 WPUA0
OPTION_REG nWPUEN INTEDG TMR0CS TMR0SE PSA PS<2-0>
ANSELA - - - ANSA4 - ANSA2 ANSA1 ANSA0
レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
TRISB TRISB7 TRISB6 TRISB5 TRISB4 - - - -
LATB LATB7 LATB6 LATB5 LATB4 - - - -
PORTB RB7 RB6 RB5 RB4 - - - -
INLVLB INLVLB7 INLVLB6 INLVLB5 INLVLB4 - - - -
ODCONB ODB7 ODB6 ODB5 ODB4 - - - -
SLRCONB SLRB7 SLRB6 SLRB5 SLRB4 - - - -
WPUB WPUB7 WPUB6 WPUB5 WPUB4 - - - -
OPTION_REG nWPUEN INTEDG TMR0CS TMR0SE PSA PS<2-0>
ANSELB - - ANSB5 ANSB4 - - - -
レジスタ 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
INLVLC INLVLC7 INLVLC6 INLVLC5 INLVLC4 INLVLC3 INLVLC2 INLVLC1 INLVLC0
ODCONC ODC7 ODC6 ODC5 ODC4 ODC3 ODC2 ODC1 ODC0
SLRCONC SLRC7 SLRC6 SLRC5 SLRC4 SLRC3 SLRC2 SLRC1 SLRC0
WPUC WPUC7 WPUC6 WPUC5 WPUC4 WPUC3 WPUC2 WPUC1 WPUC0
OPTION_REG nWPUEN INTEDG TMR0CS TMR0SE PSA PS<2-0>
ANSELC ANSC7 ANSC6 - - ANSC3 ANSC2 ANSC1 ANSC0
HIDRVC - - HIDC5 HIDC4 - - - -

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

RA5に接続したPushSWを押すと500mS間隔で、離すと100mS間隔で、LEDが点滅する。RA5は、Week Pull Upされている。

プログラム

/*********************************************************************
*  File name: Digital I/O
*  PushSWを離すと500mS間隔で、
*          押すと100mS間隔でLEDが点滅する。
*  PushSWの接続される RA5は、Week Pull Upされている。、
*
*  Notes: 1MHz内部クロック
*        PushSW RC4
*        LED    RC5
* PIC16F1619  MPLAB X IDE with XC8
* Copyright (c) 2019 iwamoto All Rights Reserved
* *******************************************************************/
#include <xc.h>

#define _XTAL_FREQ 1000000

#define LED4 LATA5
#define LED5 LATA1
#define LED6 LATA2
#define LED7 LATC5
#define PushSW RC4

// CONFIG1
#pragma config FOSC = INTOSC
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = ON
#pragma config FCMEN = ON
// CONFIG2
#pragma config WRT = OFF
#pragma config PPS1WAY = ON
#pragma config ZCD = OFF
#pragma config PLLEN = OFF
#pragma config STVREN = ON
#pragma config BORV = LO
#pragma config LPBOR = OFF
#pragma config LVP = ON
// CONFIG3
#pragma config WDTCPS = WDTCPS1F
#pragma config WDTE = OFF
#pragma config WDTCWS = WDTCWSSW
#pragma config WDTCCS = SWC


/*********************************************************
                         Main application
 *********************************************************/
void main(void)
{
    OSCCON = 0x58;	// FOSC; PLL disabled; 1MHz_HF;

    LATA = 0x00;	// 全てクリア
    LATB = 0x00;
    LATC = 0x00;
    TRISA = 0b11011001;     // Outputs RA1,RA2,RA5
    TRISB = 0xFF;           // 全て入力
    TRISC = 0b11011111;     // Outputs RC5
    ANSELC = 0x00;          // 全てデジタル
    ANSELB = 0x00;
    ANSELA = 0x00;
    WPUB = 0xFF;            // 全て弱プルアップ
    WPUA = 0xFF;
    WPUC = 0xFF;
    OPTION_REGbits.nWPUEN = 0;

    while (1)
    {
         if(!PushSW){
             __delay_ms(100);   // pushSW ON 100mS遅延
             LED7 = ! LED7;
         }else{
             __delay_ms(500);   // pushSW OFF 500mS遅延
             LED7 = ! LED7;
         }
    }
}