1 | /*
|
2 | * Wasseruhr-Sensor.cpp
|
3 | *
|
4 | * Created: 28.01.2019 10:27:43
|
5 | * Author : Gregor
|
6 | */
|
7 | #define F_CPU 14745600UL
|
8 |
|
9 | #include <avr/io.h>
|
10 | #include <util/delay.h>
|
11 | #include <stdint.h>
|
12 | #include <stdio.h>
|
13 | #include <string.h>
|
14 | #include <avr/interrupt.h>
|
15 | #include ".\uart.h" // pfleury
|
16 | #define UART_BAUD_RATE 921600
|
17 |
|
18 |
|
19 | #define GeberDDR DDRG
|
20 | #define GeberPORT PORTG
|
21 | #define GeberPORTPin PG3
|
22 |
|
23 | #define LaserDDR DDRG
|
24 | #define LaserPORT PORTG
|
25 | #define LaserPORTPin PG4
|
26 |
|
27 | #define SensorDDR DDRF
|
28 | #define SensorPORT PORTF
|
29 | #define SensorPORTPin PF0
|
30 |
|
31 | #define UartDDR DDRE
|
32 | #define UartPORT PORTE
|
33 | #define UartRx PE0
|
34 | #define UartTx PE1
|
35 |
|
36 | #define MIN(a,b) (((a)<(b))?(a):(b))
|
37 | #define MAX(a,b) (((a)>(b))?(a):(b))
|
38 |
|
39 | void switchLaseron(void);
|
40 | void switchLaseroff(void);
|
41 | uint16_t readSensor(void);
|
42 |
|
43 | void switchLaseron() {
|
44 | LaserPORT |= (1 << LaserPORTPin);
|
45 | }
|
46 | void switchLaseroff() {
|
47 | LaserPORT &= ~(1 << LaserPORTPin);
|
48 | }
|
49 | uint16_t readSensor() {
|
50 | uint16_t wert1;
|
51 |
|
52 | ADMUX |= (0<<REFS1)|(1<<REFS0); // AVCC with external capacitor at AREF pin
|
53 | ADMUX |= (0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); // ADC0 ausgewählt
|
54 | ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // ADC PreScaler FCPU/128
|
55 |
|
56 | ADCSRA |= (1<<ADEN); // ADC enable
|
57 | wert1 = ADCW; // ADCW muss einmal gelesen werden, sonst wird Ergebnis
|
58 | wert1 = 0; // der nächsten Wandlung nicht übernommen.
|
59 |
|
60 | ADCSRA |= (1<<ADSC); // start single converson
|
61 | while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten
|
62 | wert1 = ADCW; // ADC auslesen und zurückgeben
|
63 | ADCSRA &= ~(1<<ADEN); // ADC disable
|
64 |
|
65 | return wert1 ;
|
66 | }
|
67 |
|
68 | uint16_t array_min ( uint16_t array[], uint8_t element_cnt ) {
|
69 |
|
70 | char buffer[70];
|
71 | sprintf(buffer, "\n\t\tarray_min() aufgerufen.\n"); uart_puts(buffer);
|
72 | sprintf(buffer, "\t\t\t element_cnt: %u\n", element_cnt); uart_puts(buffer);
|
73 |
|
74 | uint16_t min=2000;
|
75 |
|
76 | for ( uint8_t i=0;i<element_cnt;i++ ) {
|
77 | sprintf(buffer, "\t\t\tmin=MIN(min(%u) ),array[i(%u)](%u) ))\n",min,i,array[i] ); uart_puts(buffer);
|
78 |
|
79 | min=MIN(min,array[i]);
|
80 | }
|
81 | return min;
|
82 | }
|
83 | uint16_t array_max ( uint16_t array[], uint8_t element_cnt ) {
|
84 | uint16_t max=0;
|
85 |
|
86 | for ( uint8_t i=0;i<element_cnt;i++ ) {
|
87 | max=MAX(max, array[i]);
|
88 | }
|
89 | return max;
|
90 | }
|
91 | uint16_t array_avg ( uint16_t array[], uint8_t element_cnt ) {
|
92 | uint16_t avg=0;
|
93 |
|
94 | for ( uint8_t i=0;i<element_cnt;i++ ) {
|
95 | avg=avg + array[i];
|
96 | }
|
97 | return avg/element_cnt;
|
98 | }
|
99 |
|
100 |
|
101 | int main(void) {
|
102 | sei();
|
103 |
|
104 | { // Pin init
|
105 | LaserDDR |= (1 << LaserPORTPin); // Output
|
106 |
|
107 | GeberDDR |= (1 << GeberPORTPin); // Output
|
108 |
|
109 | SensorDDR &= ~( 1 << SensorPORTPin ); // 0 = Input
|
110 | SensorPORT &= ~( 1 << SensorPORTPin ); // 0 = kein PullUp
|
111 | }
|
112 |
|
113 |
|
114 | { // UART Initialisieren
|
115 | uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
|
116 | uart_puts("UART-Initialized\n\n");
|
117 | // _delay_ms(500);
|
118 | }
|
119 | uint16_t wert = 0;
|
120 | uint16_t letzter_wert_max = 500;
|
121 | uint16_t letzter_wert_min = 500;
|
122 | uint16_t wert_max[10] = {10,11,12,13,14,15,16,17,18,19};
|
123 | uint16_t wert_min[10] = {1000,1001,1002,1003,1004,1005,1006,1007,1008,1009};
|
124 | char buffer[30];
|
125 |
|
126 |
|
127 | sprintf(buffer, "\n\tDirekt nach Init:\n");uart_puts(buffer);
|
128 | sprintf(buffer, "\n\twert_min[0] %u\n",wert_min[0] );uart_puts(buffer);
|
129 | sprintf(buffer, "\twert_min[1] %u\n", wert_min[1] );uart_puts(buffer);
|
130 | sprintf(buffer, "\twert_min[2] %u\n", wert_min[2] );uart_puts(buffer);
|
131 | sprintf(buffer, "\twert_min[3] %u\n", wert_min[3] );uart_puts(buffer);
|
132 | sprintf(buffer, "\twert_min[4] %u\n", wert_min[4] );uart_puts(buffer);
|
133 | sprintf(buffer, "\twert_min[5] %u\n", wert_min[5] );uart_puts(buffer);
|
134 | sprintf(buffer, "\twert_min[6] %u\n", wert_min[6] );uart_puts(buffer);
|
135 | sprintf(buffer, "\twert_min[7] %u\n", wert_min[7] );uart_puts(buffer);
|
136 | sprintf(buffer, "\twert_min[8] %u\n", wert_min[8] );uart_puts(buffer);
|
137 | sprintf(buffer, "\twert_min[9] %u\n", wert_min[9] );uart_puts(buffer);
|
138 |
|
139 | sprintf(buffer, "\n\twert_max[0] %u\n",wert_max[0] );uart_puts(buffer);
|
140 | sprintf(buffer, "\twert_max[1] %u\n", wert_max[1] );uart_puts(buffer);
|
141 | sprintf(buffer, "\twert_max[2] %u\n", wert_max[2] );uart_puts(buffer);
|
142 | sprintf(buffer, "\twert_max[3] %u\n", wert_max[3] );uart_puts(buffer);
|
143 | sprintf(buffer, "\twert_max[4] %u\n", wert_max[4] );uart_puts(buffer);
|
144 | sprintf(buffer, "\twert_max[5] %u\n", wert_max[5] );uart_puts(buffer);
|
145 | sprintf(buffer, "\twert_max[6] %u\n", wert_max[6] );uart_puts(buffer);
|
146 | sprintf(buffer, "\twert_max[7] %u\n", wert_max[7] );uart_puts(buffer);
|
147 | sprintf(buffer, "\twert_max[8] %u\n", wert_max[8] );uart_puts(buffer);
|
148 | sprintf(buffer, "\twert_max[9] %u\n", wert_max[9] );uart_puts(buffer);
|
149 |
|
150 |
|
151 | sprintf(buffer, "\tsizeof(wert_min) %u\n",(sizeof(wert_min) / sizeof(wert_min[0]) ));uart_puts(buffer);
|
152 | sprintf(buffer, "\tsizeof(wert_max) %u\n",(sizeof(wert_max) / sizeof(wert_max[0]) ));uart_puts(buffer);
|
153 |
|
154 | sprintf(buffer, "\tarray_min(wert_min): %u\n", array_min(wert_min,(sizeof(wert_min) / sizeof(wert_min[0]))));uart_puts(buffer);
|
155 | sprintf(buffer, "\tarray_max(wert_min): %u\n", array_max(wert_min,(sizeof(wert_min) / sizeof(wert_min[0]))));uart_puts(buffer);
|
156 | sprintf(buffer, "\tarray_avg(wert_min): %u\n\n",array_avg(wert_min,(sizeof(wert_min) / sizeof(wert_min[0]))));uart_puts(buffer);
|
157 |
|
158 | sprintf(buffer, "\tarray_min(wert_max): %u\n", array_min(wert_max,(sizeof(wert_max) / sizeof(wert_max[0]))));uart_puts(buffer);
|
159 | sprintf(buffer, "\tarray_max(wert_max): %u\n", array_max(wert_max,(sizeof(wert_max) / sizeof(wert_max[0]))));uart_puts(buffer);
|
160 | sprintf(buffer, "\tarray_avg(wert_max): %u\n\n",array_avg(wert_max,(sizeof(wert_max) / sizeof(wert_max[0]))));uart_puts(buffer);
|
161 |
|
162 | // while (1)
|
163 | // {
|
164 | // }
|
165 |
|
166 | while (1)
|
167 | {
|
168 | _delay_ms(50);
|
169 |
|
170 | switchLaseron();
|
171 | _delay_us(100);
|
172 | wert = readSensor();
|
173 | switchLaseroff();
|
174 |
|
175 | sprintf(buffer, "Messwert %u\n",wert );
|
176 | uart_puts(buffer);
|
177 |
|
178 | if ( wert > letzter_wert_max ) { // jeder noch größere Wert wird zwischengespeichert und das letzte Minimum ins Array geschrieben
|
179 | sprintf(buffer, "\twert %u > letzter_wert_max %u \n",wert,letzter_wert_max );
|
180 | uart_puts(buffer);
|
181 |
|
182 | letzter_wert_max = wert;
|
183 |
|
184 | sprintf(buffer, "\n\tWerte vorher:\n");uart_puts(buffer);
|
185 | sprintf(buffer, "\n\twert_min[0] %u \t wert_max[0] %u\n", wert_min[0], wert_max[0]);uart_puts(buffer);
|
186 | sprintf(buffer, "\twert_min[1] %u \t wert_max[1] %u\n", wert_min[1], wert_max[1]);uart_puts(buffer);
|
187 | sprintf(buffer, "\twert_min[2] %u \t wert_max[2] %u\n", wert_min[2], wert_max[2]);uart_puts(buffer);
|
188 | sprintf(buffer, "\twert_min[3] %u \t wert_max[3] %u\n", wert_min[3], wert_max[3]);uart_puts(buffer);
|
189 | sprintf(buffer, "\twert_min[4] %u \t wert_max[4] %u\n", wert_min[4], wert_max[4]);uart_puts(buffer);
|
190 | sprintf(buffer, "\twert_min[5] %u \t wert_max[5] %u\n", wert_min[5], wert_max[5]);uart_puts(buffer);
|
191 | sprintf(buffer, "\twert_min[6] %u \t wert_max[6] %u\n", wert_min[6], wert_max[6]);uart_puts(buffer);
|
192 | sprintf(buffer, "\twert_min[7] %u \t wert_max[7] %u\n", wert_min[7], wert_max[7]);uart_puts(buffer);
|
193 | sprintf(buffer, "\twert_min[8] %u \t wert_max[8] %u\n", wert_min[8], wert_max[8]);uart_puts(buffer);
|
194 | sprintf(buffer, "\twert_min[9] %u \t wert_max[9] %u\n", wert_min[9], wert_max[9]);uart_puts(buffer);
|
195 |
|
196 | wert_min[0] = wert_min[1];
|
197 | wert_min[1] = wert_min[2];
|
198 | wert_min[2] = wert_min[3];
|
199 | wert_min[3] = wert_min[4];
|
200 | wert_min[4] = wert_min[5];
|
201 | wert_min[5] = wert_min[6];
|
202 | wert_min[6] = wert_min[7];
|
203 | wert_min[7] = wert_min[8];
|
204 | wert_min[8] = wert_min[9];
|
205 | wert_min[9] = letzter_wert_min;
|
206 |
|
207 | sprintf(buffer, "\n\tWerte nach einfügen von letzter_wert_min %u:\n", letzter_wert_min );uart_puts(buffer);
|
208 | sprintf(buffer, "\n\twert_min[0] %u \t wert_max[0] %u\n", wert_min[0], wert_max[0]);uart_puts(buffer);
|
209 | sprintf(buffer, "\twert_min[1] %u \t wert_max[1] %u\n", wert_min[1], wert_max[1]);uart_puts(buffer);
|
210 | sprintf(buffer, "\twert_min[2] %u \t wert_max[2] %u\n", wert_min[2], wert_max[2]);uart_puts(buffer);
|
211 | sprintf(buffer, "\twert_min[3] %u \t wert_max[3] %u\n", wert_min[3], wert_max[3]);uart_puts(buffer);
|
212 | sprintf(buffer, "\twert_min[4] %u \t wert_max[4] %u\n", wert_min[4], wert_max[4]);uart_puts(buffer);
|
213 | sprintf(buffer, "\twert_min[5] %u \t wert_max[5] %u\n", wert_min[5], wert_max[5]);uart_puts(buffer);
|
214 | sprintf(buffer, "\twert_min[6] %u \t wert_max[6] %u\n", wert_min[6], wert_max[6]);uart_puts(buffer);
|
215 | sprintf(buffer, "\twert_min[7] %u \t wert_max[7] %u\n", wert_min[7], wert_max[7]);uart_puts(buffer);
|
216 | sprintf(buffer, "\twert_min[8] %u \t wert_max[8] %u\n", wert_min[8], wert_max[8]);uart_puts(buffer);
|
217 | sprintf(buffer, "\twert_min[9] %u \t wert_max[9] %u\n", wert_min[9], wert_max[9]);uart_puts(buffer);
|
218 |
|
219 | letzter_wert_min *= 1.1; // erhöhe das Minimum um 10%
|
220 | sprintf(buffer, "\tletzter_wert_min erhoeht auf %u\n\n",letzter_wert_min );
|
221 | uart_puts(buffer);
|
222 | }
|
223 | if ( wert < letzter_wert_min ) { // jeder noch kleinere Wert wird zwischengespeichert und das letzte Maximum ins Array geschrieben
|
224 | sprintf(buffer, "\twert %u < letzter_wert_min %u \n",wert,letzter_wert_min );
|
225 | uart_puts(buffer);
|
226 |
|
227 | letzter_wert_min = wert;
|
228 |
|
229 | sprintf(buffer, "\n\tWerte vorher:\n");uart_puts(buffer);
|
230 | sprintf(buffer, "\n\twert_min[0] %u \t wert_max[0] %u\n", wert_min[0], wert_max[0]);uart_puts(buffer);
|
231 | sprintf(buffer, "\twert_min[1] %u \t wert_max[1] %u\n", wert_min[1], wert_max[1]);uart_puts(buffer);
|
232 | sprintf(buffer, "\twert_min[2] %u \t wert_max[2] %u\n", wert_min[2], wert_max[2]);uart_puts(buffer);
|
233 | sprintf(buffer, "\twert_min[3] %u \t wert_max[3] %u\n", wert_min[3], wert_max[3]);uart_puts(buffer);
|
234 | sprintf(buffer, "\twert_min[4] %u \t wert_max[4] %u\n", wert_min[4], wert_max[4]);uart_puts(buffer);
|
235 | sprintf(buffer, "\twert_min[5] %u \t wert_max[5] %u\n", wert_min[5], wert_max[5]);uart_puts(buffer);
|
236 | sprintf(buffer, "\twert_min[6] %u \t wert_max[6] %u\n", wert_min[6], wert_max[6]);uart_puts(buffer);
|
237 | sprintf(buffer, "\twert_min[7] %u \t wert_max[7] %u\n", wert_min[7], wert_max[7]);uart_puts(buffer);
|
238 | sprintf(buffer, "\twert_min[8] %u \t wert_max[8] %u\n", wert_min[8], wert_max[8]);uart_puts(buffer);
|
239 | sprintf(buffer, "\twert_min[9] %u \t wert_max[9] %u\n", wert_min[9], wert_max[9]);uart_puts(buffer);
|
240 |
|
241 | wert_max[0] = wert_max[1];
|
242 | wert_max[1] = wert_max[2];
|
243 | wert_max[2] = wert_max[3];
|
244 | wert_max[3] = wert_max[4];
|
245 | wert_max[4] = wert_max[5];
|
246 | wert_max[5] = wert_max[6];
|
247 | wert_max[6] = wert_max[7];
|
248 | wert_max[7] = wert_max[8];
|
249 | wert_max[8] = wert_max[9];
|
250 | wert_max[9] = letzter_wert_max;
|
251 |
|
252 | sprintf(buffer, "\n\tWerte nach einfügen von letzter_wert_max %u:\n", letzter_wert_max );uart_puts(buffer);
|
253 | sprintf(buffer, "\n\twert_min[0] %u \t wert_max[0] %u\n", wert_min[0], wert_max[0]);uart_puts(buffer);
|
254 | sprintf(buffer, "\twert_min[1] %u \t wert_max[1] %u\n", wert_min[1], wert_max[1]);uart_puts(buffer);
|
255 | sprintf(buffer, "\twert_min[2] %u \t wert_max[2] %u\n", wert_min[2], wert_max[2]);uart_puts(buffer);
|
256 | sprintf(buffer, "\twert_min[3] %u \t wert_max[3] %u\n", wert_min[3], wert_max[3]);uart_puts(buffer);
|
257 | sprintf(buffer, "\twert_min[4] %u \t wert_max[4] %u\n", wert_min[4], wert_max[4]);uart_puts(buffer);
|
258 | sprintf(buffer, "\twert_min[5] %u \t wert_max[5] %u\n", wert_min[5], wert_max[5]);uart_puts(buffer);
|
259 | sprintf(buffer, "\twert_min[6] %u \t wert_max[6] %u\n", wert_min[6], wert_max[6]);uart_puts(buffer);
|
260 | sprintf(buffer, "\twert_min[7] %u \t wert_max[7] %u\n", wert_min[7], wert_max[7]);uart_puts(buffer);
|
261 | sprintf(buffer, "\twert_min[8] %u \t wert_max[8] %u\n", wert_min[8], wert_max[8]);uart_puts(buffer);
|
262 | sprintf(buffer, "\twert_min[9] %u \t wert_max[9] %u\n", wert_min[9], wert_max[9]);uart_puts(buffer);
|
263 |
|
264 |
|
265 | letzter_wert_max *= 0.9; // verringere das Maximum um 10%
|
266 | sprintf(buffer, "\tletzter_wert_max verringert auf %u\n",letzter_wert_max );
|
267 | uart_puts(buffer);
|
268 | }
|
269 | // if ( wert > uint16_t ((array_avg(wert_max) - array_avg(wert_min) / 2)*1,1 + array_avg(wert_min)) ) { // wenn Wert größer als 10% über dem Mittelwert der Durchschnittsamplitude
|
270 | // sprintf(buffer, "Impuls an: %u > %u\n",wert, uint16_t ((array_avg(wert_max) - array_avg(wert_min) / 2)*1.1 + array_avg(wert_min)) );
|
271 | // uart_puts(buffer);
|
272 | // GeberPORT |= (1 << GeberPORTPin); // Impulsausgang an
|
273 | // }
|
274 | // if ( wert < uint16_t ((array_avg(wert_max) - array_avg(wert_min) / 2)*0,9 + array_avg(wert_min)) ) { // wenn Wert kleiner als 10% unter dem Mittelwert der Durchschnittsamplitude
|
275 | // sprintf(buffer, "Impuls aus: %u > %u\n",wert, uint16_t ((array_avg(wert_max) - array_avg(wert_min) / 2)*0.9 + array_avg(wert_min)) );
|
276 | // uart_puts(buffer);
|
277 | // GeberPORT &= ~(1 << GeberPORTPin); // Impulsausgang aus
|
278 | // }
|
279 | }
|
280 | }
|