#define SIZE_OF_AVG 16 typedef struct { unsigned int Data[SIZE_OF_AVG]; unsigned char IndexNextValue; }GleitMittelwert; // Initialisiert das Filter mit einem Startwert. void InitFilterStart(GleitMittelwert * zeigerAvgFilter, unsigned int DefaultValue); // Schreibt einen neuen Wert in das Filter. void NeuWertSchreiben(GleitMittelwert * zeigerAvgFilter, unsigned int neuWert); // Berechnet den Durchschnitt aus den letzten SIZE_OF_AVG eingetragenen Werten. unsigned int BerechneAusgangswert(GleitMittelwert * zeigerAvgFilter); // Initialisiert das Filter mit einem Startwert. void InitFilterStart(GleitMittelwert * zeigerAvgFilter, unsigned int DefaultValue) { unsigned char i; // Den Buffer mit dem Initialisierungswert fuellen for(i=0; iData[i] = DefaultValue; } // Der naechste Wert soll an den Anfang des Buffers geschrieben werden zeigerAvgFilter->IndexNextValue=0; } // Schreibt einen neuen Wert in das Filter. void NeuWertSchreiben(GleitMittelwert * zeigerAvgFilter, unsigned int neuWert) { // Neuen Wert an die dafuer vorgesehene Position im Buffer schreiben. zeigerAvgFilter->Data[zeigerAvgFilter->IndexNextValue] = neuWert; // Der naechste Wert wird dann an die Position dahinter geschrieben zeigerAvgFilter->IndexNextValue++; // Wenn man hinten angekommen ist, vorne wieder anfangen zeigerAvgFilter->IndexNextValue %= SIZE_OF_AVG; } // Berechnet den Durchschnitt aus den letzten SIZE_OF_AVG eingetragenen Werten. unsigned int BerechneAusgangswert(GleitMittelwert * zeigerAvgFilter) { unsigned long TempSum = 0; int i ; unsigned int Result; // Durchschnitt berechnen for(i=0; i < SIZE_OF_AVG; ++i) { TempSum = TempSum + zeigerAvgFilter->Data[i]; } // Der cast is OK, wenn tFloatAvgType und tTempSumType korrekt gewaehlt wurden Result =(unsigned int) (TempSum/SIZE_OF_AVG); return Result; } unsigned int Taste1(void) { unsigned int Ergebnis; // Dekleration Ergebnis int AnzahlMessungen; unsigned int Ausgang; GleitMittelwert zeigerAvgFilter; // initialisieren und mit 0 fuellen InitFilterStart(&zeigerAvgFilter, 0); for(AnzahlMessungen=0; AnzahlMessungen < SIZE_OF_AVG; AnzahlMessungen++) //Mittelwertbildung der ADC Werte { Vreferenz(); // Aufruf der Funktion Vreferenz() für die Aufladung des Sample&Hold Kondensator TRISCbits.TRISC5 = 1; // Taste1 als Eingang gewählt ADCON0 = Taste1_Abfrage; // AN17 Eingang Ergebnis = Ergb(); // Taste ungedrückt Wert von Ergebnis = 0x016B TRISCbits.TRISC5 = 0; // Taste1 wieder als Ausgang bzw. Csensor wird entladen- Sehr wicht // hier werden die Ergebnisse summiert NeuWertSchreiben(&zeigerAvgFilter, Ergebnis); } // hier ist der gefilterten wert also Ausgang Ausgang = BerechneAusgangswert(&zeigerAvgFilter); if(Ausgang<= 0x0160) // Schwellwert { LED2 = 1; // LED geht an } else { LED2 = 0; // LED geht aus }