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

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
Peripheral Pin Select (PPS)機能

18F26J50の特記するべき特徴の一つはPeripheral Pin Select (PPS)機能を持っていることです。PPSにより内蔵するモジュールの入出力ピンをある程度自由に再配置することができます。これは、ピン数の少ないPICでは大きな福音となります。

入力ピンの配置指定

周辺デバイス名称 記号 表記
External Interrupt 1 INT1 RPINR1
External Interrupt 2 INT2 RPINR2
External Interrupt 3 INT3 RPINR3
Timer0 Ext Clock Input T0CKI RPINR4
Timer3 Ext Clock Input T3CKI RPINR6
Input Capture 1 CCP1 RPINR7
Input Capture 2 CCP2 RPINR8
Timer1 Gate Input T1G RPINR12
Timer3 Gate Input T3G RPINR13
EUSART2 Asynchronous Rx RX2/DT2 RPINR16
EUSART2 Synchronous Clock Input CK2 RPINR17
SPI2 Data Input SDI2 RPINR21
SPI2 Clock Input SCK2IN RPINR22
SPI2 Slave Select Input SS2IN RPINR23
PWM Fault Input FLT0 RPINR24

右表のペリフェラル入力ピンを任意の“RPn”ピンのどれかに指定することができます。左辺にRPINRxで、どの周辺デバイスかを表記し、右辺に指定する“RPn”ピン番号を指定します。たとえば EUSART2 Rxピンを RP1(RA1)ピンに指定するには、

RPINR16  =  1;
↑RX2を示す   ↑RP1ピンを示す

とプログラムします。さらに該当ピンの
ANCONxのビットを「1」にセット
TRISxのビットも「1」にセットして

該当する“RPn”ピンをデジタル入力にします。

出力ピンの配置指定

周辺デバイス名称 記号 表記番号
NULL NULL 0
Comparator 1 Output C1OUT 1
Comparator 2 Output C2OUT 2
EUSART2 Asynchronous Tx
/Asynchronous Clock Output
TX2/CK2 5
EUSART2 Synchronous Transmit DT2 6
SPI2 Data Output SDO2 9
SPI2 Data Output SCK2 10
SPI DMA Slave Select SSDMA 12
Ultra Low-Power Wake-up Event ULPOUT 13
ECCP1 Compare or PWM Output Channel A CCP1/P1A 14
ECCP1 Enhanced PWM Output, Channel B P1B 15
ECCP1 Enhanced PWM Output, Channel C P1C 16
ECCP1 Enhanced PWM Output, Channel D P1D 17
ECCP2 Compare or PWM Output Channel A CCP2/P2A 18
ECCP2 Enhanced PWM Output, Channel B P2B 19
ECCP2 Enhanced PWM Output, Channel C P2C 20
ECCP2 Enhanced PWM Output, Channel D P2D 21

右表のペリフェラル出力ピンを任意の“RPn”ピンのどれかに指定することができます。左辺に RPORxで“RPn”ピン番号を示し、右辺に周辺デバイスを表記番号で指定します。たとえば EUSART2 Txピンを RP0(RA0)ピンに指定するには

RPOR0   =   5;
↑RP0ピンを示す  ↑TX2を示す「5」

とプログラムします。さらに

ANCONxのビットを「1」にセット
TRISxのビットは「0」にリセット

該当する“RPn”ピンをデジタル出力にします。

プログラム

Peripheral Pin Select (PPS)機能の例として、USART2のプログラムです。 UART2 TX Outputは、 RP0(RA0)に、 UART2 RX Inputを RP1(RA1)に設定しています。

<プログラム>

//*********************************************************
//  PIC18F26J50 UART2 受信 Program//        :  MPLAB xc8
//  内部クロック4Mhz   Baud Rate:9600BPS, 16-bit Baud Rate
//  C18ライブラリを使用している。
//  内部クロック4Mhz   Baud Rate:9600BPS, 16-bit Baud Rate
//  シリアルデータの受信で以下の動作をする
//      受信データ、
//        0 : 全LED OFF
//        1 : LED0  ON
//        2 : LED1  ON
//        3 : LED2  ON
//        4 : LED3  ON
//   ポートの設定
//      UART Input   : RP1(RA1)
//      UART Output  : RP0(RA0)
//*********************************************************

#include    <p18cxxx.h>
#include    <usart.h>
#include    <timers.h>

#define LED0      LATBbits.LATB0
#define LED1      LATBbits.LATB1
#define LED2      LATBbits.LATB2
#define LED3      LATBbits.LATB3

//-------------- コンフィグレーション ----------------------
//
     #pragma config WDTEN = OFF, PLLDIV = 2, STVREN = ON, XINST = OFF
     #pragma config CPUDIV = OSC1, CP0 = OFF
     #pragma config OSC = INTOSC, T1DIG = OFF
     #pragma config LPT1OSC = OFF, FCMEN = OFF, IESO = OFF
     #pragma config WDTPS = 32768
     #pragma config DSWDTOSC = INTOSCREF, RTCOSC = T1OSCREF
     #pragma config DSBOREN = OFF, DSWDTEN = OFF, DSWDTPS = 8192
     #pragma config IOL1WAY = OFF, MSSP7B_EN = MSK7
     #pragma config WPFP = PAGE_1, WPEND = PAGE_0, WPCFG = OFF
     #pragma config WPDIS = OFF

//*********************************************************
void main(void){
    char RxData;
    OSCCON = 0b01100010;       // 内部クロック4Mhz
    LATB = 0;                  // PortBのすべてのビットを「0」
    TRISA = 0b11111110;        // TX2のポートを出力に設定
    TRISB = 0b11110000;        // LEDのポートを出力に設定
    ANCON0 = 0b00011111;       // すべてのポートをデジタルに設定
    ANCON1 = 0b00011111;       //
    // PPSの設定
    RPOR0   = 5;    //RP0 = TX2  (RA0)
    RPINR16 = 1;    //RX2 = RP1  (RA1)

    Open2USART(
        USART_TX_INT_OFF &
        USART_RX_INT_OFF &
        USART_ASYNCH_MODE &
        USART_EIGHT_BIT &
        USART_CONT_RX &
        USART_BRGH_HIGH,
        103);                     //9600 bps
    baud2USART (
        BAUD_IDLE_RX_PIN_STATE_HIGH &
        BAUD_IDLE_TX_PIN_STATE_HIGH &
        BAUD_16_BIT_RATE &
        BAUD_WAKEUP_OFF &
        BAUD_AUTO_OFF);
    while(1){
        while (!DataRdy2USART());  // 受信するまで待つ
        RxData = Read2USART();      // 受信データを取り込む
        switch(RxData){            // データに対応したLEDを点灯
            case '0':
                LED0 = 0; LED1 = 0; LED2 = 0; LED3 = 0; break;
            case '1':
                LED0 = 1; LED1 = 0; LED2 = 0; LED3 = 0; break;
            case '2':
                LED0 = 0; LED1 = 1; LED2 = 0; LED3 = 0; break;
            case '3':
                LED0 = 0; LED1 = 0; LED2 = 1; LED3 = 0; break;
            case '4':
                LED0 = 0; LED1 = 0; LED2 = 0; LED3 = 1; break;
        }
    }
}