Rev 470 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 470 | Rev 473 | ||
---|---|---|---|
1 | /* |
1 | /* |
2 | * Blitzdings main.c |
2 | * Blitzdings main.c |
3 | * (c) pangu |
3 | * (c) pangu |
4 | */ |
4 | */ |
5 | 5 | ||
6 | /******************************************************************/ |
6 | /******************************************************************/ |
7 | /* WICHTIG: Fusebits in Ponyprog für 8MHz setzen: |
7 | /* WICHTIG: Fusebits in Ponyprog für 8MHz setzen: |
8 | 8 | ||
9 | Häkchen in Ponyprog: |
9 | Häkchen in Ponyprog: |
10 | CKSEL3 gesetzt |
10 | CKSEL3 gesetzt |
11 | CKSEL2 nicht gesetzt |
11 | CKSEL2 nicht gesetzt |
12 | CKSEL1 gesetzt |
12 | CKSEL1 gesetzt |
13 | CKSEL0 gesetzt |
13 | CKSEL0 gesetzt |
14 | 14 | ||
15 | */ |
15 | */ |
16 | /******************************************************************/ |
16 | /******************************************************************/ |
17 | 17 | ||
18 | #include "main.h" |
18 | #include "main.h" |
19 | #include "timer.h" |
19 | #include "timer.h" |
20 | #include "lprg.h" |
20 | #include "lprg.h" |
21 | 21 | ||
22 | /* Strings zum definieren von Dauer-Ein Dauer-Aus */ |
22 | /* Strings zum definieren von Dauer-Ein Dauer-Aus */ |
23 | const char l_on[]="A"; |
23 | const char l_on[]="A"; |
24 | const char l_off[]="a"; |
24 | const char l_off[]="a"; |
25 | 25 | ||
26 | // Wait flags: |
26 | // Wait flags: |
27 | // . 10 ms |
27 | // . 10 ms |
28 | // : 20 ms |
28 | // : 20 ms |
29 | // ; 50 ms |
29 | // ; 50 ms |
30 | // I 100 ms |
30 | // I 100 ms |
31 | // N 200 ms |
31 | // N 200 ms |
32 | // M 300 ms |
32 | // M 300 ms |
33 | // V 500 ms |
33 | // V 500 ms |
34 | // S 1s |
34 | // S 1s |
35 | // LED: |
35 | // LED: |
36 | // A-an a-aus |
36 | // A-an a-aus |
37 | 37 | ||
38 | // Rot+Grün blitzen dreimal kurz, zeitlich leicht versetzt, alle 1,5s |
38 | // Rot+Grün blitzen dreimal kurz, zeitlich leicht versetzt, alle 1,5s |
39 | // 2 weisse und 2 blaue LEDs sind an und gehen alle 3s reihum kurz aus |
39 | // 2 weisse und 2 blaue LEDs sind an und gehen alle 3s reihum kurz aus |
40 | char *led_posflash1[] = { |
40 | char *led_posflash1[] = { |
41 | "A:aIA:aIA:aSV", // LED #1 rot |
41 | "A:aIA:aIA:aSV", // LED #1 rot |
42 | ".", // LED #2 |
42 | ".", // LED #2 |
43 | "NNaIASSNNN", // LED #3 blau |
43 | "NNaIASSNNN", // LED #3 blau |
44 | ".", // LED #4 |
44 | ".", // LED #4 |
45 | "NaIASSNNNN", // LED #5 weiss |
45 | "NaIASSNNNN", // LED #5 weiss |
46 | "NA:aIA:aIA:aMS", // LED #6 grün |
46 | "NA:aIA:aIA:aMS", // LED #6 grün |
47 | ".", // LED #7 |
47 | ".", // LED #7 |
48 | "aIASSNNNNN", // LED #8 weiss |
48 | "aIASSNNNNN", // LED #8 weiss |
49 | ".", // LED #9 |
49 | ".", // LED #9 |
50 | "NNNaIASSNN" // LED #10 blau |
50 | "NNNaIASSNN" // LED #10 blau |
51 | }; |
51 | }; |
52 | 52 | ||
53 | // dasselbe, nur sind w/b dauer-an |
53 | // dasselbe, nur sind w/b dauer-an |
54 | char *led_posflash[] = { |
54 | char *led_posflash[] = { |
55 | "A", // LED #1 rot |
55 | "A", // LED #1 rot |
56 | "A", // LED #2 |
56 | "A", // LED #2 |
57 | "A", // LED #3 blau |
57 | "A", // LED #3 blau |
58 | "A", // LED #4 |
58 | "A", // LED #4 |
59 | "A;aIA;aIA;aSV", // LED #5 weiss |
59 | "A;aIA;aIA;aSV", // LED #5 weiss |
60 | "NA;aIA;aIA;aMS", // LED #6 grün |
60 | "NA;aIA;aIA;aMS", // LED #6 grün |
61 | "A", // LED #7 |
61 | "A", // LED #7 |
62 | "A", // LED #8 weiss |
62 | "A", // LED #8 weiss |
63 | "A", // LED #9 |
63 | "A", // LED #9 |
64 | "A" // LED #10 blau |
64 | "A" // LED #10 blau |
65 | }; |
65 | }; |
66 | 66 | ||
67 | 67 | ||
68 | char *led_aus[] = { |
68 | char *led_aus[] = { |
69 | l_off, // LED #1 rot |
69 | l_off, // LED #1 rot |
70 | l_off, // LED #2 blau |
70 | l_off, // LED #2 blau |
71 | l_off, // LED #3 blau |
71 | l_off, // LED #3 blau |
72 | l_off, // LED #4 |
72 | l_off, // LED #4 |
73 | l_off, // LED #5 weiss |
73 | l_off, // LED #5 weiss |
74 | l_off, // LED #6 grün |
74 | l_off, // LED #6 grün |
75 | l_off, // LED #7 |
75 | l_off, // LED #7 |
76 | l_off, // LED #8 weiss |
76 | l_off, // LED #8 weiss |
77 | l_off, // LED #9 |
77 | l_off, // LED #9 |
78 | l_off // LED #10 |
78 | l_off // LED #10 |
79 | }; |
79 | }; |
80 | 80 | ||
81 | char *led_an[] = { |
81 | char *led_an[] = { |
82 | l_on, // LED #1 rot |
82 | l_on, // LED #1 rot |
83 | l_on, // LED #2 blau |
83 | l_on, // LED #2 blau |
84 | l_on, // LED #3 blau |
84 | l_on, // LED #3 blau |
85 | l_on, // LED #4 |
85 | l_on, // LED #4 |
86 | l_on, // LED #5 weiss |
86 | l_on, // LED #5 weiss |
87 | l_on, // LED #6 grün |
87 | l_on, // LED #6 grün |
88 | l_on, // LED #7 |
88 | l_on, // LED #7 |
89 | l_on, // LED #8 weiss |
89 | l_on, // LED #8 weiss |
90 | l_on, // LED #9 |
90 | l_on, // LED #9 |
91 | l_on // LED #10 |
91 | l_on // LED #10 |
92 | }; |
92 | }; |
93 | 93 | ||
94 | // alle LEDs toggeln synchron, 300ms Leucht/Aus-Dauer |
94 | // alle LEDs toggeln synchron, 300ms Leucht/Aus-Dauer |
95 | char *led_flash1[] = { |
95 | char *led_flash1[] = { |
96 | "aMAM", // LED #1 rot |
96 | "aMAM", // LED #1 rot |
97 | "aMAM", // LED #2 blau |
97 | "aMAM", // LED #2 blau |
98 | "aMAM", // LED #3 blau |
98 | "aMAM", // LED #3 blau |
99 | "aMAM", // LED #4 |
99 | "aMAM", // LED #4 |
100 | "aMAM", // LED #5 weiss |
100 | "aMAM", // LED #5 weiss |
101 | "aMAM", // LED #6 grün |
101 | "aMAM", // LED #6 grün |
102 | "aMAM", // LED #7 |
102 | "aMAM", // LED #7 |
103 | "aMAM", // LED #8 weiss |
103 | "aMAM", // LED #8 weiss |
104 | "aMAM", // LED #9 |
104 | "aMAM", // LED #9 |
105 | "aMAM" // LED #10 |
105 | "aMAM" // LED #10 |
106 | }; |
106 | }; |
107 | 107 | ||
108 | // low Volatage Warning: alle LEDs toggeln synchron, 100ms Leucht/Aus-Dauer |
108 | // low Volatage Warning: alle LEDs toggeln synchron, 100ms Leucht/Aus-Dauer |
109 | char *led_lowVolt[] = { |
109 | char *led_lowVolt[] = { |
110 | "aIAI", // LED #1 rot |
110 | "aIAI", // LED #1 rot |
111 | "aIAI", // LED #2 blau |
111 | "aIAI", // LED #2 blau |
112 | "aIAI", // LED #3 blau |
112 | "aIAI", // LED #3 blau |
113 | "aIAI", // LED #4 |
113 | "aIAI", // LED #4 |
114 | "aIAI", // LED #5 weiss |
114 | "aIAI", // LED #5 weiss |
115 | "aIAI", // LED #6 grün |
115 | "aIAI", // LED #6 grün |
116 | "aIAI", // LED #7 |
116 | "aIAI", // LED #7 |
117 | "aIAI", // LED #8 weiss |
117 | "aIAI", // LED #8 weiss |
118 | "aIAI", // LED #9 |
118 | "aIAI", // LED #9 |
119 | "aIAI" // LED #10 |
119 | "aIAI" // LED #10 |
120 | }; |
120 | }; |
121 | 121 | ||
122 | // alle LEDs toggeln mit verschiednen Zykluszeiten |
122 | // alle LEDs toggeln mit verschiednen Zykluszeiten |
123 | char *led_flash2[] = { |
123 | char *led_flash2[] = { |
124 | "ASIIaIAIaIaV", // LED #1 |
124 | "ASIIaIAIaIaV", // LED #1 |
125 | "ASIIaIAIaIaV", // LED #2 |
125 | "ASIIaIAIaIaV", // LED #2 |
126 | "aSIIIAIaIIIIAIaI", // LED #3 |
126 | "aSIIIAIaIIIIAIaI", // LED #3 |
127 | "aSIIIAIaIIIAIaII", // LED #4 |
127 | "aSIIIAIaIIIAIaII", // LED #4 |
128 | "aSIIIAIaIIAIaIII", // LED #5 |
128 | "aSIIIAIaIIAIaIII", // LED #5 |
129 | "aVSIAIaIII", // LED #6 |
129 | "aVSIAIaIII", // LED #6 |
130 | "aSIIIAIaIIIAIaII", // LED #7 |
130 | "aSIIIAIaIIIAIaII", // LED #7 |
131 | "aSIIIAIaIIIIAIaI", // LED #8 |
131 | "aSIIIAIaIIIIAIaI", // LED #8 |
132 | "aSIIIAIaI IIII AI", // LED #9 |
132 | "aSIIIAIaI IIII AI", // LED #9 |
133 | "aSIIIAIaI IIII AI" // LED #10 |
133 | "aSIIIAIaI IIII AI" // LED #10 |
134 | }; |
134 | }; |
135 | 135 | ||
136 | 136 | ||
137 | // Hier die zu verwendenden LichtProgramme einfach eintragen. |
137 | // Hier die zu verwendenden LichtProgramme einfach eintragen. |
138 | 138 | ||
139 | int current = 0; |
139 | int current = 0; |
140 | 140 | ||
141 | void *modes[]= { led_an, led_aus, led_posflash, led_flash2 }; |
141 | void *modes[]= { led_an, led_aus, led_posflash, led_flash2 }; |
142 | 142 | ||
143 | void nextMode(void) { |
143 | void nextMode(void) { |
144 | 144 | ||
145 | current = ++current % (sizeof(modes)/sizeof(void *)); |
145 | current = ++current % (sizeof(modes)/sizeof(void *)); |
146 | lprg_init(modes[current]); |
146 | lprg_init(modes[current]); |
147 | 147 | ||
148 | } |
148 | } |
149 | 149 | ||
150 | ISR(INT1_vect) |
150 | ISR(INT1_vect) |
151 | { |
151 | { |
- | 152 | static int doubleclick = 0; |
|
- | 153 | ||
- | 154 | if(doubleclick && !CheckDelay(doubleclick)) { |
|
- | 155 | nextMode(); |
|
- | 156 | } |
|
152 | 157 | ||
153 | nextMode(); |
158 | doubleclick = SetDelay(1000); |
154 | 159 | ||
155 | } |
160 | } |
156 | 161 | ||
157 | 162 | ||
158 | int main(void) { |
163 | int main(void) { |
159 | 164 | ||
160 | int tim1s, tim3s, tim10s, analog_state=0; |
165 | int tim1s, tim3s, tim10s, analog_state=0; |
161 | int Vcurr, lowVwarn_on = 0; |
166 | int Vcurr, lowVwarn_on = 0; |
162 | 167 | ||
163 | SFIOR = 0x00; // Analog Comperator aus |
168 | SFIOR = 0x00; // Analog Comperator aus |
164 | ADCSRA = 0xD3; // Converter ein, single |
169 | ADCSRA = 0xD3; // Converter ein, single |
165 | 170 | ||
166 | // Ports einstellen |
171 | // Ports einstellen |
167 | // Pin B |7|6|5|4|3|2|1|0 |
172 | // Pin B |7|6|5|4|3|2|1|0 |
168 | // Binär:|0|0|0|0|0|1|0|1 (b) => #05 (h) |
173 | // Binär:|0|0|0|0|0|1|0|1 (b) => #05 (h) |
169 | // Pin B0 und B2 als Ausgänge festlegen |
174 | // Pin B0 und B2 als Ausgänge festlegen |
170 | DDRB = 0x05; |
175 | DDRB = 0x05; |
171 | 176 | ||
172 | // Pin C |7|6|5|4|3|2|1|0 |
177 | // Pin C |7|6|5|4|3|2|1|0 |
173 | // Binär:|0|0|1|1|1|1|1|0 (b) => #3E (h) |
178 | // Binär:|0|0|1|1|1|1|1|0 (b) => #3E (h) |
174 | // Pin C1 bis C5 als Ausgänge festlegen |
179 | // Pin C1 bis C5 als Ausgänge festlegen |
175 | DDRC = 0x3E; |
180 | DDRC = 0x3E; |
176 | 181 | ||
177 | // Pin D |7|6|5|4|3|2|1|0 |
182 | // Pin D |7|6|5|4|3|2|1|0 |
178 | // Binär:|1|1|1|1|0|0|0|0 (b) => #F0 (h) |
183 | // Binär:|1|1|1|1|0|0|0|0 (b) => #F0 (h) |
179 | DDRD = 0xF0; |
184 | DDRD = 0xF0; |
180 | //Pullup für PD3 aktivieren |
185 | //Pullup für PD3 aktivieren |
181 | PORTD |= (1 << PD3); |
186 | PORTD |= (1 << PD3); |
182 | 187 | ||
183 | 188 | ||
184 | //interrupt konfigurueren |
189 | //interrupt konfigurueren |
185 | GIMSK = 1<<INT1; |
190 | GIMSK = 1<<INT1; |
186 | MCUCR = 1<<ISC10; |
191 | MCUCR = 1<<ISC10; |
187 | 192 | ||
188 | ALLES_OFF; |
193 | ALLES_OFF; |
189 | 194 | ||
190 | STATUS_ON; |
195 | STATUS_ON; |
191 | 196 | ||
192 | Timer_Init(); |
197 | Timer_Init(); |
193 | 198 | ||
194 | lprg_init(modes[current]); |
199 | lprg_init(modes[current]); |
195 | tim10s = SetDelay(20000); |
200 | tim10s = SetDelay(20000); |
196 | tim3s = SetDelay(3000); |
201 | tim3s = SetDelay(3000); |
197 | tim1s = SetDelay(1000); |
202 | tim1s = SetDelay(1000); |
198 | 203 | ||
199 | 204 | ||
200 | sei(); //interrupts einschalten |
205 | sei(); //interrupts einschalten |
201 | 206 | ||
202 | while (1) { |
207 | while (1) { |
203 | 208 | ||
204 | if(flag10ms) { // every 10ms |
209 | if(flag10ms) { // every 10ms |
205 | flag10ms = 0; |
210 | flag10ms = 0; |
206 | lprg_step(); // next step in light prog |
211 | lprg_step(); // next step in light prog |
207 | 212 | ||
208 | if(!analog_state) { // Sampling der SPannung starten |
213 | if(!analog_state) { // Sampling der SPannung starten |
209 | ADMUX = 0 | 0xC0; // Kanal 0, interne Referenz |
214 | ADMUX = 0 | 0xC0; // Kanal 0, interne Referenz |
210 | ADCSRA |= 0x10; // Ready löschen |
215 | ADCSRA |= 0x10; // Ready löschen |
211 | ADCSRA |= 0x40; // Start |
216 | ADCSRA |= 0x40; // Start |
212 | analog_state++; // erst wieder sampeln, wenn der Wert ausgelesen wurde |
217 | analog_state++; // erst wieder sampeln, wenn der Wert ausgelesen wurde |
213 | } |
218 | } |
214 | 219 | ||
215 | } |
220 | } |
216 | 221 | ||
217 | // 1s-Task: Status-LED toggeln, Spannung checken |
222 | // 1s-Task: Status-LED toggeln, Spannung checken |
218 | if(CheckDelay(tim1s)) { |
223 | if(CheckDelay(tim1s)) { |
219 | if (ADCSRA & 0x10) { // Spannungs-Messung beendet? |
224 | if (ADCSRA & 0x10) { // Spannungs-Messung beendet? |
220 | ADCSRA = 0xD3; |
225 | ADCSRA = 0xD3; |
221 | Vcurr = ADCW; // Wert merken |
226 | Vcurr = ADCW; // Wert merken |
222 | analog_state = 0; |
227 | analog_state = 0; |
223 | } |
228 | } |
224 | if(Vcurr < 180) { |
229 | if(Vcurr < 180) { |
225 | lprg_init(led_lowVolt); |
230 | lprg_init(led_lowVolt); |
226 | lowVwarn_on = 1; |
231 | lowVwarn_on = 1; |
227 | } |
232 | } |
228 | if(lowVwarn_on && Vcurr>=180) { |
233 | if(lowVwarn_on && Vcurr>=180) { |
229 | lprg_init(modes[current]); |
234 | lprg_init(modes[current]); |
230 | lowVwarn_on = 0; |
235 | lowVwarn_on = 0; |
231 | } |
236 | } |
232 | STATUS_TOGGLE; |
237 | STATUS_TOGGLE; |
233 | tim1s = SetDelay(1000); |
238 | tim1s = SetDelay(1000); |
234 | } |
239 | } |
235 | 240 | ||
236 | // 3s-Task: Unterspannungswarnung ggf. zurücknehmen |
241 | // 3s-Task: Unterspannungswarnung ggf. zurücknehmen |
237 | if(CheckDelay(tim3s)) { |
242 | if(CheckDelay(tim3s)) { |
238 | 243 | ||
239 | tim3s = SetDelay(3000); |
244 | tim3s = SetDelay(3000); |
240 | } |
245 | } |
241 | 246 | ||
242 | // 10s-Task: DEMO: programm wechseln |
247 | // 10s-Task: DEMO: programm wechseln |
243 | if(CheckDelay(tim10s)) { |
248 | if(CheckDelay(tim10s)) { |
244 | nextMode(); |
249 | nextMode(); |
245 | tim10s = SetDelay(10000); |
250 | tim10s = SetDelay(10000); |
246 | } |
251 | } |
247 | 252 | ||
248 | 253 | ||
249 | 254 | ||
250 | } |
255 | } |
251 | 256 | ||
252 | } |
257 | } |
253 | 258 | ||
254 | 259 | ||
255 | 260 | ||
256 | 261 | ||
257 | 262 | ||
258 | 263 |