The London Hackspace Bandwidth meter, now works over ethernet.
Dependencies: EthernetInterface LPD8806 Tiny-HTTPD mbed-rtos mbed BonjourLib
vfd.cpp@4:d522cfa6e410, 2014-05-30 (annotated)
- Committer:
- Jasper
- Date:
- Fri May 30 09:45:45 2014 +0000
- Revision:
- 4:d522cfa6e410
- Parent:
- 0:0e7057b49904
commiting for some reason?
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jasper | 0:0e7057b49904 | 1 | /* |
Jasper | 0:0e7057b49904 | 2 | * The VFD code |
Jasper | 0:0e7057b49904 | 3 | * |
Jasper | 0:0e7057b49904 | 4 | * for a futuba M204LD01AA |
Jasper | 0:0e7057b49904 | 5 | * |
Jasper | 0:0e7057b49904 | 6 | * |
Jasper | 0:0e7057b49904 | 7 | * p27 -> input, busy |
Jasper | 0:0e7057b49904 | 8 | * p28 -> serial data in |
Jasper | 0:0e7057b49904 | 9 | * p29 -> clock |
Jasper | 0:0e7057b49904 | 10 | * p30 -> latch |
Jasper | 0:0e7057b49904 | 11 | * |
Jasper | 0:0e7057b49904 | 12 | * |
Jasper | 0:0e7057b49904 | 13 | */ |
Jasper | 0:0e7057b49904 | 14 | |
Jasper | 0:0e7057b49904 | 15 | #include "mbed.h" |
Jasper | 0:0e7057b49904 | 16 | #include "vfd.h" |
Jasper | 0:0e7057b49904 | 17 | //#include "Stream.h" |
Jasper | 0:0e7057b49904 | 18 | //#include "FunctionPointer.h" |
Jasper | 0:0e7057b49904 | 19 | |
Jasper | 0:0e7057b49904 | 20 | // InturruptIn busy_intr(p27) |
Jasper | 0:0e7057b49904 | 21 | |
Jasper | 0:0e7057b49904 | 22 | DigitalIn vfd_p_busy(p27); |
Jasper | 0:0e7057b49904 | 23 | DigitalOut vfd_p_data(p28); |
Jasper | 0:0e7057b49904 | 24 | DigitalOut vfd_p_clock(p29); |
Jasper | 0:0e7057b49904 | 25 | DigitalOut vfd_p_latch(p30); |
Jasper | 0:0e7057b49904 | 26 | |
Jasper | 0:0e7057b49904 | 27 | /* current state */ |
Jasper | 0:0e7057b49904 | 28 | int c_data; |
Jasper | 0:0e7057b49904 | 29 | bool c_a0; |
Jasper | 0:0e7057b49904 | 30 | bool c_blank; |
Jasper | 0:0e7057b49904 | 31 | |
Jasper | 0:0e7057b49904 | 32 | bool vfd_dead = 0; |
Jasper | 0:0e7057b49904 | 33 | |
Jasper | 0:0e7057b49904 | 34 | void vfd_shift_clock(void) { |
Jasper | 0:0e7057b49904 | 35 | vfd_p_clock = 0; |
Jasper | 0:0e7057b49904 | 36 | wait_us(10); |
Jasper | 0:0e7057b49904 | 37 | vfd_p_clock = 1; |
Jasper | 0:0e7057b49904 | 38 | wait_us(10); |
Jasper | 0:0e7057b49904 | 39 | } |
Jasper | 0:0e7057b49904 | 40 | |
Jasper | 0:0e7057b49904 | 41 | void vfd_doit(int data, int mode, int wr, int ss, int reset) { |
Jasper | 0:0e7057b49904 | 42 | int i, bit; |
Jasper | 0:0e7057b49904 | 43 | |
Jasper | 0:0e7057b49904 | 44 | vfd_p_data = 0; // nc |
Jasper | 0:0e7057b49904 | 45 | vfd_shift_clock(); |
Jasper | 0:0e7057b49904 | 46 | vfd_p_data = 0; // nc |
Jasper | 0:0e7057b49904 | 47 | vfd_shift_clock(); |
Jasper | 0:0e7057b49904 | 48 | |
Jasper | 0:0e7057b49904 | 49 | vfd_p_data = reset; // reset, 0 = in reset |
Jasper | 0:0e7057b49904 | 50 | vfd_shift_clock(); |
Jasper | 0:0e7057b49904 | 51 | |
Jasper | 0:0e7057b49904 | 52 | vfd_p_data = c_blank; // Blank, 0 = blanked |
Jasper | 0:0e7057b49904 | 53 | vfd_shift_clock(); |
Jasper | 0:0e7057b49904 | 54 | |
Jasper | 0:0e7057b49904 | 55 | vfd_p_data = ss; // SS, clockish |
Jasper | 0:0e7057b49904 | 56 | vfd_shift_clock(); |
Jasper | 0:0e7057b49904 | 57 | |
Jasper | 0:0e7057b49904 | 58 | vfd_p_data = 1; // rd |
Jasper | 0:0e7057b49904 | 59 | vfd_shift_clock(); |
Jasper | 0:0e7057b49904 | 60 | |
Jasper | 0:0e7057b49904 | 61 | vfd_p_data = mode; // A0, data/command |
Jasper | 0:0e7057b49904 | 62 | vfd_shift_clock(); |
Jasper | 0:0e7057b49904 | 63 | |
Jasper | 0:0e7057b49904 | 64 | vfd_p_data = wr; // WR |
Jasper | 0:0e7057b49904 | 65 | vfd_shift_clock(); |
Jasper | 0:0e7057b49904 | 66 | |
Jasper | 0:0e7057b49904 | 67 | for (i = 0 ; i < 8; i++) { |
Jasper | 0:0e7057b49904 | 68 | bit = (data & (1 << i)) >> i; |
Jasper | 0:0e7057b49904 | 69 | vfd_p_data = bit; |
Jasper | 0:0e7057b49904 | 70 | vfd_shift_clock(); |
Jasper | 0:0e7057b49904 | 71 | } |
Jasper | 0:0e7057b49904 | 72 | |
Jasper | 0:0e7057b49904 | 73 | vfd_p_latch = 0; |
Jasper | 0:0e7057b49904 | 74 | wait_us(10); |
Jasper | 0:0e7057b49904 | 75 | vfd_p_latch = 1; |
Jasper | 0:0e7057b49904 | 76 | wait_us(10); |
Jasper | 0:0e7057b49904 | 77 | } |
Jasper | 0:0e7057b49904 | 78 | |
Jasper | 0:0e7057b49904 | 79 | /* mode == 1 if command */ |
Jasper | 0:0e7057b49904 | 80 | void vfd_send(int data, int mode, int force) |
Jasper | 0:0e7057b49904 | 81 | { |
Jasper | 0:0e7057b49904 | 82 | data = data & 0xff; |
Jasper | 0:0e7057b49904 | 83 | c_data = data; |
Jasper | 0:0e7057b49904 | 84 | c_blank = 1; |
Jasper | 0:0e7057b49904 | 85 | |
Jasper | 0:0e7057b49904 | 86 | // if (mode == 0) |
Jasper | 0:0e7057b49904 | 87 | // printf("%02x ", data); |
Jasper | 0:0e7057b49904 | 88 | |
Jasper | 0:0e7057b49904 | 89 | if (vfd_dead && ! force) { |
Jasper | 0:0e7057b49904 | 90 | printf("vfd dead (?), not sending.\r\n"); |
Jasper | 0:0e7057b49904 | 91 | return; |
Jasper | 0:0e7057b49904 | 92 | } |
Jasper | 0:0e7057b49904 | 93 | if (force) |
Jasper | 0:0e7057b49904 | 94 | printf("forcing vfd for 0x%02x %d\r\n", data, mode); |
Jasper | 0:0e7057b49904 | 95 | |
Jasper | 0:0e7057b49904 | 96 | if (vfd_p_busy) { |
Jasper | 0:0e7057b49904 | 97 | printf("pre, busy: %d\r\n", vfd_p_busy.read()); |
Jasper | 0:0e7057b49904 | 98 | } |
Jasper | 0:0e7057b49904 | 99 | |
Jasper | 0:0e7057b49904 | 100 | if (vfd_p_busy) |
Jasper | 0:0e7057b49904 | 101 | { |
Jasper | 0:0e7057b49904 | 102 | wait_ms(4); // should loop, 3.1 ms is max according to the data sheet. |
Jasper | 0:0e7057b49904 | 103 | if (vfd_p_busy) |
Jasper | 0:0e7057b49904 | 104 | { |
Jasper | 0:0e7057b49904 | 105 | printf("still busy :(\r\n"); |
Jasper | 0:0e7057b49904 | 106 | printf("resetting\r\n"); |
Jasper | 0:0e7057b49904 | 107 | if (!force) |
Jasper | 0:0e7057b49904 | 108 | vfd_reset(); |
Jasper | 0:0e7057b49904 | 109 | if (vfd_p_busy) { |
Jasper | 0:0e7057b49904 | 110 | printf("still busy after reset!\r\n"); |
Jasper | 0:0e7057b49904 | 111 | if (!force) |
Jasper | 0:0e7057b49904 | 112 | return; |
Jasper | 0:0e7057b49904 | 113 | } |
Jasper | 0:0e7057b49904 | 114 | if (!force) |
Jasper | 0:0e7057b49904 | 115 | return; |
Jasper | 0:0e7057b49904 | 116 | } |
Jasper | 0:0e7057b49904 | 117 | } |
Jasper | 0:0e7057b49904 | 118 | |
Jasper | 0:0e7057b49904 | 119 | /* wr,ss */ |
Jasper | 0:0e7057b49904 | 120 | vfd_doit(data, mode, 0, 0, 1); |
Jasper | 0:0e7057b49904 | 121 | wait_us(1); |
Jasper | 0:0e7057b49904 | 122 | vfd_doit(data, mode, 1, 0, 1); |
Jasper | 0:0e7057b49904 | 123 | wait_us(1); |
Jasper | 0:0e7057b49904 | 124 | vfd_doit(data, mode, 1, 1, 1); |
Jasper | 0:0e7057b49904 | 125 | wait_us(1); |
Jasper | 0:0e7057b49904 | 126 | |
Jasper | 0:0e7057b49904 | 127 | if (vfd_p_busy) |
Jasper | 0:0e7057b49904 | 128 | printf("post1, busy: %d\r\n", vfd_p_busy.read()); |
Jasper | 0:0e7057b49904 | 129 | |
Jasper | 0:0e7057b49904 | 130 | vfd_doit(data, mode, 0, 0, 1); |
Jasper | 0:0e7057b49904 | 131 | |
Jasper | 0:0e7057b49904 | 132 | if (vfd_p_busy) |
Jasper | 0:0e7057b49904 | 133 | printf("post2, busy: %d\r\n", vfd_p_busy.read()); |
Jasper | 0:0e7057b49904 | 134 | |
Jasper | 0:0e7057b49904 | 135 | // loop and wait for not busy |
Jasper | 0:0e7057b49904 | 136 | while (vfd_p_busy) { |
Jasper | 0:0e7057b49904 | 137 | wait_us(250); |
Jasper | 0:0e7057b49904 | 138 | printf("post-while, busy: %d\r\n", vfd_p_busy.read()); |
Jasper | 0:0e7057b49904 | 139 | } |
Jasper | 0:0e7057b49904 | 140 | } |
Jasper | 0:0e7057b49904 | 141 | |
Jasper | 0:0e7057b49904 | 142 | void vfd_command(int data, int force) { |
Jasper | 0:0e7057b49904 | 143 | vfd_send(data, 1, force); |
Jasper | 0:0e7057b49904 | 144 | } |
Jasper | 0:0e7057b49904 | 145 | |
Jasper | 0:0e7057b49904 | 146 | void vfd_data(int data) { |
Jasper | 0:0e7057b49904 | 147 | if ((data & 0xff) == 0x7f) { |
Jasper | 0:0e7057b49904 | 148 | data = 0x20; |
Jasper | 0:0e7057b49904 | 149 | printf("changed data to %02x\r\n", data); |
Jasper | 0:0e7057b49904 | 150 | } |
Jasper | 0:0e7057b49904 | 151 | vfd_send(data, 0, 0); |
Jasper | 0:0e7057b49904 | 152 | } |
Jasper | 0:0e7057b49904 | 153 | |
Jasper | 0:0e7057b49904 | 154 | void vfd_init(void) { |
Jasper | 0:0e7057b49904 | 155 | vfd_data(0x11); // normal mode |
Jasper | 0:0e7057b49904 | 156 | vfd_data(0x0c); // clear |
Jasper | 0:0e7057b49904 | 157 | vfd_data(0x1b); // esc |
Jasper | 0:0e7057b49904 | 158 | vfd_data(0); // v pos |
Jasper | 0:0e7057b49904 | 159 | vfd_data(0); // h pos |
Jasper | 0:0e7057b49904 | 160 | } |
Jasper | 0:0e7057b49904 | 161 | |
Jasper | 0:0e7057b49904 | 162 | void vfd_blank(void) { |
Jasper | 0:0e7057b49904 | 163 | /* blank */ |
Jasper | 0:0e7057b49904 | 164 | } |
Jasper | 0:0e7057b49904 | 165 | |
Jasper | 0:0e7057b49904 | 166 | void vfd_show(void) { |
Jasper | 0:0e7057b49904 | 167 | /* unblank */ |
Jasper | 0:0e7057b49904 | 168 | } |
Jasper | 0:0e7057b49904 | 169 | |
Jasper | 0:0e7057b49904 | 170 | void vfd_pos(int h, int v) { |
Jasper | 0:0e7057b49904 | 171 | if (v > 3 || v < 0) |
Jasper | 0:0e7057b49904 | 172 | return; |
Jasper | 0:0e7057b49904 | 173 | if (h > 19 || h < 0) |
Jasper | 0:0e7057b49904 | 174 | return; |
Jasper | 0:0e7057b49904 | 175 | vfd_data(0x1b); |
Jasper | 0:0e7057b49904 | 176 | vfd_data(v); |
Jasper | 0:0e7057b49904 | 177 | vfd_data(h); |
Jasper | 0:0e7057b49904 | 178 | } |
Jasper | 0:0e7057b49904 | 179 | |
Jasper | 0:0e7057b49904 | 180 | void vfd_reset(void) { |
Jasper | 0:0e7057b49904 | 181 | int i, data, mode; |
Jasper | 0:0e7057b49904 | 182 | |
Jasper | 0:0e7057b49904 | 183 | data = 0; mode = 1; |
Jasper | 0:0e7057b49904 | 184 | |
Jasper | 0:0e7057b49904 | 185 | printf("reset sent, busy: %d\r\n", vfd_p_busy.read()); |
Jasper | 0:0e7057b49904 | 186 | |
Jasper | 0:0e7057b49904 | 187 | /* everything low, includeing reset */ |
Jasper | 0:0e7057b49904 | 188 | for (i = 0 ; i < 16; i++) { |
Jasper | 0:0e7057b49904 | 189 | vfd_p_data = 0; |
Jasper | 0:0e7057b49904 | 190 | vfd_shift_clock(); |
Jasper | 0:0e7057b49904 | 191 | } |
Jasper | 0:0e7057b49904 | 192 | vfd_p_latch = 0; |
Jasper | 0:0e7057b49904 | 193 | wait_us(10); |
Jasper | 0:0e7057b49904 | 194 | vfd_p_latch = 1; |
Jasper | 0:0e7057b49904 | 195 | |
Jasper | 0:0e7057b49904 | 196 | vfd_doit(data, mode, 0, 0, 1); |
Jasper | 0:0e7057b49904 | 197 | wait_us(1); |
Jasper | 0:0e7057b49904 | 198 | vfd_doit(data, mode, 1, 0, 1); |
Jasper | 0:0e7057b49904 | 199 | wait_us(1); |
Jasper | 0:0e7057b49904 | 200 | vfd_doit(data, mode, 1, 1, 1); |
Jasper | 0:0e7057b49904 | 201 | wait_us(1); |
Jasper | 0:0e7057b49904 | 202 | |
Jasper | 0:0e7057b49904 | 203 | if (vfd_p_busy) |
Jasper | 0:0e7057b49904 | 204 | printf("post1, busy: %d\r\n", vfd_p_busy.read()); |
Jasper | 0:0e7057b49904 | 205 | |
Jasper | 0:0e7057b49904 | 206 | vfd_doit(data, mode, 0, 0, 1); |
Jasper | 0:0e7057b49904 | 207 | wait_ms(4); // loop and wait for not busy |
Jasper | 0:0e7057b49904 | 208 | |
Jasper | 0:0e7057b49904 | 209 | printf("reset sent, busy: %d\r\n", vfd_p_busy.read()); |
Jasper | 0:0e7057b49904 | 210 | wait_ms(10); |
Jasper | 0:0e7057b49904 | 211 | if (vfd_p_busy) { |
Jasper | 0:0e7057b49904 | 212 | printf("still busy, not calling vfd_init()\r\n"); |
Jasper | 0:0e7057b49904 | 213 | vfd_reset_cmd(); |
Jasper | 0:0e7057b49904 | 214 | printf("post reset_cmd\r\n"); |
Jasper | 0:0e7057b49904 | 215 | if (vfd_p_busy) { |
Jasper | 0:0e7057b49904 | 216 | printf("Also still busy, marking as dead\r\n"); |
Jasper | 0:0e7057b49904 | 217 | vfd_dead = 1; |
Jasper | 0:0e7057b49904 | 218 | } else { |
Jasper | 0:0e7057b49904 | 219 | vfd_init(); |
Jasper | 0:0e7057b49904 | 220 | } |
Jasper | 0:0e7057b49904 | 221 | wait_ms(10); |
Jasper | 0:0e7057b49904 | 222 | } else { |
Jasper | 0:0e7057b49904 | 223 | if (!vfd_dead) |
Jasper | 0:0e7057b49904 | 224 | vfd_init(); |
Jasper | 0:0e7057b49904 | 225 | } |
Jasper | 0:0e7057b49904 | 226 | } |
Jasper | 0:0e7057b49904 | 227 | |
Jasper | 0:0e7057b49904 | 228 | void vfd_reset_cmd(void) { |
Jasper | 0:0e7057b49904 | 229 | vfd_command(0xff, 1); |
Jasper | 0:0e7057b49904 | 230 | } |
Jasper | 0:0e7057b49904 | 231 | |
Jasper | 0:0e7057b49904 | 232 | void send_text(const char *s) { |
Jasper | 0:0e7057b49904 | 233 | int i; char c; |
Jasper | 0:0e7057b49904 | 234 | |
Jasper | 0:0e7057b49904 | 235 | for (i = 0, c=s[i]; c != 0; i++, c=s[i]) |
Jasper | 0:0e7057b49904 | 236 | vfd_data(c); |
Jasper | 0:0e7057b49904 | 237 | } |
Jasper | 0:0e7057b49904 | 238 | |
Jasper | 0:0e7057b49904 | 239 | void text_centered(const char *s, int hpos) { |
Jasper | 0:0e7057b49904 | 240 | |
Jasper | 0:0e7057b49904 | 241 | vfd_pos((20 / 2) - (strlen(s)) / 2, hpos); |
Jasper | 0:0e7057b49904 | 242 | send_text(s); |
Jasper | 0:0e7057b49904 | 243 | } |
Jasper | 0:0e7057b49904 | 244 | |
Jasper | 0:0e7057b49904 | 245 | void logo(void) { |
Jasper | 0:0e7057b49904 | 246 | const char line0[] = "Welcome to"; |
Jasper | 0:0e7057b49904 | 247 | const char line2[] = "London Hackspace"; |
Jasper | 0:0e7057b49904 | 248 | |
Jasper | 0:0e7057b49904 | 249 | text_centered(line0, 0); |
Jasper | 0:0e7057b49904 | 250 | text_centered(line2, 2); |
Jasper | 0:0e7057b49904 | 251 | } |
Jasper | 0:0e7057b49904 | 252 | |
Jasper | 0:0e7057b49904 | 253 | /* |
Jasper | 0:0e7057b49904 | 254 | class Vfd : Public Stream { |
Jasper | 0:0e7057b49904 | 255 | public: |
Jasper | 0:0e7057b49904 | 256 | |
Jasper | 0:0e7057b49904 | 257 | |
Jasper | 0:0e7057b49904 | 258 | } |
Jasper | 0:0e7057b49904 | 259 | */ |
Jasper | 0:0e7057b49904 | 260 | |
Jasper | 0:0e7057b49904 | 261 |