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

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

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

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

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

PORTA RA5 RA4 RA3 RA2 RA1 RA0
Digital I/O I/O I I/O I/O I/O
割込み IOC IOC IOC IOC IOC IOC
PullUp WPUA5 WPUA4 WPUA3 WPUA2 WPUA1 WPUA0
Analog - AN4 - AN2 AN1 AN0
出力優先順 OSC1
T1OSI
SRNQ
RX/DT(*)
CCP1/P1A(*)
OSC2
CLKOUT
T1OSO
CLKR
SDO(*)
P1B(*)
SRQ
C1OUT
SDA
CCP1/P1A
SCL
RX/DT
SCK
DACOUT
MDOUT
TX/CK
SDO
P1B

(*) は、APFCONで代替えPIN指定「1」したときに有効となる

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
TRISA TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0
LATA LATA5 LATA4 LATA2 LATA1 LATA0
PORTA RA5 RA4 RA3 RA1 RA0
APFCON RXDTSEL SDOSEL SSSEL T1GSEL TXCKSEL P1BSEL CCP1SEL
WPUA WPUA5 WPUA4 WPUA3 WPUA2 WPUA1 WPUA0
OPTION_REG WPUEN INTEDG TMR0CS TMR0SE PSA  PS<2-0>
ANSELA       ANSA4   ANSA2 ANSA1 ANSA0

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

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

プログラム

//  File name: Digital I/O
//  PushSWを離すと100mS間隔で、
//          押すと500mS間隔でLEDが点滅する。
//  PushSWの接続される RA5は、Week Pull Upされている。、
//
//           1 VDD    VSS 8
//   PushSW  2 RA5    RA0 7
//           3 RA4    RA1 6
//           4 MCLR   RA2 5  LED
//
//  Notes: 4MHz内部クロック
//    Language: MPLABX XC8
//    Target: PIC12F1822

#include <xc.h>
#define _XTAL_FREQ 4000000      // delay_ms(x) のための定義

#define LED    LATA2
#define PushSW RA5

//#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
//#pragma config CPD = OFF, BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
//#pragma config WRT = OFF, PLLEN = OFF, STVREN = ON, BORV = LO, LVP = OFF

// CONFIG1の設定
#pragma config FOSC  = INTOSC   // 内部クロック使用
#pragma config WDTE  = OFF      // ウオッチドッグタイマ無効
#pragma config PWRTE = ON       // リセットの64ms後に実行開始する
#pragma config MCLRE = OFF      // RA3をデジタル入力とする
#pragma config CP    = OFF      // プログラムメモリを保護しない
#pragma config CPD   = OFF      // データメモリを保護しない
#pragma config BOREN = ON       // 電源低下モニタを有効
#pragma config CLKOUTEN = OFF   // RA4をデジタルIOとする
#pragma config IESO  = OFF      // 内外クロックの切替え停止
#pragma config FCMEN = OFF      // クロックをモニタしない
// CONFIG2の設定
#pragma config WRT  = OFF       // Flashメモリ書込み保護しない
#pragma config PLLEN  = OFF     // PLLを停止
#pragma config STVREN = ON      // スタックエラーでリセットをする
#pragma config BORV = LO        // 電源低下モニタ電圧をLO(1.9V)設定
#pragma config LVP  = OFF       // 低電圧プログラミング無効

void main(void){
    OSCCON = 0b01101010;               // 内部クロック4Mhz
    ANSELA = 0;                        // 全てデジタルIO
    WPUA   = 0xFF;                     // 弱プルアップ ON
    nWPUEN = 0;
    TRISA  = 0b11111011;               // 入出力設定
    while(1){                          // 繰り返しループ
         if(PushSW) __delay_ms(100);   // 100mS遅延
              else  __delay_ms(500);   // 500mS遅延
         LED = ! LED;                  // 点滅
    }
}