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;
}
}
}