Praktikum2_4_AMSL_v1

Dependencies:   C12832_lcd mbed

Fork of TimerInterruptExample by Simon Ford

Committer:
slueke
Date:
Wed Mar 07 18:56:32 2018 +0000
Revision:
1:b6aa27661206
Parent:
0:a6ea53688962
Praktikum2_4_AMSL_v1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:a6ea53688962 1 #include "mbed.h"
slueke 1:b6aa27661206 2 #include "C12832_lcd.h"
slueke 1:b6aa27661206 3
slueke 1:b6aa27661206 4 // Definitionen
slueke 1:b6aa27661206 5 #define n 9 // n ist die Ordnung des Filters,
slueke 1:b6aa27661206 6 // erfordert n+1 Koeffizienten
slueke 1:b6aa27661206 7 int i;
slueke 1:b6aa27661206 8 float x,y; // Eingang, Ausgang
slueke 1:b6aa27661206 9 int PZ; // zeigt auf Ringpuffer p
slueke 1:b6aa27661206 10 int PA; // zeigt auf Koeffizienten a,b
slueke 1:b6aa27661206 11 float p[n+1]; // Ringpuffer mit n Speichern (n=0 unbenutzt)
slueke 1:b6aa27661206 12 float a[n+1]; // Koeffizienten
slueke 1:b6aa27661206 13
simon 0:a6ea53688962 14
simon 0:a6ea53688962 15 DigitalOut myled(LED1);
slueke 1:b6aa27661206 16 DigitalOut mypin(p21);
slueke 1:b6aa27661206 17 C12832_LCD lcd;
slueke 1:b6aa27661206 18
slueke 1:b6aa27661206 19 volatile uint16_t poti, poti_f;
slueke 1:b6aa27661206 20
slueke 1:b6aa27661206 21 AnalogIn input(p19);
slueke 1:b6aa27661206 22 void Init_Filter();
slueke 1:b6aa27661206 23 float FIR(float x);
slueke 1:b6aa27661206 24
slueke 1:b6aa27661206 25 //---------------------------------------------------------------------
slueke 1:b6aa27661206 26
simon 0:a6ea53688962 27
simon 0:a6ea53688962 28 void myhandler() {
slueke 1:b6aa27661206 29 mypin=1;
slueke 1:b6aa27661206 30
simon 0:a6ea53688962 31 // do something!
slueke 1:b6aa27661206 32 poti= input.read_u16();
slueke 1:b6aa27661206 33
slueke 1:b6aa27661206 34 poti_f=FIR(poti);
slueke 1:b6aa27661206 35 mypin=0;
slueke 1:b6aa27661206 36
simon 0:a6ea53688962 37 // clear the TIMER0 interrupt
simon 0:a6ea53688962 38 LPC_TIM0->IR = 1;
slueke 1:b6aa27661206 39
simon 0:a6ea53688962 40 }
simon 0:a6ea53688962 41
simon 0:a6ea53688962 42 int main() {
slueke 1:b6aa27661206 43
simon 0:a6ea53688962 44 // power up TIMER0 (PCONP[1])
simon 0:a6ea53688962 45 LPC_SC->PCONP |= 1 << 1;
simon 0:a6ea53688962 46
simon 0:a6ea53688962 47 // reset and set TIMER0 to timer mode
simon 0:a6ea53688962 48 LPC_TIM0->TCR = 0x2;
simon 0:a6ea53688962 49 LPC_TIM0->CTCR = 0x0;
simon 0:a6ea53688962 50
simon 0:a6ea53688962 51 // set no prescaler
simon 0:a6ea53688962 52 LPC_TIM0->PR = 0;
simon 0:a6ea53688962 53
simon 0:a6ea53688962 54 // calculate period (1 interrupt every second)
simon 0:a6ea53688962 55 uint32_t period = SystemCoreClock / 4;
simon 0:a6ea53688962 56
simon 0:a6ea53688962 57 // set match register and enable interrupt
slueke 1:b6aa27661206 58 LPC_TIM0->MR0 = period/10000;
simon 0:a6ea53688962 59 LPC_TIM0->MCR |= 1 << 0; // interrupt on match
simon 0:a6ea53688962 60 LPC_TIM0->MCR |= 1 << 1; // reset on match
simon 0:a6ea53688962 61
simon 0:a6ea53688962 62 // enable the vector in the interrupt controller
simon 0:a6ea53688962 63 NVIC_SetVector(TIMER0_IRQn, (uint32_t)&myhandler);
simon 0:a6ea53688962 64 NVIC_EnableIRQ(TIMER0_IRQn);
simon 0:a6ea53688962 65
simon 0:a6ea53688962 66 // start the timer
simon 0:a6ea53688962 67 LPC_TIM0->TCR = 1;
simon 0:a6ea53688962 68
slueke 1:b6aa27661206 69 Init_Filter();
slueke 1:b6aa27661206 70
simon 0:a6ea53688962 71 // hang around!
simon 0:a6ea53688962 72 while(1) {
slueke 1:b6aa27661206 73 lcd.cls();
slueke 1:b6aa27661206 74 lcd.locate(0,0);
slueke 1:b6aa27661206 75 lcd.printf("%f",poti);
slueke 1:b6aa27661206 76
slueke 1:b6aa27661206 77 wait(0.2);
slueke 1:b6aa27661206 78 myled = 0;
slueke 1:b6aa27661206 79 wait(0.2);
slueke 1:b6aa27661206 80
simon 0:a6ea53688962 81 }
simon 0:a6ea53688962 82 }
slueke 1:b6aa27661206 83 void Init_Filter(){
slueke 1:b6aa27661206 84 // ***** Initialisierung am Anfang der Main-Routine
slueke 1:b6aa27661206 85 // füer gleitende Mittelwertbildung:
slueke 1:b6aa27661206 86
slueke 1:b6aa27661206 87 a[ 0]= 0.1;
slueke 1:b6aa27661206 88 a[ 1]= 0.1;
slueke 1:b6aa27661206 89 a[ 2]= 0.1;
slueke 1:b6aa27661206 90 a[ 3]= 0.1;
slueke 1:b6aa27661206 91 a[ 4]= 0.1;
slueke 1:b6aa27661206 92 a[ 5]= 0.1;
slueke 1:b6aa27661206 93 a[ 6]= 0.1;
slueke 1:b6aa27661206 94 a[ 7]= 0.1;
slueke 1:b6aa27661206 95 a[ 8]= 0.1;
slueke 1:b6aa27661206 96 a[ 9]= 0.1;
slueke 1:b6aa27661206 97
slueke 1:b6aa27661206 98 for (PZ=1 ; PZ<=n ; PZ=PZ+1) p[PZ]=0; //Speicher loeschen
slueke 1:b6aa27661206 99 PZ = 1; // erstes Ringpufferelement definieren
slueke 1:b6aa27661206 100
slueke 1:b6aa27661206 101 }
slueke 1:b6aa27661206 102
slueke 1:b6aa27661206 103 float FIR(float x){
slueke 1:b6aa27661206 104
slueke 1:b6aa27661206 105 //********* Beginn des Digitalfilters, Eingang ist x *******
slueke 1:b6aa27661206 106
slueke 1:b6aa27661206 107
slueke 1:b6aa27661206 108 y = a[0]*x; // Aktuellen Messwert mit Koeff. multipliz.
slueke 1:b6aa27661206 109 for (PA=1 ; PA<=n ; PA = PA+1) // PA rotiert rechts herum von 1 bis n
slueke 1:b6aa27661206 110 {
slueke 1:b6aa27661206 111 y = y + a[PA]*p[PZ]; // Teilprodukte aufsummieren
slueke 1:b6aa27661206 112 if (PZ<=1) PZ = n; else PZ = PZ -1; // PZ rotiert links herum
slueke 1:b6aa27661206 113 }
slueke 1:b6aa27661206 114 if (PZ<n) PZ = PZ +1; else PZ = 1; // PZ weiter fuer naechsten Messwert
slueke 1:b6aa27661206 115 p[PZ] = x; // Aktuellen Messwert in Ringpuffer einschieben
slueke 1:b6aa27661206 116
slueke 1:b6aa27661206 117 return y;
slueke 1:b6aa27661206 118 //mypin = 0; // FIR dauert 12 µs
slueke 1:b6aa27661206 119 //********* Ende des Digitalfilters, Ausgang ist y *********
slueke 1:b6aa27661206 120
slueke 1:b6aa27661206 121
slueke 1:b6aa27661206 122 }