C:\Users\meito\MPLABXProjects\Takujo-13-3.X\Takujo-13-3.c
  1 /*****************************************
  2 *   Takujo-13-3E(内周用)
  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     __delay_ms(300);
 56     RB1 = 1;                //ポイントを反位に
 57     __delay_ms(500);
 58     RB0 = 1;
 59     __delay_ms(1000);
 60     RB1 = 0;                //ポイントを定位に
 61     __delay_ms(500);
 62     RB0 = 0;
 63     __delay_ms(500);
 64     
 65     while(1){
 66         while(RA7 == 0){        //運行開始を待つ
 67             __delay_ms(50);
 68         }
 69         
 70         RA2 = 1;                // 発車のため給電開始
 71         for(spe =0; spe<256; spe++){   //加速開始
 72             CCPR3L = spe ;      // デューティ比出力
 73             __delay_ms(5); 
 74         }
 75         __delay_ms(2000);       //通過するまで2秒待つ
 76         
 77         while(RB2 == 1){        //列車が来るまで待つ
 78             __delay_ms(10);
 79         }
 80         __delay_ms(2000);       //通過するまで2秒待つ
 81         
 82         while(RB2 == 1){        //列車が来るまで待つ
 83             __delay_ms(10);
 84         }
 85         for(spe=255; spe>-1; spe--){    // 停車のため減速開始
 86             CCPR3L = spe ;       // デューティ比出力
 87             __delay_ms(5);
 88         }
 89         RA2 = 0;                // 給電停止
 90         
 91         __delay_ms(2000);       //2秒待つ
 92         
 93         while(RA1 == 0){        //リバースモードスタート
 94             __delay_ms(10);
 95         }
 96         
 97         RB1 = 1;                //ポイントを反位に
 98             __delay_ms(500);
 99         RB0 = 1;
100             __delay_ms(500);
101             
102         RA2 = 1;                // 発車のため給電開始
103         for(spe =0; spe<256; spe++){   //加速開始
104             CCPR3L = spe ;      // デューティ比出力
105             __delay_ms(5); 
106         }
107         
108         while(RA1 == 1){        //通信がOFF
109             __delay_ms(50);
110         }
111       
112         __delay_ms(500);       //0.5秒待つ
113         RB1 = 0;                //ポイントを定位に
114             __delay_ms(500);
115         RB0 = 0;
116             __delay_ms(500);    
117         
118         while(RB3 == 1){         //S4
119             __delay_ms(50);
120         }
121         RA0 = 1;                //通信をON
122         
123         while(RB2 == 1){         //列車が来るまで待つ
124             __delay_ms(10);
125         }
126         for(spe=255; spe>-1; spe--){    // 停車のため減速開始
127             CCPR3L = spe ;       // デューティ比出力
128             __delay_ms(5);
129         }
130         RA2 = 0;                // 給電停止
131         
132         RA0 = 0;                //通信をOFF
133         
134         __delay_ms(2000);       //2秒待つ
135         
136     }
137 }
138 
139