timer0 stopwatch

Dependencies:   TextLCD mbed

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?

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