Du könntest der ReadAD einen Rückgabewert mitgeben, der zeigt, ob die
Messung im Spannungsbereich für -20° bis +20° Neigung war:
1 | // Willkürliche Werte, weil Datenblatt nicht vorhanden
|
2 | #define ULIMIT 1234
|
3 | #define OLIMIT 23456
|
4 | #define ANZAHL_VERSUCHE 42
|
5 |
|
6 | unsigned char ReadAD(void)
|
7 | {
|
8 | unsigned int summe = 0;
|
9 | unsigned int mittel = 0;
|
10 | unsigned char versuche = ANZAHL_VERSUCHE;
|
11 |
|
12 | do
|
13 | {
|
14 | versuche -= 1;
|
15 | ConvertADC(); // Start conversion
|
16 | while( BusyADC() ); // Wait for completion
|
17 | ClrWdt(); // Watchdog Reset
|
18 | summe += ReadADC(); // Read result
|
19 | mittel = summe / (ANZAHL_VERSUCHE - versuche);
|
20 | } while ( versuche && ((mittel < ULIMIT) || (mittel > OLIMIT)) );
|
21 |
|
22 | if ( versuche )
|
23 | AD_Wert = mittel;
|
24 |
|
25 | return versuche;
|
26 | }
|
Testanwendung:
1 | #include ...
|
2 |
|
3 | unsigned int AD_Wert;
|
4 | char Momentan_Grad;
|
5 |
|
6 | int main(void)
|
7 | {
|
8 | while(1)
|
9 | {
|
10 | if( ReadAD() ) // Nur wenn AD_Wert innerhalb +-20°
|
11 | {
|
12 | Grad(); // AD_Wert in Momentan_Grad umrechnen
|
13 | Grad_anzeigen(); // und Momentan_Grad anzeigen
|
14 | }
|
15 | }
|
16 | }
|
Mir gefällt das mit dem Aufaddieren nicht besonders. Man will doch eher
den Momentanwert haben und keinen gemittelten Wert oder?
Statt
unsigned int summe = 0;
...
summe += ReadADC(); // Read result
mittel = summe / (ANZAHL_VERSUCHE - versuche);
würde man dann
mittel = ReadADC(); // Read result
schreiben. summe könnte man ganz weglassen.