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