The London Hackspace bandwidth meter
Dependencies: LPD8806 MODSERIAL mbed picojson
See:
- https://github.com/londonhackspace/net-o-meter
- http://wiki.london.hackspace.org.uk/view/Projects/BandwidthMeter
Diff: vfd.cpp
- Revision:
- 3:7fca72f96711
- Child:
- 4:7087ea3d13c1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vfd.cpp Thu Aug 23 00:17:04 2012 +0000 @@ -0,0 +1,141 @@ +/* + * The VFD code + * + * for a futuba M204LD01AA + * + * + * p27 -> input, busy + * p28 -> serial data in + * p29 -> clock + * p30 -> latch + * + * + */ + +#include "mbed.h" +#include "vfd.h" + +// InturruptIn busy_intr(p27) + +DigitalIn vfd_p_busy(p27); +DigitalOut vfd_p_data(p28); +DigitalOut vfd_p_clock(p29); +DigitalOut vfd_p_latch(p30); + +/* current state */ +int c_data; +bool c_a0; +bool c_blank; + +void vfd_shift_clock(void) { + vfd_p_clock = 0; + wait_us(100); + vfd_p_clock = 1; + wait_us(100); +} + +void vfd_doit(int data, int mode, int wr, int ss) { + int i, bit; + + vfd_p_data = 0; // nc + vfd_shift_clock(); + vfd_p_data = 0; // nc + vfd_shift_clock(); + + vfd_p_data = 1; // reset, 0 = in reset + vfd_shift_clock(); + + vfd_p_data = c_blank; // Blank, 0 = blanked + vfd_shift_clock(); + + vfd_p_data = ss; // SS, clockish + vfd_shift_clock(); + + vfd_p_data = 1; // rd + vfd_shift_clock(); + + vfd_p_data = mode; // A0, data/command + vfd_shift_clock(); + + vfd_p_data = wr; // WR + vfd_shift_clock(); + + for (i = 0 ; i < 8; i++) { + bit = (data & (1 << i)) >> i; + vfd_p_data = bit; + vfd_shift_clock(); + } + + vfd_p_latch = 0; + wait_us(10); + vfd_p_latch = 1; + wait_us(10); +} + +/* mode == 1 if command */ +void vfd_send(int data, int mode) +{ + data = data & 0xff; + c_data = data; + c_blank = 1; + + if (vfd_p_busy) + printf("pre, busy: %d\r\n", vfd_p_busy.read()); + + if (vfd_p_busy) + { + wait_ms(4); // should loop, 3.1 ms is max according to the data sheet. + if (vfd_p_busy) + { + printf("still busy :(\r\n"); + return; + } + } + + /* wr,ss */ + vfd_doit(data, mode, 0, 0); + wait_us(1); + vfd_doit(data, mode, 1, 0); + wait_us(1); + vfd_doit(data, mode, 1, 1); + wait_us(1); + + if (vfd_p_busy) + printf("post1, busy: %d\r\n", vfd_p_busy.read()); + + vfd_doit(data, mode, 0, 0); + wait_ms(1); // loop and wait for not busy + + if (vfd_p_busy) + printf("post2, busy: %d\r\n", vfd_p_busy.read()); + + while (vfd_p_busy) { + wait_us(250); + printf("post-while, busy: %d\r\n", vfd_p_busy.read()); + } +} + +void vfd_command(int data) { + vfd_send(data, 1); +} + +void vfd_data(int data) { + vfd_send(data, 0); +} + +void vfd_init(void) { + vfd_data(0x0c); // clear + vfd_data(0x1b); // esc + vfd_data(0); // v pos + vfd_data(0); // h pos +} + +void vfd_blank(void) { + /* blank */ +} + +void vfd_show(void) { + /* unblank */ +} + +