
timer0 stopwatch
main.cpp@0:ec69a5b677ed, 2014-10-03 (annotated)
- Committer:
- jfields
- Date:
- Fri Oct 03 17:47:43 2014 +0000
- Revision:
- 0:ec69a5b677ed
final version of timer0 stopwatch
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jfields | 0:ec69a5b677ed | 1 | #include "mbed.h" |
jfields | 0:ec69a5b677ed | 2 | #include "TextLCD.h" |
jfields | 0:ec69a5b677ed | 3 | #include <stdio.h> |
jfields | 0:ec69a5b677ed | 4 | #include <stdlib.h> |
jfields | 0:ec69a5b677ed | 5 | |
jfields | 0:ec69a5b677ed | 6 | TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); |
jfields | 0:ec69a5b677ed | 7 | Serial pc (USBTX, USBRX); |
jfields | 0:ec69a5b677ed | 8 | DigitalOut myled(LED1); |
jfields | 0:ec69a5b677ed | 9 | |
jfields | 0:ec69a5b677ed | 10 | // global vars |
jfields | 0:ec69a5b677ed | 11 | int t [6]; |
jfields | 0:ec69a5b677ed | 12 | int run_status = -1; |
jfields | 0:ec69a5b677ed | 13 | |
jfields | 0:ec69a5b677ed | 14 | // functions |
jfields | 0:ec69a5b677ed | 15 | void update_display(); |
jfields | 0:ec69a5b677ed | 16 | void update_timer(); |
jfields | 0:ec69a5b677ed | 17 | void init_timer0(); |
jfields | 0:ec69a5b677ed | 18 | |
jfields | 0:ec69a5b677ed | 19 | int main() { |
jfields | 0:ec69a5b677ed | 20 | |
jfields | 0:ec69a5b677ed | 21 | // init timer and display |
jfields | 0:ec69a5b677ed | 22 | for (int i=0;i<6;i++) t[i]=0; |
jfields | 0:ec69a5b677ed | 23 | update_display(); |
jfields | 0:ec69a5b677ed | 24 | |
jfields | 0:ec69a5b677ed | 25 | // init timer |
jfields | 0:ec69a5b677ed | 26 | init_timer0(); |
jfields | 0:ec69a5b677ed | 27 | char input = 'z'; |
jfields | 0:ec69a5b677ed | 28 | |
jfields | 0:ec69a5b677ed | 29 | while(1) { |
jfields | 0:ec69a5b677ed | 30 | |
jfields | 0:ec69a5b677ed | 31 | if ( input == 's') { |
jfields | 0:ec69a5b677ed | 32 | run_status = 1; |
jfields | 0:ec69a5b677ed | 33 | LPC_TIM0->TCR |= 1; |
jfields | 0:ec69a5b677ed | 34 | } |
jfields | 0:ec69a5b677ed | 35 | if ( input == 'p') { |
jfields | 0:ec69a5b677ed | 36 | run_status = 2; |
jfields | 0:ec69a5b677ed | 37 | LPC_TIM0->TCR &= ~1; |
jfields | 0:ec69a5b677ed | 38 | } |
jfields | 0:ec69a5b677ed | 39 | if ( input == 'r') { |
jfields | 0:ec69a5b677ed | 40 | if (run_status == 2) { |
jfields | 0:ec69a5b677ed | 41 | for (int i=0; i<6; i++) t[i]=0; |
jfields | 0:ec69a5b677ed | 42 | update_display(); |
jfields | 0:ec69a5b677ed | 43 | } |
jfields | 0:ec69a5b677ed | 44 | } |
jfields | 0:ec69a5b677ed | 45 | |
jfields | 0:ec69a5b677ed | 46 | input = pc.getc(); |
jfields | 0:ec69a5b677ed | 47 | |
jfields | 0:ec69a5b677ed | 48 | } |
jfields | 0:ec69a5b677ed | 49 | } |
jfields | 0:ec69a5b677ed | 50 | |
jfields | 0:ec69a5b677ed | 51 | void update_display() { |
jfields | 0:ec69a5b677ed | 52 | lcd.printf("%d%d:%d%d:%d%d\n\n",t[5],t[4],t[3],t[2],t[1],t[0]); |
jfields | 0:ec69a5b677ed | 53 | } |
jfields | 0:ec69a5b677ed | 54 | |
jfields | 0:ec69a5b677ed | 55 | void update_timer() { |
jfields | 0:ec69a5b677ed | 56 | // signal = 1 : start |
jfields | 0:ec69a5b677ed | 57 | // signal = 2 : stop |
jfields | 0:ec69a5b677ed | 58 | |
jfields | 0:ec69a5b677ed | 59 | if (run_status == 1) { |
jfields | 0:ec69a5b677ed | 60 | |
jfields | 0:ec69a5b677ed | 61 | // update m0 |
jfields | 0:ec69a5b677ed | 62 | t[0]++; |
jfields | 0:ec69a5b677ed | 63 | |
jfields | 0:ec69a5b677ed | 64 | // update m1 |
jfields | 0:ec69a5b677ed | 65 | if (t[0] >= 10) { |
jfields | 0:ec69a5b677ed | 66 | t[0] = 0; |
jfields | 0:ec69a5b677ed | 67 | t[1]++; |
jfields | 0:ec69a5b677ed | 68 | |
jfields | 0:ec69a5b677ed | 69 | // update S0 |
jfields | 0:ec69a5b677ed | 70 | if (t[1] >= 10) { |
jfields | 0:ec69a5b677ed | 71 | t[1] = 0; |
jfields | 0:ec69a5b677ed | 72 | t[2]++; |
jfields | 0:ec69a5b677ed | 73 | |
jfields | 0:ec69a5b677ed | 74 | // update S1 |
jfields | 0:ec69a5b677ed | 75 | if (t[2] >= 10) { |
jfields | 0:ec69a5b677ed | 76 | t[2] = 0; |
jfields | 0:ec69a5b677ed | 77 | t[3]++; |
jfields | 0:ec69a5b677ed | 78 | |
jfields | 0:ec69a5b677ed | 79 | // update M0 |
jfields | 0:ec69a5b677ed | 80 | if (t[3] >= 6) { |
jfields | 0:ec69a5b677ed | 81 | t[3]=0; |
jfields | 0:ec69a5b677ed | 82 | t[4]++; |
jfields | 0:ec69a5b677ed | 83 | |
jfields | 0:ec69a5b677ed | 84 | // update M1 |
jfields | 0:ec69a5b677ed | 85 | if (t[4] >= 10) { |
jfields | 0:ec69a5b677ed | 86 | t[4]=0; |
jfields | 0:ec69a5b677ed | 87 | t[5]++; |
jfields | 0:ec69a5b677ed | 88 | } |
jfields | 0:ec69a5b677ed | 89 | } |
jfields | 0:ec69a5b677ed | 90 | } |
jfields | 0:ec69a5b677ed | 91 | } |
jfields | 0:ec69a5b677ed | 92 | } |
jfields | 0:ec69a5b677ed | 93 | |
jfields | 0:ec69a5b677ed | 94 | // update display |
jfields | 0:ec69a5b677ed | 95 | update_display(); |
jfields | 0:ec69a5b677ed | 96 | } |
jfields | 0:ec69a5b677ed | 97 | |
jfields | 0:ec69a5b677ed | 98 | // reset interrupt |
jfields | 0:ec69a5b677ed | 99 | LPC_TIM0->IR |= 1 << 0; |
jfields | 0:ec69a5b677ed | 100 | } |
jfields | 0:ec69a5b677ed | 101 | |
jfields | 0:ec69a5b677ed | 102 | void init_timer0() { |
jfields | 0:ec69a5b677ed | 103 | |
jfields | 0:ec69a5b677ed | 104 | //power up TIMER0 (PCONP[1]) |
jfields | 0:ec69a5b677ed | 105 | LPC_SC->PCONP |= 1 << 1; |
jfields | 0:ec69a5b677ed | 106 | |
jfields | 0:ec69a5b677ed | 107 | // reset and set TIMER0 to timer mode |
jfields | 0:ec69a5b677ed | 108 | LPC_TIM0->TCR = 0x2; |
jfields | 0:ec69a5b677ed | 109 | LPC_TIM0->CTCR = 0x0; |
jfields | 0:ec69a5b677ed | 110 | |
jfields | 0:ec69a5b677ed | 111 | // set no prescaler |
jfields | 0:ec69a5b677ed | 112 | LPC_TIM0->PR = 0; |
jfields | 0:ec69a5b677ed | 113 | |
jfields | 0:ec69a5b677ed | 114 | // calculate period (1 interrupt every 1/100 second) |
jfields | 0:ec69a5b677ed | 115 | uint32_t period = 240000; |
jfields | 0:ec69a5b677ed | 116 | |
jfields | 0:ec69a5b677ed | 117 | // set match register and enable interrupt |
jfields | 0:ec69a5b677ed | 118 | LPC_TIM0->MR0 = period; |
jfields | 0:ec69a5b677ed | 119 | LPC_TIM0->MCR |= 1 << 0; // interrupt on match |
jfields | 0:ec69a5b677ed | 120 | LPC_TIM0->MCR |= 1 << 1; // reset on match |
jfields | 0:ec69a5b677ed | 121 | |
jfields | 0:ec69a5b677ed | 122 | // enable the vector in the interrupt controller |
jfields | 0:ec69a5b677ed | 123 | NVIC_SetVector(TIMER0_IRQn, (uint32_t)&update_timer); |
jfields | 0:ec69a5b677ed | 124 | NVIC_EnableIRQ(TIMER0_IRQn); |
jfields | 0:ec69a5b677ed | 125 | |
jfields | 0:ec69a5b677ed | 126 | // start the timer |
jfields | 0:ec69a5b677ed | 127 | LPC_TIM0->TCR = 1; |
jfields | 0:ec69a5b677ed | 128 | } |