Raspberry PI - MSP 430 - LCD

I finally managed to have the Raspberry PI talk to MSP430 over a SPI serial line and to have the MSP430 print whatever is received to the HD44780 LCD - my notes below.

DEM16101 LCD unusable

No matter how hard I tried, I couldn't figure out how to use it.

I think I managed to talk to the KS066 controller correctly (I reliably reset the controller using the initialization sequence) but I could not figure out the voltage required to power the LCD.

It looks like the LCD might require negative voltage (it's the only way I managed to have the LCD show some character blocks) but I did not find working setting.

In the end I replaced it with a HD44780 LCD and things went fairly smoothly.

MSP430 __delay_cycles

As part of trying to figure out why I could not initialize the DEM16101 I timed, using a scope, delays produced using __delay_cycles vs delays produced by using a timer interrupt.


ClockMethodTime (expected)Time (measured)
1 MHz__delay_cycles(1)1 us2.2 us
8 MHz__delay_cycles(8)1 us1.1 us
1 MHzTimer_A interrupt1 us1.1 us


Since the LCD controller is not that sensitive to the delay's length (it requires minimum values) in the end i used __delay_cycles and did not bother with timer interrupts.

MSP430 to LCD HD44780

I've used the code here to get started: Interface MSP430 Launchpad with LCD Module (LCM) in 4 bit mode. However, since I had 3 P1 pins busy for the SPI serial connection, I had to use a different pinout.

Although P2.0 was free, the voltage it yields when set to high is only 2.2-2.3V (the rest of the ports yield around 3V when high) so I switched to P1.7 for the register select RS pin. This makes the MSP code messier as two ports are in use - both P1 and P2.

I had to change the initialization a bit and add the 8 bit initialization before the 4 bit part, i.e. my working init routine is:

#define     LCM_DIR               P2DIR
#define     LCM_OUT               P2OUT

#define     LCM_PIN_RS            BIT7          // P1.7 -> on P1!
#define     LCM_PIN_EN            BIT1          // P2.1
#define     LCM_PIN_D7            BIT5          // P2.5
#define     LCM_PIN_D6            BIT4          // P2.4
#define     LCM_PIN_D5            BIT3          // P2.3
#define     LCM_PIN_D4            BIT2          // P2.2

void InitializeLcm(void)
{
        // P1 bit 7 is used for RS
        P1DIR |= BIT7;

        //
        // set the MSP pin configurations
        // and bring them to low
        //
        LCM_DIR |= LCM_PIN_MASK;
        LCM_OUT &= ~(LCM_PIN_MASK);


        // wait for the LCM to warm up and reach
        // active regions. Remember MSPs can power
        // up much faster than the LCM.
        //
        __delay_cycles(80000);
        P1OUT |= (LED_0 + LED_1); // turn LEDs on
        //
        // initialize the LCM module
        //
        P1OUT &= ~BIT7;
        LCM_OUT &= ~LCM_PIN_EN;


        // init (part of 8 bit mode)
        LCM_OUT = LCM_PIN_D4 | LCM_PIN_D5;
        PulseLcm();
        __delay_cycles(40000); // at least 4.1 ms
        LCM_OUT = LCM_PIN_D4 | LCM_PIN_D5;
        PulseLcm();
        __delay_cycles(200);
        LCM_OUT = LCM_PIN_D4 | LCM_PIN_D5;
        PulseLcm();

        // 4 bit mode
        // function set
        LCM_OUT = LCM_PIN_D5;
        PulseLcm();
        SendByte(0x28, FALSE);
        __delay_cycles(40000); //to check in datasheet

        // clear display
        SendByte(0x1, FALSE);
        __delay_cycles(40000); //to check in datasheet

        // entry mode set
        SendByte(0x6, FALSE);
        __delay_cycles(40000); //to check in datasheet

        SendByte(0xC, FALSE);
        __delay_cycles(40000); //to check in datasheet

        P1OUT &= ~(LED_0 + LED_1); // init complete, turn LEDs off
}

Rasperry PI to MSP430 via SPI

References:

My code is an awful hack using code from both references.

If you use the MSP430 board with the jumpers in their default position the maximum speed you can us is 9600. So you need to set the speed on the Raspberry Pi at 9600 and use the "-H" option (clock phase).

MSP430 hardware UART

To use the MSP430's hardware UART you need to rotate the TX and RX jumpers 90 degrees:

When using the hardware UART you can use higher speeds (50000 baud works). You still have to use the "-H" (clock phase) option on the Raspberry side


Circuit (drawn using fritzing.org)

Parts:

  • Raspberry PI
  • MSP 430 (powered from the PI via USB)
  • LCD HD44780
  • 5KΩ pot (LCD contrast)
  • 40Ω resistor (to LCD LED +)

Note: the pot for the LCD contrast is usually listed at 10KΩ. I didn't have one so I replaced it with a 5K.

and a photo of the physical setup (a bit different from the diagram depicted in the circuit (there's a pot used to drive an ADC input and the 5K pot used for LCD contrast is replaced by two fixed resistors):