b

Dependencies:   C12832_lcd mbed

Committer:
nicholasslocombe
Date:
Sun May 07 19:13:35 2017 +0000
Revision:
0:c005165bbb7e
commimerertn

Who changed what in which revision?

UserRevisionLine numberNew 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 }