So wie Besserwessi das schreibt, war das gedacht.
Ein kurzes "Pseudo Beispiel" in "C"
}
Code:
//Variablen definieren
volatile unsiged int ui_wertebuffer[5] //Das wird mal der Ringpuffer
volatile unsigned char uc_readin=0 //Einlesezeiger
volatile unsigned char uc_readout=0 //Auslesezeiger wird hier als Marker genutzt
//Einlesen der Werte
void einlesen(unsiged int ui_wert)
{
ui_wertebuffer[uc_readin]=ui_wert; //Aktuellen Wert einlesen
uc_readin++; //Pointer erhöhen
uc_readout++; //Wird hier nur als Marker genutzt
if (uc_readin>4){uc_readin=0;} //Pointer auf 0 zurücksetzen wenn Pufferende erreicht
}
/* Diese Subroutine kann man in die Input Capture Routine einbauen. oder von da aus aufrufen - Ich würd die paar Zeilen direkt in die ICP Interrupt Routine einbauen */
//Auslesen der Werte
unsigned int auslesen(void)
{
unsigned char uc_i=0; //Schleifenvariable
unsigned int ui_result=0; //Ergebnisvariable
unsigned long int ui_math; //Berechnungsvariable
if(uc_readout>0)
{
for(uc_i=0;uc_i<5;uc_i++) //Eine Schleife, die die 5 Werte ausliest
{
ul_math+=ui_wertebuffer[uc_i]; //Die 5 Werte werden addiert
}
ul_math/=5; //Das Ergebnis wird durch 5 geteilt
ui_result=ul_math; //Das Endergebnis wird in die unsigned int Variable ui_result übergeben
}
return(ui_result); //Das Endergebnis wird an die aufrufende Routine zurück gegeben
uc_readout=0;
/* Man könnte es auch so machen, diese Routine nur dann aufzurufen, wenn uc_readout>0 ist */
}
Lesezeichen