PIC16F1619のDigital I/Oに関連するレジスターを示します。Power On Reset後は、すべてのピンは入力(TRISx = 1)に設定されていますが、Analog入力と併用できるピンは、すべてアナログ入力(ANSx = 1)に設定されます。 また、デジタル入力に設定したPortは、20KΩ程度の抵抗で、Vddにプルアップ(WPUx=1)することもできます。
| デジタル入力として使用する場合 | デジタル出力として使用する場合 |
|---|---|
|
|
| 弱プルアップするには |
|---|
|
*注意*
汎用ピンをデジタルで使用する場合は、デジタルの入出力をTRISで設定するだけでなく、アナログ併用ピンかを調べ、併用ピンであれば、ANSELAでデジタル設定にする必要があります。ANSELxは、デフォルトの設定が、アナログのため、デジタル入力で使用するには、必ず該当ピンをデジタルに設定(ANSAx = 0)する必要があります。
各ポートには、その動作を定める次のようなレジスタがあります。
一般に、ポートピンでペリフェラルが有効になっている場合、そのピンは汎用出力として使用できません。ただし、ピンの電圧レベルは引き続き読み取ることができます。LATxレジスタへの書き込み操作には、対応するPORTxレジスタへの書き込みと同じ効果があります。LATxレジスタの読み取りは I/O PORTラッチに保持されている値を読み取るのに対し、PORTxレジスタの読み取りは実際の I/Oピン値を読み取ります。
アナログ入力が可能なポートには、ANSELxレジスタがあり、ANSELビットがセットされると、そのビットに関連付けられたデジタル入力バッファが無効になります。入力バッファを無効にすることで、ロジックの中間電位であるアナログ信号レベルがロジック入力回路に過剰な電流を発生させる悪影響を回避します。
TRISxビット(= 1)をセットすると、対応するPORTxピンが入力になり、出力ドライバーが無効になります。TRISxビットをクリアすると(= 0)、対応するPORTxピンが出力になり、出力ドライバーを有効にし、出力ラッチの内容をピンに出力します。
RA3は、入力専用であり、そのTRISビットは常に「1」として読み取られます。
PORTxレジスタを読むとピンのステータスが読み取られ、レジスタにデータを書くとPORTラッチに書き込まれます。すべての書き込み操作は、[読み取り -> 変更 -> 書き込み]の一連の動作です。したがって、ポートへの書き込みは、ポートピンが読み取られ、この値が変更されてから、PORTデータラッチ(LATx)に書き込まれることを意味します。
アナログ入力として使用する場合でも、PORTxピンの出力ドライバはTRISxが制御するため、TRISxレジスタの該当ビットはセット「1」状態を維持してください。アナログ入力と設定された I/OピンのPORTデータは常に「0」が読み取られます。
ポートのオープンドレイン機能を制御します。動作は、ピンごとに独立し、ODCONxビットが「1」にセットされている場合、対応するポート出力は、電流の流れ込みだけが可能なオープンドレインドライバーになります。
ODCONxビットが「0」にクリアされている場合、対応するポート出力ピンは、電流の流れ出し、または流れ込みができる標準のプッシュプルドライブです。
各ポートピンのスルーレートオプションは各ピンごとに個別に選択できます。
SLRCONxビットが「1」にセットされている場合、対応するポートピンドライブのスルーレートが制限されます。SLRCONxビットが「0」にクリアされると、対応するポートピンドライブは可能な最大レートで変化します。
利用可能な各PORTx入力ピンの入力電圧閾値をシュミットトリガーCMOSまたはTTL互換の閾値から選択できます。PORTxレジスタの入力閾値、interrupt-on-change時に割り込みが発生するレベルが変化します。
I/Oピンの入力モードをアナログに設定します。ANSELxビットを「1」に設定すると、ピンのアナログ機能が正しく動作できるようになりますが、ピンのデジタル読み取りは常に「0」となります。
ANSELxビットの設定状態は、デジタル出力機能には影響しません。TRISがクリアされてANSELがセットされたピンは、引き続きデジタル出力として動作しますが、入力モードはアナログです。これにより、影響を受けるポートで[読み取り -> 変更 -> 書き込み]の命令を実行すると、予期しない動作が発生する可能性があります。
*注意*
ANSELxビットはリセット後、デフォルトでアナログモードになります。
任意のピンをデジタル汎用または周辺入力として使用するには、対応するANSELビットをユーザーソフトウェアで「0」に初期化する必要があります。
RC4 及び RC5の最大電流駆動能力を設定します。
HIDRVCビットが「0」にクリアされると、他の通常ピントと同様の電流駆動能力ですが、HIDRVCビットを「1」にセットした場合、対応するポートピンの最大の電流駆動能力は、流れ出し、流れ込み共に100mAになります。
リセット後、各ピンはデフォルトの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 | - | - | - | - |
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;
}
}
}