1 | #include "config.h"
|
2 | #include <xc.h>
|
3 | #include <pic16f688.h>
|
4 | /* Zimmerbeleuchtung fuer das Haus */
|
5 | #define RAUM_1a PORTAbits.RA0
|
6 | /* 1. LED fuer Raum 1 liegt an Port A RA0 */
|
7 | #define RAUM_1b PORTAbits.RA1
|
8 | /* 2. LED fuer Raum 1 liegt an Port A RA1 */
|
9 | #define RAUM_2a PORTCbits.RC1
|
10 | /* 1. LED fuer Raum 2 liegt an Port C RC1 */
|
11 | #define RAUM_2b PORTCbits.RC2
|
12 | /* 2. LED fuer Raum 2 liegt an Port C RC2 */
|
13 | #define RAUM_3a PORTCbits.RC3
|
14 | /* 1. LED fuer Raum 3 liegt an Port C RC3 */
|
15 | #define RAUM_3b PORTCbits.RC4
|
16 | /* 2. LED fuer Raum 3 liegt an Port C RC4 */
|
17 | #define DGa PORTAbits.RA3
|
18 | /* 1. LED fuer DG liegt an Port A RA3 */
|
19 | #define DGb PORTCbits.RC5
|
20 | /* 2. LED fuer DG liegt an Port C RC5 */
|
21 | /* Status der Beleuchtung der Zimmer */
|
22 | #define EINGANG 0
|
23 | #define EINGANG_KUECHE 1
|
24 | #define EINGANG_KUECHE_AUSGANG 2
|
25 | #define KUECHE_AUSGANG 3
|
26 | #define KUECHE 4
|
27 | #define KUECHE_DG 5
|
28 | #define DG_ABEND 6
|
29 | #define NACHT 7
|
30 | #define DG_MORGEN 8
|
31 | #define KUECHE_DG_MORGEN 9
|
32 | #define KUECHE_MORGEN 10
|
33 | #define KUECHE_EINGANG_MORGEN 11
|
34 | #define KUECHE_EINGANG_AUSGANG_MORGEN 12
|
35 | #define KUECHE_EINGANG_ZWEI 13
|
36 | #define EINGANG_MORGEN 14
|
37 | #define ARBEIT 15
|
38 | /* PROTOTYPES */
|
39 | void allLEDoff(void);
|
40 | void initTimer0(void);
|
41 | void restartTimer0(void);
|
42 | void wait(int seconds);
|
43 | /* HAUPTPROGRAMM */
|
44 | void main(void) /* hier faengt das Programm an */
|
45 | {
|
46 | char state = EINGANG;
|
47 | allLEDoff(); /* alle LED's ausschalten */
|
48 | TRISA = 0x00;
|
49 | TRISC = 0x00;
|
50 | initTimer0(); /* initialisiert den Timer */
|
51 | while (1)
|
52 | {
|
53 | /* Hauptschleife */
|
54 | switch (state)
|
55 | {
|
56 | case EINGANG:
|
57 | RAUM_1a = 1;
|
58 | RAUM_1b = 1;
|
59 | RAUM_2a = 0;
|
60 | RAUM_2b = 0;
|
61 | RAUM_3a = 0;
|
62 | RAUM_3b = 0;
|
63 | DGa = 0;
|
64 | DGb = 0;
|
65 | wait(5);
|
66 | state = EINGANG_KUECHE; /* naechster Zustand ist Eingangszimmer und Kueche */
|
67 | break;
|
68 | case EINGANG_KUECHE:
|
69 | RAUM_1a = 1;
|
70 | RAUM_1b = 1;
|
71 | RAUM_2a = 1;
|
72 | RAUM_2b = 1;
|
73 | RAUM_3a = 0;
|
74 | RAUM_3b = 0;
|
75 | DGa = 0;
|
76 | DGb = 0;
|
77 | wait(5);
|
78 | state = EINGANG_KUECHE_AUSGANG; /* naechster Zustand ist ALLE Zimmer im EG */
|
79 | break;
|
80 | case EINGANG_KUECHE_AUSGANG:
|
81 | RAUM_1a = 1;
|
82 | RAUM_1b = 1;
|
83 | RAUM_2a = 1;
|
84 | RAUM_2b = 1;
|
85 | RAUM_3a = 1;
|
86 | RAUM_3b = 1;
|
87 | DGa = 0;
|
88 | DGb = 0;
|
89 | wait(5);
|
90 | state = KUECHE_AUSGANG; /* naechster Zustand ist Kueche und Ausgang */
|
91 | break;
|
92 | case KUECHE_AUSGANG:
|
93 | RAUM_1a = 0;
|
94 | RAUM_1b = 0;
|
95 | RAUM_2a = 1;
|
96 | RAUM_2b = 1;
|
97 | RAUM_3a = 1;
|
98 | RAUM_3b = 1;
|
99 | DGa = 0;
|
100 | DGb = 0;
|
101 | wait(5);
|
102 | state = KUECHE; /* naechster Zustand ist Kueche */
|
103 | break;
|
104 | case KUECHE:
|
105 | RAUM_1a = 0;
|
106 | RAUM_1b = 0;
|
107 | RAUM_2a = 1;
|
108 | RAUM_2b = 1;
|
109 | RAUM_3a = 0;
|
110 | RAUM_3b = 0;
|
111 | DGa = 0;
|
112 | DGb = 0;
|
113 | wait(5);
|
114 | state = KUECHE_DG; /* naechster Zustand ist Kueche und DG */
|
115 | break;
|
116 | case KUECHE_DG:
|
117 | RAUM_1a = 0;
|
118 | RAUM_1b = 0;
|
119 | RAUM_2a = 1;
|
120 | RAUM_2b = 1;
|
121 | RAUM_3a = 0;
|
122 | RAUM_3b = 0;
|
123 | DGa = 1;
|
124 | DGb = 1;
|
125 | wait(5);
|
126 | state = DG_ABEND; /* naechster Zustand ist DG abends */
|
127 | break;
|
128 | case DG_ABEND:
|
129 | RAUM_1a = 0;
|
130 | RAUM_1b = 0;
|
131 | RAUM_2a = 0;
|
132 | RAUM_2b = 0;
|
133 | RAUM_3a = 0;
|
134 | RAUM_3b = 0;
|
135 | DGa = 1;
|
136 | DGb = 1;
|
137 | wait(10);
|
138 | state = NACHT; /* naechster Zustand ist Nacht - alle schlafen */
|
139 | break;
|
140 | case NACHT:
|
141 | RAUM_1a = 0;
|
142 | RAUM_1b = 0;
|
143 | RAUM_2a = 0;
|
144 | RAUM_2b = 0;
|
145 | RAUM_3a = 0;
|
146 | RAUM_3b = 0;
|
147 | DGa = 0;
|
148 | DGb = 0;
|
149 | wait(20);
|
150 | state = DG_MORGEN; /* naechster Zustand ist DG Morgens */
|
151 | break;
|
152 | case DG_MORGEN:
|
153 | RAUM_1a = 0;
|
154 | RAUM_1b = 0;
|
155 | RAUM_2a = 0;
|
156 | RAUM_2b = 0;
|
157 | RAUM_3a = 0;
|
158 | RAUM_3b = 0;
|
159 | DGa = 1;
|
160 | DGb = 1;
|
161 | wait(7);
|
162 | state = KUECHE_DG_MORGEN; /* naechster Zustand ist DG + Kueche Morgens */
|
163 | break;
|
164 | case KUECHE_DG_MORGEN:
|
165 | RAUM_1a = 0;
|
166 | RAUM_1b = 0;
|
167 | RAUM_2a = 1;
|
168 | RAUM_2b = 1;
|
169 | RAUM_3a = 0;
|
170 | RAUM_3b = 0;
|
171 | DGa = 1;
|
172 | DGb = 1;
|
173 | wait(3);
|
174 | state = KUECHE_MORGEN; /* naechster Zustand ist nur Kueche Morgens */
|
175 | break;
|
176 | case KUECHE_MORGEN:
|
177 | RAUM_1a = 0;
|
178 | RAUM_1b = 0;
|
179 | RAUM_2a = 1;
|
180 | RAUM_2b = 1;
|
181 | RAUM_3a = 0;
|
182 | RAUM_3b = 0;
|
183 | DGa = 0;
|
184 | DGb = 0;
|
185 | wait(7);
|
186 | state = KUECHE_EINGANG_MORGEN; /* naechster Zustand ist Kueche und Eingang Morgens */
|
187 | break;
|
188 | case KUECHE_EINGANG_MORGEN:
|
189 | RAUM_1a = 1;
|
190 | RAUM_1b = 1;
|
191 | RAUM_2a = 1;
|
192 | RAUM_2b = 1;
|
193 | RAUM_3a = 0;
|
194 | RAUM_3b = 0;
|
195 | DGa = 0;
|
196 | DGb = 0;
|
197 | wait(5);
|
198 | state = KUECHE_EINGANG_AUSGANG_MORGEN; /* naechster Zustand ist alle EG Morgens */
|
199 | break;
|
200 | case KUECHE_EINGANG_AUSGANG_MORGEN:
|
201 | RAUM_1a = 1;
|
202 | RAUM_1b = 1;
|
203 | RAUM_2a = 1;
|
204 | RAUM_2b = 1;
|
205 | RAUM_3a = 1;
|
206 | RAUM_3b = 1;
|
207 | DGa = 0;
|
208 | DGb = 0;
|
209 | wait(3);
|
210 | state = KUECHE_EINGANG_ZWEI; /* naechster Zustand ist Kueche und Eingang Zwei */
|
211 | break;
|
212 | case KUECHE_EINGANG_ZWEI:
|
213 | RAUM_1a = 1;
|
214 | RAUM_1b = 1;
|
215 | RAUM_2a = 1;
|
216 | RAUM_2b = 1;
|
217 | RAUM_3a = 0;
|
218 | RAUM_3b = 0;
|
219 | DGa = 0;
|
220 | DGb = 0;
|
221 | wait(5);
|
222 | state = EINGANG_MORGEN; /* naechster Zustand ist Eingangszimmer Morgens */
|
223 | break;
|
224 | case EINGANG_MORGEN:
|
225 | RAUM_1a = 1;
|
226 | RAUM_1b = 1;
|
227 | RAUM_2a = 0;
|
228 | RAUM_2b = 0;
|
229 | RAUM_3a = 0;
|
230 | RAUM_3b = 0;
|
231 | DGa = 0;
|
232 | DGb = 0;
|
233 | wait(3);
|
234 | state = ARBEIT; /* naechster Zustand ist Arbeit */
|
235 | break;
|
236 | case ARBEIT:
|
237 | RAUM_1a = 0;
|
238 | RAUM_1b = 0;
|
239 | RAUM_2a = 0;
|
240 | RAUM_2b = 0;
|
241 | RAUM_3a = 0;
|
242 | RAUM_3b = 0;
|
243 | DGa = 0;
|
244 | DGb = 0;
|
245 | wait(30);
|
246 | state = EINGANG; /* naechster Zustand ist Eingangszimmer */
|
247 | break;
|
248 | default:
|
249 | /* sollte nie vorkommen */
|
250 | RAUM_1a = 1;
|
251 | RAUM_1b = 1;
|
252 | RAUM_2a = 0;
|
253 | RAUM_2b = 0;
|
254 | RAUM_3a = 0;
|
255 | RAUM_3b = 0;
|
256 | DGa = 0;
|
257 | DGb = 0;
|
258 | state = EINGANG;
|
259 | break;
|
260 | }
|
261 | }
|
262 | }
|
263 |
|
264 | void allLEDoff(void)
|
265 | {
|
266 | PORTA = 0x00; /* LED's an Port A ausschalten */
|
267 | PORTC = 0x00; /* LED's an Port C ausschalten */
|
268 | }
|
269 |
|
270 | /* Initialisiert den Timer 1 fuer einen Sekundentakt */
|
271 | void initTimer0(void)
|
272 | {
|
273 | PIE1bits.TMR1IE = 0; /* Timer Interrupt aus */
|
274 | T1CONbits.TMR1ON = 0; /* Timer aus zum Verstellen */
|
275 | OSCCON = 0b01010001; /* Takt 2 MHz aus internem Oszillator */
|
276 | /* Timer 1 ist ein 16-bit-Timer */
|
277 | T1CON = 0b00110100;
|
278 | /* Prescaler = 1:8 -> 62,5 kHz */
|
279 | }
|
280 |
|
281 | /* Startet den Timer neu */
|
282 | void restartTimer0(void)
|
283 | {
|
284 | /* Timer Wert fuer 1s ist 65536 - 62500 = 3036 */
|
285 | T1CONbits.TMR1ON = 0; /* Timer aus zum Verstellen */
|
286 | TMR1 = 3036;
|
287 | T1CONbits.TMR1ON = 1;
|
288 | PIR1bits.TMR1IF = 0; /* Flag loeschen */
|
289 | }
|
290 |
|
291 | /* wartet fuer die angegebene Anzahl von Sekunden */
|
292 | void wait(int seconds)
|
293 | {
|
294 | int i;
|
295 | /* prueft, ob der Timer uebergelaufen ist */
|
296 | for (i = 0; i < seconds; i++)
|
297 | {
|
298 | restartTimer0();
|
299 | /* warten, bis der Timer uebergelaufen ist */
|
300 | while (PIR1bits.TMR1IF == 0);
|
301 | }
|
302 | }
|