C:\Users\meito\MPLABXProjects\Takujo-13-2.X\Takujo-13-2.c
  1 /*****************************************
  2 *   Takujo-13-2E (外周用)
  3 *           2020/1/19
  4 *           PIC16F1827   MPLAB X   XC8
  5 ******************************************/
  6 #include <xc.h>
  7 
  8 #define _XTAL_FREQ  8000000
  9 
 10 // CONFIG1
 11 #pragma config FOSC = INTOSC    // 内部クロック使用
 12 #pragma config WDTE = OFF       // ウォッチドッグ不使用
 13 #pragma config PWRTE = ON       // パワーアップタイマ
 14 #pragma config MCLRE = ON       // リセットピン
 15 #pragma config CP = OFF         // プログラムメモリ保護
 16 #pragma config CPD = OFF        // データメモリ保護
 17 #pragma config BOREN = ON       // 電源電圧監視
 18 #pragma config CLKOUTEN = OFF   // クロック出力
 19 #pragma config IESO = ON        // クロック切替
 20 #pragma config FCMEN = OFF      // 外部クロック監視
 21 
 22 // CONFIG2
 23 #pragma config WRT = OFF        // フラッシュメモリ保護
 24 #pragma config PLLEN = ON       // 4xPLLの作動
 25 #pragma config STVREN = ON      // スタック時のリセット
 26 #pragma config BORV = LO        // リセット電圧
 27 #pragma config LVP = OFF        // 停電圧プログラミング
 28 
 29 void main()
 30 {
 31     unsigned int spe ;          // デューティ比変数の宣言
 32     
 33     OSCCON = 0b01110010;        // 内部クロック 8MHz設定
 34     ANSELA = 0b00000000;        // I/Oはすべてディジタル使用
 35     ANSELB = 0b00000000;        // I/Oはすべてディジタル使用
 36     TRISA  = 0b10000010;        // I/Oの入出力設定
 37     TRISB  = 0b00001100;        // I/Oの入出力設定
 38     PORTA  = 0b00000000;        // I/Oの初期値設定
 39     PORTB  = 0b00001100;        // I/Oの初期値設定
 40     CCPTMRS = 0b00000000;       // PWM制御タイマ指定
 41     CCP3CON = 0b00001100;       // PWM制御使用宣言
 42     T2CON = 0b00000010;         // プリスケーラ値の設定
 43     PR2 = 124;          // PWMの周期設定 1kHz
 44     CCPR3L = 0;         // カウンタの初期化
 45     CCPR3H = 0;         // カウンタの初期化
 46     TMR2  = 0;          // タイマーの初期化
 47     TMR2ON = 1;         // PWM機能のスタート
 48     
 49     CCPR3L = 0;       // デューティ比0%
 50     RA1 = 0;
 51     RA2 = 0;            // 給電OFF
 52     RA7 = 0;
 53     RA0 = 0;
 54     
 55     RB1 = 1;                //ポイントを反位に
 56     __delay_ms(500);
 57     RB0 = 1;
 58     __delay_ms(1000);
 59     RB1 = 0;                //ポイントを定位に
 60     __delay_ms(500);
 61     RB0 = 0;
 62     __delay_ms(1000);
 63     
 64     while(1){
 65         while(RA7 == 0){        //運行開始を待つ
 66             __delay_ms(50);
 67         }
 68         
 69         RA2 = 1;                // 発車のため給電開始
 70         for(spe =0; spe<256; spe++){   //加速開始
 71             CCPR3L = spe ;      // デューティ比出力
 72             __delay_ms(5); 
 73         }
 74         __delay_ms(2000);       //通過するまで2秒待つ
 75         
 76         while(RB2 == 1){        //列車が来るまで待つ
 77             __delay_ms(50);
 78         }
 79         __delay_ms(2000);       //通過するまで2秒待つ
 80         
 81         while(RB2 == 1){        //列車が来るまで待つ
 82             __delay_ms(50);
 83         }
 84         for(spe=255; spe>-1; spe--){    // 停車のため減速開始
 85             CCPR3L = spe ;       // デューティ比出力
 86             __delay_ms(5);
 87         }
 88         RA2 = 0;                // 給電停止
 89         __delay_ms(2000);       //2秒待つ
 90         
 91         RA0 = 1;                //リバースモード
 92         while(RB3 == 1){        //S3ON
 93             __delay_ms(50);
 94         }
 95         RA0 = 0;
 96         __delay_ms(500);       //2秒待つ
 97         
 98         RA2 = 1;                // 発車のため給電開始
 99         for(spe =0; spe<256; spe++){   //加速開始
100             CCPR3L = spe ;      // デューティ比出力
101             __delay_ms(5); 
102         }
103         
104         __delay_ms(1000);       //ポイント操作を待つ
105         RB0 = 1;                //ポイントを反位に
106             __delay_ms(500);
107         RB1 = 1;
108             __delay_ms(500);
109             
110         while(RB2 == 1){         //列車が来るまで待つ
111             __delay_ms(50);
112         }
113         for(spe=255; spe>-1; spe--){    // 停車のため減速開始
114             CCPR3L = spe ;       // デューティ比出力
115             __delay_ms(5);
116         }
117         RA2 = 0;                // 給電停止
118         
119         while(RA1 == 0){        //通信がON
120             __delay_ms(50);
121         }
122         
123         RB0 = 0;                //ポイントを定位に
124             __delay_ms(500);
125         RB1 = 0;
126             __delay_ms(500);
127          
128         while(RA1 == 1){        //通信がOFF
129             __delay_ms(50);
130         }
131     }
132 }
133 
134