
b
main.cpp@0:c005165bbb7e, 2017-05-07 (annotated)
- Committer:
- nicholasslocombe
- Date:
- Sun May 07 19:13:35 2017 +0000
- Revision:
- 0:c005165bbb7e
commimerertn
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nicholasslocombe | 0:c005165bbb7e | 1 | /* measure.cpp verion 1.0 */ |
nicholasslocombe | 0:c005165bbb7e | 2 | /* wajw 25/08/15 */ |
nicholasslocombe | 0:c005165bbb7e | 3 | |
nicholasslocombe | 0:c005165bbb7e | 4 | /* Prog to measure period of rotation of flywheel */ |
nicholasslocombe | 0:c005165bbb7e | 5 | /* and display value on the Application Board LCD */ |
nicholasslocombe | 0:c005165bbb7e | 6 | /* Generates interrupt on +ve edge of CAP2.0 (mbed pin 30) and display capture regt */ |
nicholasslocombe | 0:c005165bbb7e | 7 | /* ISR Stores captured Timer2 value as 'period', resets Timer 2 and sets flag */ |
nicholasslocombe | 0:c005165bbb7e | 8 | |
nicholasslocombe | 0:c005165bbb7e | 9 | /* For test purposes, a Ticker is producing pulses on pin 29,*/ |
nicholasslocombe | 0:c005165bbb7e | 10 | /* and these can be used to drive CAP2.0 on pin 30 */ |
nicholasslocombe | 0:c005165bbb7e | 11 | /* Ticker also drives LED1 which switches after 10 pulses as health check */ |
nicholasslocombe | 0:c005165bbb7e | 12 | |
nicholasslocombe | 0:c005165bbb7e | 13 | /* To use the Ticker - need to join pins 29 and 30 */ |
nicholasslocombe | 0:c005165bbb7e | 14 | |
nicholasslocombe | 0:c005165bbb7e | 15 | |
nicholasslocombe | 0:c005165bbb7e | 16 | #include "mbed.h" |
nicholasslocombe | 0:c005165bbb7e | 17 | #include "C12832_lcd.h" |
nicholasslocombe | 0:c005165bbb7e | 18 | |
nicholasslocombe | 0:c005165bbb7e | 19 | //Global Variables: |
nicholasslocombe | 0:c005165bbb7e | 20 | |
nicholasslocombe | 0:c005165bbb7e | 21 | volatile int count = 0, period = 0; |
nicholasslocombe | 0:c005165bbb7e | 22 | volatile int pflag = 0, sflag = 0; |
nicholasslocombe | 0:c005165bbb7e | 23 | C12832_LCD lcd; |
nicholasslocombe | 0:c005165bbb7e | 24 | |
nicholasslocombe | 0:c005165bbb7e | 25 | // Function Prototypes: |
nicholasslocombe | 0:c005165bbb7e | 26 | |
nicholasslocombe | 0:c005165bbb7e | 27 | void led_switch(void); |
nicholasslocombe | 0:c005165bbb7e | 28 | void Tick1_isr (void); |
nicholasslocombe | 0:c005165bbb7e | 29 | void Timer2_isr (void); |
nicholasslocombe | 0:c005165bbb7e | 30 | void Timer2_init (void); |
nicholasslocombe | 0:c005165bbb7e | 31 | |
nicholasslocombe | 0:c005165bbb7e | 32 | // Diagnostic Features: |
nicholasslocombe | 0:c005165bbb7e | 33 | |
nicholasslocombe | 0:c005165bbb7e | 34 | Ticker Tick; //Tick produces a periodic interrupt |
nicholasslocombe | 0:c005165bbb7e | 35 | DigitalOut myled(LED1); //myled is diagnostic O/P driven by Ticker |
nicholasslocombe | 0:c005165bbb7e | 36 | DigitalOut displed(LED2); //displed is diagnostic O/P driven by Timer2_isr() |
nicholasslocombe | 0:c005165bbb7e | 37 | DigitalOut pulse(p29); //Pulse output for testing measure software |
nicholasslocombe | 0:c005165bbb7e | 38 | |
nicholasslocombe | 0:c005165bbb7e | 39 | //Function Declarations: |
nicholasslocombe | 0:c005165bbb7e | 40 | |
nicholasslocombe | 0:c005165bbb7e | 41 | void led_switch() |
nicholasslocombe | 0:c005165bbb7e | 42 | // Function which Toggles LED1 |
nicholasslocombe | 0:c005165bbb7e | 43 | { |
nicholasslocombe | 0:c005165bbb7e | 44 | myled=!myled; |
nicholasslocombe | 0:c005165bbb7e | 45 | } |
nicholasslocombe | 0:c005165bbb7e | 46 | |
nicholasslocombe | 0:c005165bbb7e | 47 | void Timer2_init() |
nicholasslocombe | 0:c005165bbb7e | 48 | { |
nicholasslocombe | 0:c005165bbb7e | 49 | // Connect pin 30 to CAP2.0: |
nicholasslocombe | 0:c005165bbb7e | 50 | |
nicholasslocombe | 0:c005165bbb7e | 51 | LPC_PINCON->PINSEL0 |= (0x3<<8); // Bits 9,8 = 1,1 = pin function CAP2.0 (p30) |
nicholasslocombe | 0:c005165bbb7e | 52 | |
nicholasslocombe | 0:c005165bbb7e | 53 | //Configure Timer 2: |
nicholasslocombe | 0:c005165bbb7e | 54 | |
nicholasslocombe | 0:c005165bbb7e | 55 | LPC_SC->PCONP |= (0x01 << 22); // Enable Timer 2 |
nicholasslocombe | 0:c005165bbb7e | 56 | LPC_SC->PCLKSEL1 |= (0x01 << 12) ; //Timer2 to use CCLK |
nicholasslocombe | 0:c005165bbb7e | 57 | LPC_TIM2->PR = 9600 - 1; //Set Timer2 prescale |
nicholasslocombe | 0:c005165bbb7e | 58 | LPC_TIM2->TCR |= (0x01); //Enable Timer2 |
nicholasslocombe | 0:c005165bbb7e | 59 | LPC_TIM2->CTCR |= (0x00); // Timer2 in timer mode |
nicholasslocombe | 0:c005165bbb7e | 60 | LPC_TIM2->TC = (0x00); //Initialise Timer2 |
nicholasslocombe | 0:c005165bbb7e | 61 | |
nicholasslocombe | 0:c005165bbb7e | 62 | //Configure Capture input mode: |
nicholasslocombe | 0:c005165bbb7e | 63 | |
nicholasslocombe | 0:c005165bbb7e | 64 | LPC_TIM2->CCR |= (0x01); //Capture on +ve edge of CAP2.0 |
nicholasslocombe | 0:c005165bbb7e | 65 | LPC_TIM2->CCR |= (0x01 << 2); //Generate Interrupt on +ve edge CAP2.0 |
nicholasslocombe | 0:c005165bbb7e | 66 | } |
nicholasslocombe | 0:c005165bbb7e | 67 | |
nicholasslocombe | 0:c005165bbb7e | 68 | void T1_isr() |
nicholasslocombe | 0:c005165bbb7e | 69 | //ISR which flips the ulse O/P and sets sflag after 1 second |
nicholasslocombe | 0:c005165bbb7e | 70 | { |
nicholasslocombe | 0:c005165bbb7e | 71 | pulse = !pulse; // flip the pulse O/P |
nicholasslocombe | 0:c005165bbb7e | 72 | count++; |
nicholasslocombe | 0:c005165bbb7e | 73 | if (count >= 10) { |
nicholasslocombe | 0:c005165bbb7e | 74 | count = 0; //1 second has passed |
nicholasslocombe | 0:c005165bbb7e | 75 | sflag = 1; |
nicholasslocombe | 0:c005165bbb7e | 76 | } |
nicholasslocombe | 0:c005165bbb7e | 77 | } |
nicholasslocombe | 0:c005165bbb7e | 78 | |
nicholasslocombe | 0:c005165bbb7e | 79 | void Timer2_isr() |
nicholasslocombe | 0:c005165bbb7e | 80 | //Interrupt caused by +ve pulse on CAP2.0 |
nicholasslocombe | 0:c005165bbb7e | 81 | //Captured value = period |
nicholasslocombe | 0:c005165bbb7e | 82 | |
nicholasslocombe | 0:c005165bbb7e | 83 | { |
nicholasslocombe | 0:c005165bbb7e | 84 | if ((LPC_TIM2->IR & 0x10) != 0) { //Check CAP2.0 Interrupt? |
nicholasslocombe | 0:c005165bbb7e | 85 | period = LPC_TIM2->CR0; //save period |
nicholasslocombe | 0:c005165bbb7e | 86 | LPC_TIM2->TC = (0x00); //Reset Timer2 |
nicholasslocombe | 0:c005165bbb7e | 87 | LPC_TIM2->IR = 0x10; // clear CAP2.0 interrupt |
nicholasslocombe | 0:c005165bbb7e | 88 | displed = !displed; //toggle diagnostic LED |
nicholasslocombe | 0:c005165bbb7e | 89 | pflag = 1; //New period available |
nicholasslocombe | 0:c005165bbb7e | 90 | } |
nicholasslocombe | 0:c005165bbb7e | 91 | } |
nicholasslocombe | 0:c005165bbb7e | 92 | |
nicholasslocombe | 0:c005165bbb7e | 93 | |
nicholasslocombe | 0:c005165bbb7e | 94 | int main() |
nicholasslocombe | 0:c005165bbb7e | 95 | { |
nicholasslocombe | 0:c005165bbb7e | 96 | |
nicholasslocombe | 0:c005165bbb7e | 97 | Timer2_init(); |
nicholasslocombe | 0:c005165bbb7e | 98 | |
nicholasslocombe | 0:c005165bbb7e | 99 | Tick.attach_us(&T1_isr, 50000); //initializes the ticker with period of 50msec |
nicholasslocombe | 0:c005165bbb7e | 100 | //and attaches it to T1 ISR |
nicholasslocombe | 0:c005165bbb7e | 101 | |
nicholasslocombe | 0:c005165bbb7e | 102 | |
nicholasslocombe | 0:c005165bbb7e | 103 | //Associate Timer2_isr to Interrupt from Timer 2: |
nicholasslocombe | 0:c005165bbb7e | 104 | |
nicholasslocombe | 0:c005165bbb7e | 105 | NVIC_SetVector(TIMER2_IRQn, (uint32_t)Timer2_isr); |
nicholasslocombe | 0:c005165bbb7e | 106 | NVIC_EnableIRQ(TIMER2_IRQn); //Enable Interrupts on Timer 2 |
nicholasslocombe | 0:c005165bbb7e | 107 | |
nicholasslocombe | 0:c005165bbb7e | 108 | |
nicholasslocombe | 0:c005165bbb7e | 109 | |
nicholasslocombe | 0:c005165bbb7e | 110 | lcd.cls(); |
nicholasslocombe | 0:c005165bbb7e | 111 | lcd.locate(0,0); |
nicholasslocombe | 0:c005165bbb7e | 112 | lcd.printf("Period in Timer 2 Counts"); |
nicholasslocombe | 0:c005165bbb7e | 113 | while(1) { |
nicholasslocombe | 0:c005165bbb7e | 114 | if (pflag == 1) // new data? |
nicholasslocombe | 0:c005165bbb7e | 115 | { |
nicholasslocombe | 0:c005165bbb7e | 116 | lcd.locate(0,15); |
nicholasslocombe | 0:c005165bbb7e | 117 | lcd.printf("Period: %d", period); //display captured data |
nicholasslocombe | 0:c005165bbb7e | 118 | pflag = 0; //reset flag |
nicholasslocombe | 0:c005165bbb7e | 119 | } |
nicholasslocombe | 0:c005165bbb7e | 120 | if (sflag ==1){ |
nicholasslocombe | 0:c005165bbb7e | 121 | led_switch(); //blink light |
nicholasslocombe | 0:c005165bbb7e | 122 | sflag = 0; |
nicholasslocombe | 0:c005165bbb7e | 123 | } |
nicholasslocombe | 0:c005165bbb7e | 124 | } |
nicholasslocombe | 0:c005165bbb7e | 125 | } |