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

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

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

目次

入力ピンの指定

右表のペリフェラル入力ピンを任意のI/Oピンに指定することができます。左辺にxxxxで、どの周辺デバイスかを表記したPPSレジスター、右辺に指定する“I/O”ピン番号を指定します。たとえば EUSART1 Rxピンを RA1ピンに指定するには、

RXPPS  =  0x01;
↑RXを示す   ↑RA1ピンを示す

とプログラムします。さらに該当ピンのANSELxのビットを「0」にリセット、TRISxのビットは「1」にセットして、該当する“I/O”ピンをデジタル入力にします。また、複数の周辺機器が同じピンを同時に入力指定し動作することができます。

周辺機器名レジスター名デフォルトピン
Interrupt on changeINTPPSRA2
Timer 0 clockT0CKIPPSRA2
Timer 1 clockT1CKIPPSRA5
Timer 1 gateT1GPPSRA4
Timer 2 clockT2CKIPPSRA5
Timer 3 clockT3CKIPPSRC5
Timer 3 gateT3GPPSRC4
Timer 4 clockT4CKIPPSRC1
Timer 5 clockT5CKIPPSRC0
Timer 5 gateT5GPPSRC3
Timer 6 clockT6CKIPPSRA3
CCP1CCP1PPSRC5
CCP2CCP2PPSRC3
CWG1CWG1INPPSRA2
SPI/I2C clockSSPCLKPPSRB6
SPI/I2C dataSSPDATPPSRB4
周辺機器名レジスター名デフォルトピン
SPI slaveSSPSSPPSRC6
EUSART RXRXPPSRB5
EUSART CKCKPPSRB7
All CLCsCLCIN0PPSRC3
All CLCsCLCIN1PPSRC4
All CLCsCLCIN2PPSRC1
All CLCsCLCIN3PPSRA5
SMT1 WIN InputSMTWIN1PPSRA5
SMT1 SIG InputSMTSIG1PPSRA4
SMT2 WIN InputSMTWIN2PPSRA3
SMT2 SIG InputSMTSIG2PPSRC1
AT1 Clock InputAT1INPPSRC5
AT1 CC1 InputAT1CC1PPSRC3
AT1 CC2 InputAT1CC2PPSRC4
AT1 CC3 InputAT1CC3PPSRC5
I/O名称 表記 I/O名称 表記 I/O名称 表記
RA00x00 RC00x10
RA10x01 RC10x11
RA20x02 RC20x12
RA30x03 RC30x13
RA40x04 RB40x0C RC40x14
RA50x05 RB50x0D RC50x15
RB60x0E RC60x16
RB70x0F RC70x17

出力ピンの指定

右表のペリフェラル出力をRA3を除く任意のI/Oピンに指定することができます。左辺に RxyPPSと、“I/O”番号の後ろに"PPS"を追記したレジスター名称を指定し、右辺に周辺デバイスを表記番号で記載します。たとえば PWM3出力ピンを RC3ピンに指定するには

RC3PPS   =  0x0E;
↑RC3ピンを示す  ↑PWM3を示す「0x0E」

とプログラムします。さらに、ANSELxの該当ビットを「0」にセット、TRISxのビットは「0」にリセットして、該当ピンをデジタル出力にします。

周辺デバイス名称 表記番号
LATxy0x00
sync_C1OUT0x01
sync_C2OUT0x02
ZCD1_out0x03
LC1_out0x04
周辺デバイス名称 表記番号
LC2_out0x05
LC3_out0x06
LC4_out0x07
CWG1OUTA(1)0x08
CWG1OUTB(1)0x09
周辺デバイス名称 表記番号
CWG1OUTC(1)0x0A
CWG1OUTD(1)0x0B
CCP1_out0x0C
CCP2_out0x0D
PWM3_out0x0E
周辺デバイス名称 表記番号
PWM4_out0x0F
SCK/SCL(1)0x10
SDO/SDA(1)0x11
TX/CK0x12
DT0x13

PPSロック

PPSLOCKレジスタのPPS​​LOCKEDビットをセットすると、PPSの選択がロックされ、すべての入出力選択をロックし、不注意による変更を防止しています。このビットをセットおよびクリアするには、特別なシーケンスが必要となり、さらなる不用意防止になっています。例12-1に、PPSLOCKEDビットのセットとクリアの例を示します。

PPS LOCK / UNLOCKシーケンス

#include "stdbool.h"
    bool state = (unsigned char)GIE;
    GIE = 0;                      // インタラプト禁止
    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0x00; // unlock PPS

    CLCIN0PPS = 0x14;             // PPSの設定を実施
    RA5PPS = 0x04;                // PPSの設定を実施

    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCKbits.PPSLOCKED = 0x01; // lock PPS

    GIE = state;                  // インタラプトを元に復旧
PPS永久ロック

コンフィグレーションビット PPS1WAY をセットすることにより、PPSを永続的にロック可能です。このビットがセットされている場合、PPSLOCKEDビットは、デバイスのリセット後に一度だけクリアしセットすることができます。デバイスリセットでPPSLOCKEDビットがクリアされるため、初期化中にPPS入出力を選択できるようになります。すべての選択が行われた後でPPSLOCKEDビットがセットされると、ビットはセットされたままになり、次のデバイスリセットイベントが完了するまでクリアできません。

スリープ中の動作

PPSの入力と出力の選択は、スリープの影響を受けません。

リセットの影響

デバイスのパワーオンリセット(POR)は、すべてのPPS入力と出力の選択をデフォルト値にクリアします。他のすべてのリセットでは、選択内容は変更されません。デフォルトの入力選択は、ピン割り当て表に示されています。

*注意*
I2Cのデフォルトの入力ピンはI2CおよびSMBusと互換性があり、この互換性を持つのはこのピンだけです。

プログラム例

Peripheral Pin Select (PPS)機能の例として、CLCのプログラムです。 CLC Input 0 をPPSでRC4に、CLC1 OutputをppsでRA5に設定しています。

<プログラム>

/*********************************************
 * File: CLC sample
 * System ClockはConfigで内部1MHzに設定
 * CLCのAND-ORで、PushSW入力を反転しLEDに接続する
 * CLC入出力はPPSでピン指定する
 * PIC16F18346
 * Created on may 22, 2020
 **********************************************/

#include <xc.h>

#pragma config FEXTOSC = OFF,RSTOSC = HFINT1  // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF
#pragma config MCLRE = ON,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = ON,CP = OFF,CPD = OFF

void main(void){
    TRISA5 = 0;     // LED RA5 出力設定
    ANSC4  = 0;     // SW  RC4 デジタル設定

    // PPS 初期化 **************************************
    // pin RC4 (PushSW) を CLCIN0  入力に指定
    // pin RA5 (LED D4) を CLC1OUT 出力に指定
    // *************************************************
    CLCIN0PPS = 0x14;   // RC4 -> CLCIN0
    RA5PPS    = 0x04;   // CLC1OUT -> RA5

    // CLC1 初期化 **************************************
    // AND-OR を使用
    //   入力は、CLCIN0PPS でPushSWを指定
    //   CLC1出力を反転したものをLEDに接続
    // *************************************************
    CLC1POL  = 0x82;    // モジュール、Gate2出力反転 他はそのまま
    CLC1SEL0 = 0x00;    // 信号源1 CLCIN0PPS
    CLC1SEL1 = 0x00;    // 信号源2 CLCIN0PPS
    CLC1SEL2 = 0x00;    // 信号源3 CLCIN0PPS
    CLC1SEL3 = 0x00;    // 信号源4 CLCIN0PPS
    CLC1GLS0 = 0x02;    // Gate1 Data1T ON 他はOFF
    CLC1GLS1 = 0x00;    // Gate2 全入力OFF
    CLC1GLS2 = 0x00;    // Gate3 全入力OFF
    CLC1GLS3 = 0x00;    // Gate4 全入力OFF
    CLC1CON = 0x80;     // LC1 ON 割込OFF AND-OR

    while (1) {}
}