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