Jump to content


  • Content Count

  • Joined

  • Last visited

  • Days Won


Everything posted by RobG

  1. RobG

    MSP430 Nixie Clock

    MSP430 based Nixie tube clock. I was looking for some nice Nixie tube digit images so I could add them to my EduKit library, but I couldn't find any usable ones. I decided to just buy few of them and photograph myself. Then I thought that it would be a horrible waste if they just sit in a drawer. So here it is, my first Nixie project since... 1987. This clock will be available as kit, but since this is v1, I will most likely make some adjustments. Any suggestions are welcome.
  2. RobG

    Products using MSP430

    In reference to this, I have found another one, Disney's Glow with the Show. Will definitely pick one up on my next visit to Orlando http://stuffandymakes.com/2012/07/08/disney-glow-with-the-show-ears-teardown/
  3. RobG

    Graphics Library for MSP432

    As long as it's the SPI verison, it will. If it's parallel, you will need have make updates to the code.
  4. MSP432 version of my Universal Graphics Library. Works with my latest Color LCD BoosterPacks, 2.2" and 2.4" (320x240) Touch support will be added in late April. ugl432.zip
  5. RobG

    MSP430 Nixie Clock

    Looks awesome!
  6. If you have one of those 5050/WS2811 aka WS2812 strips and you want to "wear" it, I have a board for you. Here are the specs: 20pin MSP430G2xx3 5V power supply 0.05" programming header UART input (allows pixel or sequence control) 11mm wide (0.45") 25mm long (1") 32mm long (1.25") - version with memory optional SOIC SRAM or EEPROM 1mm thick There are 4 boards on the panel, 2 with memory option. Assembled boards Board in the sleeve Board attached to 30 LED strip (0.5m)
  7. WS2812 driver for Tiva (and Stellaris.) It uses hardware SPI and is non-blocking (you can run your code while updating WS2812.) 7/31 - updated demo code and fixed comments about timing main.cstartup_ccs.c
  8. Say hello to the new member of my Color LCD Booster Pack family, 2.2" LCD with 320x240 pixel resolution. Current version is v3. Board options include backlight transistor and microSD (TransFlash) socket (v2 of the board also has optional memory 23K SRAM, 25AA EEPROM, or similar.) New in v3: - no MOSI/MISO config - no optional memory - 4 configuration jumpers CS_Display, CS_SD, D/C, and BKG (choose legacy pinout or compliant with new LPs.) Pos/Pin CS_Dis CS_SD D/C BKG New(1) P2.5 P2.4 P1.3 P2.0 Legacy(2) P1.0 P2.5 P1.4 P2.2 Available on Tindie and The 43oh Store Driver is in this post. UPDATE: Tiva driver is now available, see link above! v2 v3
  9. RobG

    RGB Globe

    I just came across this project and it is so awesome, I have to make one like that for my kids Unlike SolderLab guys, I will not use wires, I will use PCBs as a frame. Here are my few initial ideas: 1. Create 1" x 2" boards, contacts on both ends, 5050 or 5mm LEDs, chips on the bottom. 2. Create circular boards out of 4" boards, 1/4, 1/6, or 1/8 circle. 5mm LEDs. I think I will go for 2nd option since it's easier to assemble. Each segment will have 16 LEDs, 6 chips, few caps, and possibly place for MCU and IR detector, so no additional boards will be required. Also, I will use TLC series chips because they have constant current outputs, more current, less resistors, less soldering. BTW, SolderLabs' GlobeSimulator software is available for free!
  10. RobG

    Nokia 5110 display

    Here's the code I am using to control 5110. It uses USCIB (2553) but USI (2231) can also be use without any problem or major updates. There is still a lot of work to be done, but basic text and some graphics can be displayed with the current version. main.c #include "msp430g2553.h" #include "PCD8544.h" #define LCD5110_SCLK_PIN BIT5 #define LCD5110_DN_PIN BIT7 #define LCD5110_SCE_PIN BIT0 #define LCD5110_DC_PIN BIT1 #define LCD5110_SELECT P1OUT &= ~LCD5110_SCE_PIN #define LCD5110_DESELECT P1OUT |= LCD5110_SCE_PIN #define LCD5110_SET_COMMAND P1OUT &= ~LCD5110_DC_PIN #define LCD5110_SET_DATA P1OUT |= LCD5110_DC_PIN #define LCD5110_COMMAND 0 #define LCD5110_DATA 1 #define SPI_MSB_FIRST UCB0CTL0 |= UCMSB // or UCA0CTL0 |= UCMSB (USCIA) or USICTL0 &= ~USILSB (USI) #define SPI_LSB_FIRST UCB0CTL0 &= ~UCMSB // or UCA0CTL0 &= ~UCMSB or USICTL0 |= USILSB (USI) void writeStringToLCD(const char *string); void writeCharToLCD(char c); void writeBlockToLCD(char *byte, unsigned char length); void writeGraphicToLCD(char *byte, unsigned char transform); void writeToLCD(unsigned char dataCommand, unsigned char data); void clearLCD(); void clearBank(unsigned char bank); void setAddr(unsigned char xAddr, unsigned char yAddr); void initLCD(); unsigned char currXAddr = 0; //TODO this will be used for tracking current addr unsigned char currYAddr = 0; //not implemented //char testBlock[8] = {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF}; char testBlock[8] = {0x00, 0x7F, 0x7F, 0x33, 0x33, 0x03, 0x03, 0x03}; char testBlock2[8] = {0x00, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00}; void main(void) { WDTCTL = WDTPW + WDTHOLD; // disable WDT BCSCTL1 = CALBC1_1MHZ; // 1MHz clock DCOCTL = CALDCO_1MHZ; P1OUT |= LCD5110_SCE_PIN + LCD5110_DC_PIN; P1DIR |= LCD5110_SCE_PIN + LCD5110_DC_PIN; // setup USIB P1SEL |= LCD5110_SCLK_PIN + LCD5110_DN_PIN; P1SEL2 |= LCD5110_SCLK_PIN + LCD5110_DN_PIN; UCB0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC; // 3-pin, 8-bit SPI master UCB0CTL1 |= UCSSEL_2; // SMCLK UCB0BR0 |= 0x01; // 1:1 UCB0BR1 = 0; UCB0CTL1 &= ~UCSWRST; // clear SW _delay_cycles(500000); initLCD(); clearLCD(); // LCD test writeStringToLCD("Nokia 5110"); _delay_cycles(2000000); setAddr(0, 0); int c = 0x20; while(c < (65 + 0x20)) { writeCharToLCD(c); c++; } _delay_cycles(2000000); clearLCD(); c = 65 + 0x20; while(c < (96 + 0x20)) { writeCharToLCD(c); c++; } _delay_cycles(2000000); c = 0; clearBank(3); while(c < 64) { writeToLCD(LCD5110_DATA, 0xFF); c++; _delay_cycles(20000); } clearBank(4); while(c < 100) { writeToLCD(LCD5110_DATA, 0xFF); c++; _delay_cycles(20000); } clearBank(5); while(c < 184) { writeToLCD(LCD5110_DATA, 0xFF); c++; _delay_cycles(20000); } _delay_cycles(2000000); clearBank(3); writeGraphicToLCD(testBlock, NONE); writeGraphicToLCD(testBlock, FLIP_V); writeGraphicToLCD(testBlock, FLIP_H); writeGraphicToLCD(testBlock, ROTATE); writeGraphicToLCD(testBlock, FLIP_V | ROTATE); writeGraphicToLCD(testBlock, FLIP_H | ROTATE); writeGraphicToLCD(testBlock, ROTATE_90_CCW); writeGraphicToLCD(testBlock, ROTATE_180); clearBank(4); writeGraphicToLCD(testBlock2, NONE); writeGraphicToLCD(testBlock2, FLIP_H); writeGraphicToLCD(testBlock2, ROTATE); writeGraphicToLCD(testBlock2, ROTATE_90_CCW); clearBank(0); writeStringToLCD("For details,"); clearBank(1); writeStringToLCD("visit 43oh.com"); clearBank(2); } void writeStringToLCD(const char *string) { while(*string) { writeCharToLCD(*string++); } } void writeCharToLCD(char c) { unsigned char i; for(i = 0; i < 5; i++) { writeToLCD(LCD5110_DATA, font[c - 0x20][i]); } writeToLCD(LCD5110_DATA, 0); } void writeBlockToLCD(char *byte, unsigned char length) { unsigned char c = 0; while(c < length) { writeToLCD(LCD5110_DATA, *byte++); c++; } } void writeGraphicToLCD(char *byte, unsigned char transform) { int c = 0; char block[8]; if(transform & FLIP_V) { SPI_LSB_FIRST; } if(transform & ROTATE) { c = 1; while(c != 0) { (*byte & 0x01) ? (block[7] |= c) : (block[7] &= ~c); (*byte & 0x02) ? (block[6] |= c) : (block[6] &= ~c); (*byte & 0x04) ? (block[5] |= c) : (block[5] &= ~c); (*byte & 0x08) ? (block[4] |= c) : (block[4] &= ~c); (*byte & 0x10) ? (block[3] |= c) : (block[3] &= ~c); (*byte & 0x20) ? (block[2] |= c) : (block[2] &= ~c); (*byte & 0x40) ? (block[1] |= c) : (block[1] &= ~c); (*byte & 0x80) ? (block[0] |= c) : (block[0] &= ~c); *byte++; c <<= 1; } } else { while(c < 8) { block[c++] = *byte++; } } if(transform & FLIP_H) { c = 7; while(c > -1) { writeToLCD(LCD5110_DATA, block[c--]); } } else { c = 0; while(c < 8) { writeToLCD(LCD5110_DATA, block[c++]); } } SPI_MSB_FIRST; } void writeToLCD(unsigned char dataCommand, unsigned char data) { LCD5110_SELECT; if(dataCommand) { LCD5110_SET_DATA; } else { LCD5110_SET_COMMAND; } UCB0TXBUF = data; while(!(IFG2 & UCB0TXIFG)) ; LCD5110_DESELECT; } void clearLCD() { setAddr(0, 0); int c = 0; while(c < PCD8544_MAXBYTES) { writeToLCD(LCD5110_DATA, 0); c++; } setAddr(0, 0); } void clearBank(unsigned char bank) { setAddr(0, bank); int c = 0; while(c < PCD8544_HPIXELS) { writeToLCD(LCD5110_DATA, 0); c++; } setAddr(0, bank); } void setAddr(unsigned char xAddr, unsigned char yAddr) { writeToLCD(LCD5110_COMMAND, PCD8544_SETXADDR | xAddr); writeToLCD(LCD5110_COMMAND, PCD8544_SETYADDR | yAddr); } void initLCD() { writeToLCD(LCD5110_COMMAND, PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION); writeToLCD(LCD5110_COMMAND, PCD8544_SETVOP | 0x3F); writeToLCD(LCD5110_COMMAND, PCD8544_SETTEMP | 0x02); writeToLCD(LCD5110_COMMAND, PCD8544_SETBIAS | 0x03); writeToLCD(LCD5110_COMMAND, PCD8544_FUNCTIONSET); writeToLCD(LCD5110_COMMAND, PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL); } PCD8544.h #ifndef PCD8544_H_#define PCD8544_H_#define PCD8544_POWERDOWN 0x04#define PCD8544_ENTRYMODE 0x02#define PCD8544_EXTENDEDINSTRUCTION 0x01#define PCD8544_DISPLAYBLANK 0x0#define PCD8544_DISPLAYNORMAL 0x4#define PCD8544_DISPLAYALLON 0x1#define PCD8544_DISPLAYINVERTED 0x5// H = 0#define PCD8544_FUNCTIONSET 0x20#define PCD8544_DISPLAYCONTROL 0x08#define PCD8544_SETYADDR 0x40#define PCD8544_SETXADDR 0x80#define PCD8544_HPIXELS 84#define PCD8544_VBANKS 6#define PCD8544_MAXBYTES 504 // PCD8544_HPIXELS * PCD8544_VBANKS// H = 1#define PCD8544_SETTEMP 0x04#define PCD8544_SETBIAS 0x10#define PCD8544_SETVOP 0x80//transform#define NONE 0x00#define FLIP_H 0x01#define FLIP_V 0x02#define ROTATE 0x04 // 90 deg CW#define ROTATE_90_CW ROTATE#define ROTATE_90_CCW (FLIP_H | FLIP_V | ROTATE)#define ROTATE_180 (FLIP_H | FLIP_V)static const char font[][5] = { // basic font{0x00, 0x00, 0x00, 0x00, 0x00} // 20,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 ",{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 ',{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 ),{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c
  11. This DMX to Analog converter was designed to be used with stage props (servo pneumatic proportional control system, which is capable of positioning heavy loads at high speeds.) It's 8 channel (selectable start channel,) 8-12 bits resolution, 0-10V output, dimensions are 2" x 2".
  12. I am looking for some information about Rigol's Active Logic Head (LH1116) which is included with DS1102D/DS1052D. I wanted to buy new head to replace my missing one, but at >$300, it's just not worth it. I have decided to make my own, but I wasn't sure if it's possible. The price suggested that this must be rather complex piece of hardware and there's no documentation whatsoever. I was able to locate few pictures of the PCB, and as it turns out, this thing is super simple, it's just a few LVD drivers and some simple resistor dividers (totally not worth the $300 price.) There were some problems with those heads, so some versions also have Schottky buffers in them. After some investigative work, I was able to figure out the connections, but one thing I don't know yet is the polarity of some of the signals (I do know D2, D6, D8, and D12.) I will have to build a simple driver to confirm the polarity, but if there's someone who has this head and would be willing to do some tests (the head must be opened for this,) that would save me some time.
  13. This is my new universal graphics library (original one is here.) Supported boards (this is out of the "box" support, but the library will work with any board after small changes.) TI's MSP430FR5969 LaunchPad (ugl16msp only for now) TI's MSP430F5529 LaunchPad TI's MSP430G2 LaunchPad with G2553 chip RobG's MSP430G2955 Dev Board RobG's MSP430F5172 Dev Board RobG's MSP430F5510 Dev Board Supported displays 1.8" ST7735 based JD-T1800 - ugl8 2.2" HX8340 based displays - ugl8 2.2" ILI9225 based displays (touch panel) - ugl8 2.2" ILI9341 based displays 320x240 pixels - ugl16 Tiva versions are right here ugl8msp.zip (name change 4/18/14) ugl16msp.zip (updated 4/19/14)
  14. I am working on a new color LCD booster pack featuring 2.2" display. The board will work with two types of displays, one with touch screen and one without. TSC2046/ADS7846 controller or MCU's analog inputs can be used to process touch events. I expect some issues with the touch display since the spec sheet that was given to me is incorrect. As you can see on the image, only center LED is lit, indicating wrong connections or bad unit. Will have to sort it out. As for the software, support for those two will be added to my color LCD library. I might need a volunteer to write touch functions (short on free time.)
  15. RobG

    Products using MSP430

    Too bad you didn't grab one when you had a chance @zeke
  16. RobG

    Products using MSP430

    I went to Sears yesterday to get my new lawn mower and I got a free gift, Kenmore Alfie Voice-Controlled Intelligent Shopper. The regular price of Alfie is $49, but they are now on sale for $25. However, if you are SYW member and you spend more than $25, you get one for free (expires 7/1/17!) BTW, I also found Alfie for $7.95 on Amazon (with free Prime shipping, even cheaper from other vendors.) What's the big deal about Alfie? Crack one open and you will find the following: CC3200R1 Single-Chip Wireless MCU (with W25Q32JV (32M-bit) serial Flash memory from Winbond and a chip antenna) TLV320AIC3100 Low-Power Audio Codec With Audio Processing and Mono Class-D Amplifier 3.7V 500mAh LiPo battery 12 WS2812B LEDs Other useful things are microphone, large speaker, 2 LEDs, 2 switches, and USB port In other words, IoT experimenter's treasure chest! Can't wait to hack that thing (there's what appears to be programming header on the board.)
  17. _delay_cycles is an intrinsic function provided by CCS
  18. I am looking for MCU that fulfills those requirments: cheap, <$1 low pin count, SOIC or TSSOP, 8 to 20 pins 5V (3.3V would work too) 25-48MHz (internal) 16 bit low interrupt latency (similar to MSP430's 6/5 or 6/3 clock cycles) free IDE
  19. RobG

    MCU recommendation

    I was going to go with MKE04Z8VTG4 (48MHz, 5V, TSSOP16, $0.60,) but a) had some issues with their tools, latency is 15/?, c) don't really want to deal with complexities of ARM (my code is super simple.) RL78/G12 sounds like a winner, I will look into it.
  20. RobG

    MSP430 Nixie Clock

    Source code for the latest version of the clock (v5.) nixie.hmain_v5.c
  21. Hi, due to problems with suppliers, I have decided not to make them anymore. I only have LCDs without touch panel now.
  22. RobG

    MSP430 Nixie Clock

    Regarding slot machine effect, I can't decide if I should scroll 4 or 3 digits when clock is in 12 hr mode and hour is < 10. For example, when time is 3:00, leftmost digit is off, so slot machine is shown only on 3 tubes.
  23. RobG

    MSP430 Nixie Clock

    Here's short video. I am looking for suggestions re separator and AM/PM indication. I have 4 modes for the separator, off, on only when PM, blinking every second, and one blink AM/two blinks PM My wife says double blinking is annoying, so what do you think?
  24. RobG

    MSP430 Nixie Clock

    I had one request for alarm, but I don't think many would use this clock as an alarm clock. There's room for a small, 12mm piezo, but I figured if someone wants to add alarm, they can either use available J1 header or use (flash) digits, separator, or LEDs to signal alarm. Also, couple of days ago, I was thinking about adding IR receiver (utilize J1 for this.) Several people mounted this clock in enclosures or high above, making switches hard to reach. IR receiver in combination with cheap IR xmtr or TV remote, would allow setting time/functions remotely. Maybe next revision.
  25. RobG

    MSP430 Nixie Clock

    Any day now @@cubeberg I am now adding software features requested by users. There were few requests for effects that will prevent cathode poisoning, so I will add two effects, slot machine and blanking. Slot machine will basically scroll all numbers for a few seconds every so often. Blanking will keep display off and show time for few seconds every few seconds.