1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 |
|
5 |
|
6 | ///////////////////////////////////////////////////
|
7 | // Global variables
|
8 |
|
9 | volatile uint8_t overflow_flag = 0; //timer ovf Flag
|
10 | volatile uint8_t ng_flag = 0; //nachglüh Flag
|
11 | uint16_t counter = 0;
|
12 | uint16_t vorglueh_end = 0;
|
13 | uint16_t nachglueh_end = 0;
|
14 | volatile uint16_t adc_value = 0;
|
15 |
|
16 |
|
17 |
|
18 |
|
19 | //////////////////////////////////////////////////////
|
20 | // Main Programm
|
21 | int main(void)
|
22 | {
|
23 |
|
24 |
|
25 | // Input/Output Ports initialization
|
26 | // Port B initialization
|
27 |
|
28 | PORTB=0x00;
|
29 | DDRB |= ((1<<PB2)|(1<<PB0)); //PB2 auf Ausgang (glüherzen), PB0 Ausgang LED
|
30 | DDRB &= ~((1<<PB1)|(1<<PB3)); //PB0, PB3 auf Eingang (ADC3, INT0)
|
31 |
|
32 |
|
33 | //Interrupt0 (Klemme 50 = Anlassen) initialisieren
|
34 | MCUCR |= (1<<ISC01)|(1<<ISC00); //Rising Edge triggered
|
35 | GIMSK |= (1<<INT0); //Interrupt enable
|
36 |
|
37 | //ADC initialisieren
|
38 |
|
39 | ADCSRA |= (1<<ADEN)|(1<<ADPS1)|(1<<ADPS2); //ADC enable, prescaler 64
|
40 | ADMUX |= (1<<ADLAR)|(1<<MUX1)|(1<<MUX0); //left adjust, PB3 = ADC Port
|
41 |
|
42 |
|
43 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
44 | while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten
|
45 | ;
|
46 | adc_value = ADCH;
|
47 | adc_value = 0; //messung verwerfen, da die erste messung ungenau ist
|
48 |
|
49 |
|
50 |
|
51 | // Timer/Counter 0 initialization
|
52 |
|
53 | TCCR0A |= (1<<WGM01); //ctc mode
|
54 | OCR0A = 150;
|
55 | TCCR0B = (1<<CS00)|(1<<CS02); //Prescaler = und Timer starten
|
56 | TIMSK0 |= (1<<OCIE0A); //Output Compare Interrupt
|
57 |
|
58 | sei(); // Global enable interrupts
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 | //4x ADC auslesen und Mittelwert bilden
|
65 |
|
66 | /* ADC Mehrfachmessung mit Mittelwertbbildung */
|
67 |
|
68 | for (uint8_t i = 0; i < 4; ++i ){
|
69 |
|
70 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
71 | while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten
|
72 | ;
|
73 | adc_value += ADCH;
|
74 | } //End for(...)
|
75 |
|
76 | adc_value = adc_value/4;
|
77 |
|
78 |
|
79 |
|
80 | //fallunterscheidung - glühzeiten in abhängigkeit vom ADC Wert, vg_end = 64 entspricht einer Sekunde
|
81 | if(adc_value > 230) {
|
82 | vorglueh_end = 640; //entspricht 10sek. glühen
|
83 | nachglueh_end = 320; //entspricht 5sek. nachglühen
|
84 | }
|
85 |
|
86 |
|
87 |
|
88 |
|
89 |
|
90 | PORTB |= (1<<PB2); //Glühkerzen einschalten
|
91 | //TODO Glüh-LED einschalten
|
92 |
|
93 |
|
94 | for (;;) { // Endlos Schleife
|
95 |
|
96 |
|
97 | ////vorglühtimer
|
98 | ////////////////
|
99 | if((overflow_flag == 1)&&(ng_flag == 0))
|
100 | {
|
101 | overflow_flag = 0; //zurücksetzen
|
102 | counter++;
|
103 |
|
104 |
|
105 |
|
106 | if(counter == vorglueh_end)
|
107 | {
|
108 | counter = 0;
|
109 | PORTB &= ~(1<<PB2); //Glühkerzen ausschalten
|
110 | //TODO LED ausschalten
|
111 | }
|
112 |
|
113 | } //ende if(overflow...)
|
114 |
|
115 |
|
116 |
|
117 | ////nachglühtimer
|
118 | /////////////////
|
119 | if((overflow_flag == 1)&&(ng_flag == 1))
|
120 | {
|
121 |
|
122 | overflow_flag = 0; //zurücksetzen
|
123 | counter++;
|
124 |
|
125 |
|
126 | //TODO Vorglüh-LED Blinker einfügen
|
127 |
|
128 |
|
129 | if(counter == nachglueh_end)
|
130 | {
|
131 | PORTB &= ~(1<<PB2); //Glühkerzen ausschalten
|
132 | //TODO Vorglüh-LED ausschalten
|
133 | counter = 0;
|
134 | TCCR0B &= ~((1<<CS00)|(1<<CS02)); //Timer anhalten
|
135 | cli(); //interrupts ausschalten
|
136 |
|
137 | }
|
138 |
|
139 | } //ende if(overflow...)
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 | }//ende for()
|
147 | } //ende main()
|
148 |
|
149 |
|
150 | //////////////////////////////////////////////////////////////
|
151 | ///////// ISR Routinen
|
152 |
|
153 |
|
154 | ISR(TIM0_COMPA_vect)
|
155 | {
|
156 | overflow_flag = 1;
|
157 | }
|
158 |
|
159 |
|
160 |
|
161 |
|
162 | ISR(INT0_vect)
|
163 | {
|
164 |
|
165 | if(nachglueh_end==0) { //nachglühen nicht erforderlich
|
166 | TCCR0B &= ~((1<<CS00)|(1<<CS02)); //Timer anhalten
|
167 | PORTB &= ~(1<<PB2); //Glühkerzen ausschalten
|
168 | }
|
169 |
|
170 |
|
171 | else { //es muss nachgeglüht werden
|
172 | PORTB |= (1<<PB2); //Glühkerzen einschalten
|
173 | counter = 0; //zähler zurücksetzen
|
174 | ng_flag = 1;
|
175 | }
|
176 |
|
177 | }
|