Provides class structure for simple control of Nixie Tubes using custom PCB
NixieTube.cpp@3:2172e7bc28f7, 2016-12-14 (annotated)
- Committer:
- fischk08
- Date:
- Wed Dec 14 15:39:38 2016 +0000
- Revision:
- 3:2172e7bc28f7
- Parent:
- 2:bb85bae1c1de
- Child:
- 4:aac4aef5726e
Updated PWM period
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fischk08 | 0:34f3e0f37c55 | 1 | #include "NixieTube.h" |
fischk08 | 0:34f3e0f37c55 | 2 | /* Not Currently Implmented |
fischk08 | 0:34f3e0f37c55 | 3 | #define TUBE_1_LED 0x00800 |
fischk08 | 0:34f3e0f37c55 | 4 | #define TUBE_2_LED 0x01000 |
fischk08 | 0:34f3e0f37c55 | 5 | #define TUBE_3_LED 0x02000 |
fischk08 | 0:34f3e0f37c55 | 6 | #define TUBE_4_LED 0x04000 |
fischk08 | 0:34f3e0f37c55 | 7 | #define TUBE_5_LED 0x08000 |
fischk08 | 0:34f3e0f37c55 | 8 | #define TUBE_6_LED 0x10000 |
fischk08 | 0:34f3e0f37c55 | 9 | */ |
fischk08 | 0:34f3e0f37c55 | 10 | #define TUBE_1_CATH 0x20000 |
fischk08 | 0:34f3e0f37c55 | 11 | #define TUBE_2_CATH 0x40000 |
fischk08 | 0:34f3e0f37c55 | 12 | #define TUBE_3_CATH 0x80000 |
fischk08 | 0:34f3e0f37c55 | 13 | #define TUBE_4_CATH 0x100000 |
fischk08 | 0:34f3e0f37c55 | 14 | #define TUBE_5_CATH 0x200000 |
fischk08 | 0:34f3e0f37c55 | 15 | #define TUBE_6_CATH 0x400000 |
fischk08 | 0:34f3e0f37c55 | 16 | |
fischk08 | 1:0470cc006ce7 | 17 | NixieTube::NixieTube(PinName sdi, PinName scl, PinName rcl, PinName cen): _sdi(sdi), _scl(scl), _rcl(rcl), _cen(cen){ |
fischk08 | 0:34f3e0f37c55 | 18 | digit1 = 1; |
fischk08 | 0:34f3e0f37c55 | 19 | digit2 = 2; |
fischk08 | 0:34f3e0f37c55 | 20 | digit3 = 3; |
fischk08 | 0:34f3e0f37c55 | 21 | digit4 = 4; |
fischk08 | 1:0470cc006ce7 | 22 | curr_tube = 1; |
fischk08 | 3:2172e7bc28f7 | 23 | _cen.period_us(1000); |
fischk08 | 0:34f3e0f37c55 | 24 | _cen.write(1.0); |
fischk08 | 1:0470cc006ce7 | 25 | std::printf("Starting Object\r\n"); |
fischk08 | 1:0470cc006ce7 | 26 | tickSeq.attach(this, &NixieTube::nixie_shiftout, 0.001 ); |
fischk08 | 1:0470cc006ce7 | 27 | std::printf("Sucess Ticker Started\r\n"); |
fischk08 | 0:34f3e0f37c55 | 28 | } |
fischk08 | 0:34f3e0f37c55 | 29 | |
fischk08 | 0:34f3e0f37c55 | 30 | NixieTube::~NixieTube() |
fischk08 | 0:34f3e0f37c55 | 31 | { |
fischk08 | 0:34f3e0f37c55 | 32 | } |
fischk08 | 1:0470cc006ce7 | 33 | |
fischk08 | 1:0470cc006ce7 | 34 | void NixieTube::nixie_shiftout() { |
fischk08 | 2:bb85bae1c1de | 35 | |
fischk08 | 1:0470cc006ce7 | 36 | switch (curr_tube) { |
fischk08 | 1:0470cc006ce7 | 37 | case 1: |
fischk08 | 1:0470cc006ce7 | 38 | send_nixie_shiftreg(nixie_id_convert(digit1), 0, TUBE_1_CATH); |
fischk08 | 1:0470cc006ce7 | 39 | break; |
fischk08 | 1:0470cc006ce7 | 40 | case 2: |
fischk08 | 1:0470cc006ce7 | 41 | send_nixie_shiftreg(nixie_id_convert(digit2), 0, TUBE_2_CATH); |
fischk08 | 1:0470cc006ce7 | 42 | break; |
fischk08 | 1:0470cc006ce7 | 43 | case 3: |
fischk08 | 1:0470cc006ce7 | 44 | send_nixie_shiftreg(nixie_id_convert(digit3), 0, TUBE_3_CATH); |
fischk08 | 1:0470cc006ce7 | 45 | break; |
fischk08 | 1:0470cc006ce7 | 46 | case 4: |
fischk08 | 1:0470cc006ce7 | 47 | send_nixie_shiftreg(nixie_id_convert(digit4), 0, TUBE_4_CATH); |
fischk08 | 1:0470cc006ce7 | 48 | break; |
fischk08 | 1:0470cc006ce7 | 49 | default: |
fischk08 | 1:0470cc006ce7 | 50 | curr_tube = 1; |
fischk08 | 1:0470cc006ce7 | 51 | } |
fischk08 | 1:0470cc006ce7 | 52 | curr_tube++; |
fischk08 | 1:0470cc006ce7 | 53 | if (curr_tube == 5) { |
fischk08 | 1:0470cc006ce7 | 54 | curr_tube = 1; |
fischk08 | 1:0470cc006ce7 | 55 | } |
fischk08 | 1:0470cc006ce7 | 56 | } |
fischk08 | 1:0470cc006ce7 | 57 | |
fischk08 | 0:34f3e0f37c55 | 58 | int NixieTube::nixie_id_convert(int digit) { |
fischk08 | 0:34f3e0f37c55 | 59 | if (digit == 0 || digit == -1) { |
fischk08 | 0:34f3e0f37c55 | 60 | return digit + 1; |
fischk08 | 0:34f3e0f37c55 | 61 | } |
fischk08 | 0:34f3e0f37c55 | 62 | if (digit < 10) { |
fischk08 | 0:34f3e0f37c55 | 63 | return 11 - digit; |
fischk08 | 0:34f3e0f37c55 | 64 | } |
fischk08 | 0:34f3e0f37c55 | 65 | if (digit == 10) { |
fischk08 | 0:34f3e0f37c55 | 66 | return 11; |
fischk08 | 0:34f3e0f37c55 | 67 | } |
fischk08 | 0:34f3e0f37c55 | 68 | return 0; |
fischk08 | 0:34f3e0f37c55 | 69 | } |
fischk08 | 0:34f3e0f37c55 | 70 | |
fischk08 | 0:34f3e0f37c55 | 71 | void NixieTube::send_nixie_shiftreg(int cathode_id, int led_bitfield, int tube_bitfield) { |
fischk08 | 0:34f3e0f37c55 | 72 | |
fischk08 | 0:34f3e0f37c55 | 73 | int buffer = 0; |
fischk08 | 0:34f3e0f37c55 | 74 | buffer = 1 << (cathode_id-1) | led_bitfield | tube_bitfield; |
fischk08 | 0:34f3e0f37c55 | 75 | |
fischk08 | 0:34f3e0f37c55 | 76 | for (int i=23; i >= 0; i--) { |
fischk08 | 0:34f3e0f37c55 | 77 | _sdi = buffer & (1 << i); |
fischk08 | 0:34f3e0f37c55 | 78 | _scl = 1; |
fischk08 | 1:0470cc006ce7 | 79 | _scl = 0; |
fischk08 | 0:34f3e0f37c55 | 80 | } |
fischk08 | 0:34f3e0f37c55 | 81 | _rcl = 1; |
fischk08 | 1:0470cc006ce7 | 82 | _rcl = 0; |
fischk08 | 0:34f3e0f37c55 | 83 | |
fischk08 | 0:34f3e0f37c55 | 84 | } |
fischk08 | 1:0470cc006ce7 | 85 | void NixieTube::update_individual_nixie_tube(int ref,int val){ |
fischk08 | 0:34f3e0f37c55 | 86 | switch(ref){ |
fischk08 | 0:34f3e0f37c55 | 87 | case(1): |
fischk08 | 0:34f3e0f37c55 | 88 | digit1 = val; |
fischk08 | 0:34f3e0f37c55 | 89 | case(2): |
fischk08 | 0:34f3e0f37c55 | 90 | digit2 = val; |
fischk08 | 0:34f3e0f37c55 | 91 | case(3): |
fischk08 | 0:34f3e0f37c55 | 92 | digit3 = val; |
fischk08 | 0:34f3e0f37c55 | 93 | case(4): |
fischk08 | 0:34f3e0f37c55 | 94 | digit4 = val; |
fischk08 | 0:34f3e0f37c55 | 95 | } |
fischk08 | 0:34f3e0f37c55 | 96 | } |
fischk08 | 1:0470cc006ce7 | 97 | |
fischk08 | 2:bb85bae1c1de | 98 | void NixieTube::update_all_nixie_tube(int val4,int val3,int val2,int val1){ |
fischk08 | 1:0470cc006ce7 | 99 | digit1 = val1; |
fischk08 | 1:0470cc006ce7 | 100 | digit2 = val2; |
fischk08 | 1:0470cc006ce7 | 101 | digit3 = val3; |
fischk08 | 1:0470cc006ce7 | 102 | digit4 = val4; |
fischk08 | 1:0470cc006ce7 | 103 | } |
fischk08 | 0:34f3e0f37c55 | 104 | void NixieTube::set_dim(float duty,int pulsewidth){ |
fischk08 | 0:34f3e0f37c55 | 105 | _cen.write(duty); |
fischk08 | 0:34f3e0f37c55 | 106 | _cen.period_us(pulsewidth); |
fischk08 | 1:0470cc006ce7 | 107 | } |
fischk08 | 1:0470cc006ce7 | 108 | void NixieTube::debug_digits(){ |
fischk08 | 1:0470cc006ce7 | 109 | std::printf("Tube1: %d,Tube2: %d,Tube3: %d,Tube4: %d\r\n",digit1,digit2,digit3,digit4); |
fischk08 | 1:0470cc006ce7 | 110 | } |