C:\Users\meito\MPLABXProjects\Takujo-14-4.X\Takujo-14-4.c
  1 /*****************************************
  2 *   Takujo-14-4 (内周用改)
  3 *           2020/1/25
  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  = 0b10001100;        // 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     RA0 = 0;        //通信出力OFF
 51     RA1 = 0;        //通信入力OFF
 52     RA2 = 0;        //給電OFF
 53     RA7 = 0;        //運行開始OFF
 54     RB6 = 0;        //G消灯
 55     RB5 = 0;        //Y消灯
 56     RB4 = 1;        //R点灯
 57     
 58     __delay_ms(300);
 59     RB1 = 1;                //ポイントを反位に
 60     __delay_ms(500);
 61     RB0 = 1;
 62     __delay_ms(1000);
 63     RB1 = 0;                //ポイントを正位に
 64     __delay_ms(500);
 65     RB0 = 0;
 66     __delay_ms(500);
 67     
 68     while(1){
 69         while(RA7 == 0){        //運行開始を待つ
 70             __delay_ms(50);
 71         }
 72         RB4 = 0;
 73         RB6 = 1;            //緑点灯
 74         
 75         RA2 = 1;                // 発車のため給電開始
 76         for(spe =0; spe<256; spe++){   //加速開始
 77             CCPR3L = spe ;      // デューティ比出力
 78             __delay_ms(5); 
 79         }
 80         
 81         while(RB7 == 1){        //列車が来るまで待つ
 82             __delay_ms(10);
 83         }
 84         RB6 = 0;
 85         RB4 = 1;            //赤点灯
 86         
 87         while(RB3 == 1){        //S4ON? 列車が来るまで待つ
 88             if(RB7 == 0){
 89                 RB4 = 0;
 90                 RB5 = 1;        //橙点灯
 91             }
 92             __delay_ms(10);
 93         }
 94         RB5 = 0;
 95         RB6 = 1;            //緑点灯
 96         
 97         while(RB2 == 1){        //S2ON? 列車が来るまで待つ
 98             __delay_ms(10);
 99         }                       //駅を通過
100         
101         while(RB7 == 1){        //列車が来るまで待つ
102             __delay_ms(10);
103         }
104         RB6 = 0;
105         RB4 = 1;            //赤点灯
106         
107         while(RB3 == 1){        //S4ON? 列車が来るまで待つ
108             if(RB7 == 0){
109                 RB4 = 0;
110                 RB5 = 1;        //橙点灯
111             }
112             __delay_ms(10);
113         }
114                
115         while(RB2 == 1){        //S2ON? 列車が来るまで待つ
116             __delay_ms(10);
117         }
118         RB5 = 0;
119         RB4 = 1;            //赤点灯
120 
121         for(spe=255; spe>-1; spe--){    // 停車のため減速開始
122             CCPR3L = spe ;       // デューティ比出力
123             __delay_ms(5);
124         }
125         RA2 = 0;                // 給電停止
126         
127         __delay_ms(2000);       //2秒待つ
128         
129         while(RA1 == 0){        //リバースモードスタート?
130             __delay_ms(10);
131         }
132         
133         RB4 = 0;
134         RB6 = 1;                //緑点灯
135         RB1 = 1;                //P4ポイントを反位に
136             __delay_ms(500);
137         RB0 = 1;                //P1ポイントを反位に
138             __delay_ms(500);
139             
140         RA2 = 1;                // 発車のため給電開始
141         for(spe =0; spe<256; spe++){   //加速開始
142             CCPR3L = spe ;      // デューティ比出力
143             __delay_ms(5); 
144         }
145         
146         while(RA1 == 1){        //通信がOFF
147             if (RB7 == 1){
148                 RB6 = 0;
149                 RB5 = 0;
150                 RB4 = 1;        //赤点灯
151             }
152             __delay_ms(10);
153         }
154         
155         RB0 = 0;                //ポイントP1を正位に
156             __delay_ms(500);    
157         RB1 = 0;                //ポイントP4を正位に
158             __delay_ms(500);
159         
160         while(RB3 == 1){        //S4ON
161             __delay_ms(10);
162         }
163         RA0 = 1;                //通信をON
164         
165         while(RB2 == 1){         //S2ON? 列車が来るまで待つ
166             __delay_ms(10);
167         }
168         for(spe=255; spe>-1; spe--){    // 停車のため減速開始
169             CCPR3L = spe ;       // デューティ比出力
170             __delay_ms(5);
171         }
172         RA2 = 0;                // 給電停止
173         RA0 = 0;                //通信をOFF、リバース終了
174         
175         __delay_ms(2000);       //2秒待つ
176         
177     }
178 }
179 
180