C:\Users\meito\MPLABXProjects\Takujo-14-3.X\Takujo-14-3.c |
1 /*****************************************
2
3
4
5
6 #include <xc.h>
7
8 #define _XTAL_FREQ 8000000
9
10
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