Praktikum_2_4_AMSL_v2

Dependencies:   C12832_lcd mbed

Fork of Praktikum_2_4_ADC by MEL_Kings

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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     }