/************** * Globale Var. **************/ static unsigned char n=0; unsigned int avg=0; unsigned char counter; unsigned int anzahl=16; // anzahl für den KleinsterMittelwert /////////////////////////////////////////////////////////////////////////////////////// unsigned long LangzeitMittelwert(unsigned int newval) { int Filterstaerke=128; long avgsum=0; if (n < Filterstaerke) { n++; avgsum += newval; avg = avgsum/n; } else { avgsum -= avgsum / Filterstaerke; avgsum += newval; avg = avgsum / Filterstaerke; } return avg; } ///////////////////////////////////////////////////////////////////////////////////////// void main(void) //Hauptprogramm main { Initialisierung(); // Initialisierung wird fortgesetzt do { if(Funktion()==1) { LED1=1; }else{ LED1=0; } }while(1); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// unsigned int Funktion(void) { unsigned int KleinsterMittelwert=0; unsigned int ADCWert; unsigned int AnzahlMessungen; unsigned int SummeMessungen=0; unsigned int Schwellwert; unsigned int offset=5; /* 1TAD=2us -- C Aufladen=16us(8TAD) ++ AD-Wandlung=22us(11TAD) ++ C Entladen=4us(2TAD) = 42us */ for(AnzahlMessungen=0; AnzahlMessungen < anzahl; AnzahlMessungen++) //Mittelwertbildung der ADC Werte { Vreferenz(); // Aufruf der Funktion Vreferenz() für die Aufladung des Sample&Hold Kondensator TRISCbits.TRISC5 = 1; // Eingang gewählt ADCON0 = Taste1_Abfrage; // AN17 Eingang ADCWert = Ergb(); // AD-Wandlung SummeMessungen = SummeMessungen + ADCWert; //ADCWerte aufsummieren TRISCbits.TRISC5 = 0; // Ausgang } KleinsterMittelwert = SummeMessungen / anzahl; //KleinsterMittelwert kann eine Änderung erkennen counter++; if(counter == 10) //Jeden zehnten Wert aufnehmen { LangzeitMittelwert(KleinsterMittelwert); //LangzeitMittelwert glättet über eine bestimmte Zeit die 128(Filterstaerke) aufgenommene Werte counter=0; } Schwellwert = avg - offset; //über den LangzeitMittelwert ermittelten "avg" wird der neue Schwellwert berechnet if( KleinsterMittelwert <= Schwellwert ) //Vergleich der 16Mittelwerte(KleinsterMittelwert) und 128Mittelwerte (LangzeitMittelwert) { /* LED geht an */ return 1; } else { /* LED1 geht nicht an */ return 0; } }