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