Praktikum_2_4_AMSL_v2
Dependencies: C12832_lcd mbed
Fork of Praktikum_2_4_ADC by
main.cpp
00001 // Example to set up an interrupt based on the LPC TIMER0 match register, sford 00002 #include "C12832_lcd.h" 00003 #include "mbed.h" 00004 00005 // Definitionen 00006 #define n 9 // n ist die Ordnung des Filters, 00007 // erfordert n+1 Koeffizienten 00008 int i; 00009 float x,y; // Eingang, Ausgang 00010 int PZ; // zeigt auf Ringpuffer p 00011 int PA; // zeigt auf Koeffizienten a,b 00012 float p[n+1]; // Ringpuffer mit n Speichern (n=0 unbenutzt) 00013 float a[n+1]; // Koeffizienten 00014 00015 DigitalOut myled(LED1); 00016 DigitalOut mypin(p21); 00017 AnalogIn input(p19); 00018 00019 C12832_LCD lcd; 00020 00021 void Init_Filter(); 00022 float FIR(float x); 00023 00024 volatile uint16_t poti, poti_f; 00025 00026 void myhandler() { //Interrupt Service Routine, wird durch den Timer0_Vektor gestartet 00027 mypin=1; 00028 00029 // do something! 00030 poti= input.read_u16(); 00031 00032 poti_f=FIR(poti); 00033 mypin=0; 00034 00035 // clear the TIMER0 interrupt 00036 LPC_TIM0->IR = 1; //Reset Timer0 Interrupt Flag 00037 } 00038 00039 int main() { 00040 // power up TIMER0 (PCONP[1]) 00041 LPC_SC->PCONP |= 1 << 1; 00042 00043 // reset and set TIMER0 to timer mode 00044 LPC_TIM0->TCR = 0x2; 00045 LPC_TIM0->CTCR = 0x0; 00046 00047 // set no prescaler 00048 LPC_TIM0->PR = 0; 00049 00050 // calculate period (1 interrupt every second) 00051 uint32_t period = SystemCoreClock / 4; //Period ist die Periodenlänge /4 ursprünlgich für eine Sekunde 00052 //SystemCoreClock ist eine Konstante mit dem Wert 00053 00054 // set match register and enable interrupt 00055 LPC_TIM0->MR0 = period/10000; //Vergleichswert des Timers wird gesetzt mit Period 00056 LPC_TIM0->MCR |= 1 << 0; // interrupt on match //Einstellung, dass ein Interrupt ausgelöst wird beim Match 00057 LPC_TIM0->MCR |= 1 << 1; // reset on match //Einstellung, dass der Timerwert auf Null zurückgesetzt wird bei Match 00058 00059 // enable the vector in the interrupt controller 00060 NVIC_SetVector(TIMER0_IRQn, (uint32_t)&myhandler); //Zuordunung der InterruptServiceRoutine (Handler) zum Vektor von Timer0 00061 NVIC_EnableIRQ(TIMER0_IRQn); //Timer Interrupt wird enabled 00062 00063 // start the timer 00064 LPC_TIM0->TCR = 1; //Einstellung, dass der Timer gestartet wird 00065 00066 Init_Filter(); 00067 00068 // hang around! 00069 while(1) { 00070 00071 lcd.cls(); 00072 lcd.locate(0,0); 00073 lcd.printf("%d",poti_f); //while Schleife, in der die erste LED getoggelt wird 00074 00075 myled = 1; 00076 wait(0.2); 00077 myled = 0; 00078 wait(0.2); 00079 } 00080 } 00081 00082 void Init_Filter(){ 00083 // ***** Initialisierung am Anfang der Main-Routine 00084 // füer gleitende Mittelwertbildung: 00085 00086 a[ 0]= 0.1; 00087 a[ 1]= 0.1; 00088 a[ 2]= 0.1; 00089 a[ 3]= 0.1; 00090 a[ 4]= 0.1; 00091 a[ 5]= 0.1; 00092 a[ 6]= 0.1; 00093 a[ 7]= 0.1; 00094 a[ 8]= 0.1; 00095 a[ 9]= 0.1; 00096 00097 for (PZ=1 ; PZ<=n ; PZ=PZ+1) p[PZ]=0; //Speicher loeschen 00098 PZ = 1; // erstes Ringpufferelement definieren 00099 00100 } 00101 00102 float FIR(float x){ 00103 00104 //********* Beginn des Digitalfilters, Eingang ist x ******* 00105 00106 00107 y = a[0]*x; // Aktuellen Messwert mit Koeff. multipliz. 00108 for (PA=1 ; PA<=n ; PA = PA+1) // PA rotiert rechts herum von 1 bis n 00109 { 00110 y = y + a[PA]*p[PZ]; // Teilprodukte aufsummieren 00111 if (PZ<=1) PZ = n; else PZ = PZ -1; // PZ rotiert links herum 00112 } 00113 if (PZ<n) PZ = PZ +1; else PZ = 1; // PZ weiter fuer naechsten Messwert 00114 p[PZ] = x; // Aktuellen Messwert in Ringpuffer einschieben 00115 00116 return y; 00117 //mypin = 0; // FIR dauert 12 µs 00118 //********* Ende des Digitalfilters, Ausgang ist y ********* 00119 00120 00121 }
Generated on Mon Aug 8 2022 19:55:30 by 1.7.2