Provides class structure for simple control of Nixie Tubes using custom PCB
NixieTube.cpp
- Committer:
- fischk08
- Date:
- 2016-12-05
- Revision:
- 0:34f3e0f37c55
- Child:
- 1:0470cc006ce7
File content as of revision 0:34f3e0f37c55:
#include "NixieTube.h" /* Not Currently Implmented #define TUBE_1_LED 0x00800 #define TUBE_2_LED 0x01000 #define TUBE_3_LED 0x02000 #define TUBE_4_LED 0x04000 #define TUBE_5_LED 0x08000 #define TUBE_6_LED 0x10000 */ #define TUBE_1_CATH 0x20000 #define TUBE_2_CATH 0x40000 #define TUBE_3_CATH 0x80000 #define TUBE_4_CATH 0x100000 #define TUBE_5_CATH 0x200000 #define TUBE_6_CATH 0x400000 #define START_THREAD 1 Mutex nixie_mutex; NixieTube::NixieTube(PinName sdi, PinName scl, PinName rcl, PinName cen): _thread(&NixieTube::threadStarter, this, osPriorityNormal,1024),_sdi(sdi), _scl(scl), _rcl(rcl), _cen(cen){ digit1 = 1; digit2 = 2; digit3 = 3; digit4 = 4; delay1 = 0.0005; delay2 = 0.0045; brightness = 0; _cen.write(1.0); _cen.period_us(10000); _thread.signal_set(START_THREAD); } void NixieTube::threadStarter(void const *p) { NixieTube *instance = (NixieTube*)p; instance->threadWorker(); } void NixieTube::threadWorker() { _thread.signal_wait(START_THREAD); while(1) { nixie_thread(); } } NixieTube::~NixieTube() { } int NixieTube::nixie_id_convert(int digit) { if (digit == 0 || digit == -1) { return digit + 1; } if (digit < 10) { return 11 - digit; } if (digit == 10) { return 11; } return 0; } void NixieTube::send_nixie_shiftreg(int cathode_id, int led_bitfield, int tube_bitfield) { int buffer = 0; buffer = 1 << (cathode_id-1) | led_bitfield | tube_bitfield; for (int i=23; i >= 0; i--) { _sdi = buffer & (1 << i); _scl = 1; _scl = 0; // Whats going on here? } _rcl = 1; _rcl = 0; // Whats going on here? } void NixieTube::nixie_thread() { while (1) { nixie_mutex.lock(); send_nixie_shiftreg(nixie_id_convert(digit1), 0, TUBE_1_CATH); Thread::wait(1); send_nixie_shiftreg(0, 0, 0); Thread::wait(1); send_nixie_shiftreg(nixie_id_convert(digit2), 0, TUBE_2_CATH); Thread::wait(1); send_nixie_shiftreg(0, 0, 0); Thread::wait(1); send_nixie_shiftreg(nixie_id_convert(digit3), 0, TUBE_3_CATH); Thread::wait(1); send_nixie_shiftreg(0, 0, 0); Thread::wait(1); send_nixie_shiftreg(nixie_id_convert(digit4), 0, TUBE_4_CATH); Thread::wait(1); send_nixie_shiftreg(0, 0, 0); Thread::wait(1); nixie_mutex.unlock(); } } void NixieTube::start_nixie(){ //thread = new Thread(nixie_thread, this); } void NixieTube::update_nixie_tube(int ref,int val){ switch(ref){ case(1): digit1 = val; case(2): digit2 = val; case(3): digit3 = val; case(4): digit4 = val; } } void NixieTube::set_dim(float duty,int pulsewidth){ _cen.write(duty); _cen.period_us(pulsewidth); }