Fred Barnes / Mbed 2 deprecated co657_driving_test_2

Dependencies:   C12832 LM75B mbed

Fork of co657_driving_test_1 by Fred Barnes

Committer:
co657_frmb
Date:
Mon Sep 28 15:42:57 2015 +0000
Revision:
2:2b973afc0924
Parent:
1:a6827c4eef14
Child:
3:729390b9d794
Assorted small updates.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
co657_frmb 0:38ecd3d98f79 1 /*
co657_frmb 1:a6827c4eef14 2 * dtest2.cpp -- driving test for CO657 (interacting with the shield)
co657_frmb 0:38ecd3d98f79 3 * Copyright (C) 2015 Fred Barnes, University of Kent <frmb@kent.ac.uk>
co657_frmb 0:38ecd3d98f79 4 * GPL >= 2.0
co657_frmb 0:38ecd3d98f79 5 */
co657_frmb 0:38ecd3d98f79 6
co657_frmb 0:38ecd3d98f79 7 #include "mbed.h" /* stock MBED API */
co657_frmb 1:a6827c4eef14 8 #include "C12832.h" /* for the LCD */
co657_frmb 2:2b973afc0924 9 #include "LM75B.h" /* for the temperature sensor */
co657_frmb 0:38ecd3d98f79 10
co657_frmb 0:38ecd3d98f79 11 /* assorted globals */
co657_frmb 0:38ecd3d98f79 12
co657_frmb 0:38ecd3d98f79 13 DigitalOut r_led (LED1); /* connections for RGB LED */
co657_frmb 0:38ecd3d98f79 14 DigitalOut g_led (LED2);
co657_frmb 0:38ecd3d98f79 15 DigitalOut b_led (LED3);
co657_frmb 0:38ecd3d98f79 16
co657_frmb 1:a6827c4eef14 17 DigitalOut xr_led (D5);
co657_frmb 1:a6827c4eef14 18 DigitalOut xg_led (D9);
co657_frmb 1:a6827c4eef14 19 DigitalOut xb_led (D8);
co657_frmb 1:a6827c4eef14 20
co657_frmb 0:38ecd3d98f79 21 Serial host (USBTX, USBRX); /* to-host UART via OpenSDAv2 */
co657_frmb 0:38ecd3d98f79 22
co657_frmb 0:38ecd3d98f79 23 InterruptIn sw2_int (PTC6); /* interrupts for the two on-board switches */
co657_frmb 0:38ecd3d98f79 24 InterruptIn sw3_int (PTA4);
co657_frmb 0:38ecd3d98f79 25
co657_frmb 0:38ecd3d98f79 26 Ticker rgb_tick; /* timer for driving the LED */
co657_frmb 0:38ecd3d98f79 27
co657_frmb 1:a6827c4eef14 28 C12832 shld_lcd (D11, D13, D12, D7, D10); /* LCD on the shield (128x32) */
co657_frmb 1:a6827c4eef14 29
co657_frmb 2:2b973afc0924 30 LM75B lm_temp (D14, D15); /* temperature sensor */
co657_frmb 2:2b973afc0924 31
co657_frmb 0:38ecd3d98f79 32 static volatile uint16_t counters[3]; /* red, green, blue */
co657_frmb 0:38ecd3d98f79 33 static volatile uint8_t bright[3];
co657_frmb 0:38ecd3d98f79 34
co657_frmb 0:38ecd3d98f79 35 static volatile int sw2_trig; /* switches triggered? */
co657_frmb 0:38ecd3d98f79 36 static volatile int sw3_trig;
co657_frmb 0:38ecd3d98f79 37
co657_frmb 0:38ecd3d98f79 38
co657_frmb 0:38ecd3d98f79 39 /*
co657_frmb 0:38ecd3d98f79 40 * turns offset [0-311] into brightness level [0-255-255-0].
co657_frmb 0:38ecd3d98f79 41 */
co657_frmb 0:38ecd3d98f79 42 uint8_t brilvl (int offset)
co657_frmb 0:38ecd3d98f79 43 {
co657_frmb 0:38ecd3d98f79 44 while (offset > 311) {
co657_frmb 0:38ecd3d98f79 45 offset -= 312;
co657_frmb 0:38ecd3d98f79 46 }
co657_frmb 0:38ecd3d98f79 47 if (offset < 52) {
co657_frmb 0:38ecd3d98f79 48 return (uint8_t)(offset * 5);
co657_frmb 0:38ecd3d98f79 49 } else if (offset < 156) {
co657_frmb 0:38ecd3d98f79 50 return 255;
co657_frmb 0:38ecd3d98f79 51 } else if (offset < 208) {
co657_frmb 0:38ecd3d98f79 52 return (uint8_t)((207 - offset) * 5);
co657_frmb 0:38ecd3d98f79 53 }
co657_frmb 0:38ecd3d98f79 54 return 0;
co657_frmb 0:38ecd3d98f79 55 }
co657_frmb 0:38ecd3d98f79 56
co657_frmb 0:38ecd3d98f79 57
co657_frmb 0:38ecd3d98f79 58 /*
co657_frmb 0:38ecd3d98f79 59 * resets the various counters to their initial state
co657_frmb 0:38ecd3d98f79 60 */
co657_frmb 0:38ecd3d98f79 61 void reset_counters (void)
co657_frmb 0:38ecd3d98f79 62 {
co657_frmb 0:38ecd3d98f79 63 for (int i=0; i<3; i++) {
co657_frmb 0:38ecd3d98f79 64 counters[i] = 0;
co657_frmb 0:38ecd3d98f79 65 bright[i] = brilvl (i * 104);
co657_frmb 0:38ecd3d98f79 66 }
co657_frmb 0:38ecd3d98f79 67 }
co657_frmb 0:38ecd3d98f79 68
co657_frmb 0:38ecd3d98f79 69
co657_frmb 0:38ecd3d98f79 70 /*
co657_frmb 0:38ecd3d98f79 71 * interrupt handlers
co657_frmb 0:38ecd3d98f79 72 */
co657_frmb 0:38ecd3d98f79 73 void rgb_tick_interrupt (void)
co657_frmb 0:38ecd3d98f79 74 {
co657_frmb 0:38ecd3d98f79 75 for (int i=0; i<3; i++) {
co657_frmb 0:38ecd3d98f79 76 counters[i] += (uint16_t)bright[i];
co657_frmb 0:38ecd3d98f79 77 }
co657_frmb 0:38ecd3d98f79 78
co657_frmb 0:38ecd3d98f79 79 r_led = ((counters[0] >> 8) & 1) ^ 1;
co657_frmb 0:38ecd3d98f79 80 g_led = ((counters[1] >> 8) & 1) ^ 1;
co657_frmb 0:38ecd3d98f79 81 b_led = ((counters[2] >> 8) & 1) ^ 1;
co657_frmb 0:38ecd3d98f79 82
co657_frmb 1:a6827c4eef14 83 xr_led = ((counters[0] >> 8) & 1);
co657_frmb 1:a6827c4eef14 84 xg_led = ((counters[1] >> 8) & 1);
co657_frmb 1:a6827c4eef14 85 xb_led = ((counters[2] >> 8) & 1);
co657_frmb 1:a6827c4eef14 86
co657_frmb 0:38ecd3d98f79 87 for (int i=0; i<3; i++) {
co657_frmb 0:38ecd3d98f79 88 counters[i] &= 0xff;
co657_frmb 0:38ecd3d98f79 89 }
co657_frmb 0:38ecd3d98f79 90 }
co657_frmb 0:38ecd3d98f79 91
co657_frmb 0:38ecd3d98f79 92
co657_frmb 0:38ecd3d98f79 93 void sw2_interrupt (void)
co657_frmb 0:38ecd3d98f79 94 {
co657_frmb 0:38ecd3d98f79 95 sw2_trig = 1;
co657_frmb 0:38ecd3d98f79 96 }
co657_frmb 0:38ecd3d98f79 97
co657_frmb 0:38ecd3d98f79 98
co657_frmb 0:38ecd3d98f79 99 void sw3_interrupt (void)
co657_frmb 0:38ecd3d98f79 100 {
co657_frmb 0:38ecd3d98f79 101 sw3_trig = 1;
co657_frmb 0:38ecd3d98f79 102 }
co657_frmb 0:38ecd3d98f79 103
co657_frmb 0:38ecd3d98f79 104
co657_frmb 0:38ecd3d98f79 105
co657_frmb 0:38ecd3d98f79 106
co657_frmb 0:38ecd3d98f79 107 /*
co657_frmb 0:38ecd3d98f79 108 * start here
co657_frmb 0:38ecd3d98f79 109 */
co657_frmb 0:38ecd3d98f79 110 int main (void)
co657_frmb 0:38ecd3d98f79 111 {
co657_frmb 0:38ecd3d98f79 112 int ctr;
co657_frmb 0:38ecd3d98f79 113
co657_frmb 0:38ecd3d98f79 114 host.baud (38400);
co657_frmb 0:38ecd3d98f79 115 host.printf ("Hello, FRDM-K64F driving-test world!\r\n");
co657_frmb 0:38ecd3d98f79 116
co657_frmb 0:38ecd3d98f79 117 sw2_trig = 0;
co657_frmb 0:38ecd3d98f79 118 sw3_trig = 0;
co657_frmb 0:38ecd3d98f79 119
co657_frmb 0:38ecd3d98f79 120 reset_counters ();
co657_frmb 0:38ecd3d98f79 121
co657_frmb 1:a6827c4eef14 122 shld_lcd.cls ();
co657_frmb 1:a6827c4eef14 123 shld_lcd.locate (1, 1);
co657_frmb 2:2b973afc0924 124 shld_lcd.printf ("Hello, CO657!");
co657_frmb 1:a6827c4eef14 125
co657_frmb 0:38ecd3d98f79 126 rgb_tick.attach (&rgb_tick_interrupt, 0.001);
co657_frmb 0:38ecd3d98f79 127 ctr = 0;
co657_frmb 0:38ecd3d98f79 128
co657_frmb 1:a6827c4eef14 129 xr_led = 0;
co657_frmb 1:a6827c4eef14 130
co657_frmb 0:38ecd3d98f79 131 sw2_int.mode (PullUp);
co657_frmb 0:38ecd3d98f79 132 sw2_int.fall (&sw2_interrupt);
co657_frmb 0:38ecd3d98f79 133
co657_frmb 0:38ecd3d98f79 134 sw3_int.mode (PullUp);
co657_frmb 0:38ecd3d98f79 135 sw3_int.fall (&sw3_interrupt);
co657_frmb 0:38ecd3d98f79 136
co657_frmb 0:38ecd3d98f79 137 /* and then forever.. */
co657_frmb 0:38ecd3d98f79 138 for (;;) {
co657_frmb 1:a6827c4eef14 139 wait (0.02); /* approx 50 cycles/sec */
co657_frmb 0:38ecd3d98f79 140
co657_frmb 2:2b973afc0924 141 if ((ctr & 0x1f) == 0) {
co657_frmb 2:2b973afc0924 142 /* every 32 cycles, or thereabouts (will be truncated) */
co657_frmb 2:2b973afc0924 143 float t = lm_temp.read ();
co657_frmb 2:2b973afc0924 144
co657_frmb 2:2b973afc0924 145 shld_lcd.locate (1, 10);
co657_frmb 2:2b973afc0924 146 shld_lcd.printf ("Temp: %.2f", t);
co657_frmb 2:2b973afc0924 147 }
co657_frmb 2:2b973afc0924 148
co657_frmb 0:38ecd3d98f79 149 if (sw2_trig) {
co657_frmb 0:38ecd3d98f79 150 ctr += 104;
co657_frmb 0:38ecd3d98f79 151 sw2_trig = 0;
co657_frmb 0:38ecd3d98f79 152 }
co657_frmb 0:38ecd3d98f79 153 if (sw3_trig) {
co657_frmb 0:38ecd3d98f79 154 ctr += 208;
co657_frmb 0:38ecd3d98f79 155 sw3_trig = 0;
co657_frmb 0:38ecd3d98f79 156 }
co657_frmb 0:38ecd3d98f79 157
co657_frmb 0:38ecd3d98f79 158 ctr++;
co657_frmb 0:38ecd3d98f79 159 if (ctr > 311) {
co657_frmb 0:38ecd3d98f79 160 ctr -= 312;
co657_frmb 0:38ecd3d98f79 161 }
co657_frmb 0:38ecd3d98f79 162 for (int i=0; i<3; i++) {
co657_frmb 0:38ecd3d98f79 163 bright[i] = brilvl (ctr + (i * 104));
co657_frmb 0:38ecd3d98f79 164 }
co657_frmb 0:38ecd3d98f79 165 }
co657_frmb 0:38ecd3d98f79 166 }
co657_frmb 0:38ecd3d98f79 167