MSP430 Segment-LCD Ghosting reduzieren

Gast #7192600
Lesenswert?

Hallo miteinander

Ich verwende einen MSP430FR4131, um eine kleine LCD-Segmentanzeige 
anzusteuern. Leider habe ich Probleme mit der Lesbarkeit bzw. mit dem 
Kontrast. Die Segmente, die hell sein sollten, sind etwas dunkler als 
der Hintergrund (siehe Bild).

Nun hoffe ich das irgendwie in Software beheben zu können, da sonst eine 
neue PCB-Revision nötig wäre. Ich habe auch noch nicht so viel Erfahrung 
mit MSP430ern, weshalb ich besser nochmals nachfrage.

Ich habe ein Launchpad mit dem gleichen uC und einem anderen LCD, wo 
dieses Ghosting nicht auftritt. Ich befürchte also, dass es an meiner 
Hardware bzw. dem verwendeten LCD liegt.

An LCDCAP0/1 sind 100n angeschlossen. R13, R23, R33 sind unbelegt.

Ich habe auch mit unterschiedlichen Prescalern herumgespielt (LCD- und 
Ladungspumpen-Frequenz), das hat aber keine grosse Wirkung bezüglich 
Kontrast gezeigt.

Was könnte ich sonst noch machen?

Code:
1
#include <msp430.h>
2
#include <stdbool.h>
3
#include <stdint.h>
4

5
#define pm5_unlock() (PM5CTL0 &= ~LOCKLPM5)
6
#define lcd_mem_clr()   (LCDMEMCTL |= LCDCLRM)
7

8
const uint8_t lcd_segment_map[] = {
9
        0xd7,
10
        0x06,
11
        0xe3,
12
        0xa7,
13
        0x36,
14
        0xb5,
15
        0xfd,
16
        0x07,
17
        0xf7,
18
        0xb7
19
};
20

21
void lcd_init ()
22
{
23
        LCDCTL0 = 0x0000; // LCD_E module off
24

25
        /* LCD clock is VLOCLK,
26
         * mux rate is 4-mux,
27
         * prescaler 1 */
28
        LCDCTL0 = (LCDSSEL1 | LCDMX0 | LCDMX1 | LCDSON);
29

30
        /* enable charge pump,
31
         * R33 is supplied from Vcc internally */
32
        LCDVCTL |= (LCDCPEN | LCDSELVDD);
33

34
        lcd_mem_clr();
35

36
        /* Pin definitions */
37
        LCDPCTL0 = 0x0f00;
38
        LCDPCTL1 = 0xff0f;
39
        LCDPCTL2 = 0x0000;
40

41
        LCDCSSEL0 = 0x0f00;
42
        LCDCSSEL1 = 0x0000;
43
        LCDCSSEL2 = 0x0000;
44

45
        LCDM4 = 0x21; // common pins
46
        LCDM5 = 0x84;
47

48
        LCDCTL0 |= LCDON; //LCD_E module on
49
}
50

51
void lcd_put_temp (uint16_t n)
52
{
53
        uint8_t digits [4];
54

55
        /* separate number into digits */
56
        for (uint8_t i = 3; i > 0; i--){
57
                digits[i] = n % 10;
58
                n /= 10;
59
        }
60
        digits[0] = n % 10;
61

62

63
        lcd_mem_clr();
64

65
        LCDM4 = 0x21; // common pins
66
        LCDM5 = 0x84;
67

68
        LCDM8 = 0x80; // degree symbol
69

70
        /* least significant digit */
71
        LCDM9 = lcd_segment_map[digits[3]]&0x07;
72
        LCDM13 = (lcd_segment_map[digits[3]]&0xf0) >> 4;
73

74
        LCDM14 = lcd_segment_map[digits[2]]|0x08;
75

76
        LCDM15 = lcd_segment_map[digits[1]]&0xf7;
77

78
        /* most significant digit */
79
        LCDM12 = lcd_segment_map[digits[0]]&0xf0;
80
        LCDM13 |= (lcd_segment_map[digits[0]]&0x07) << 4;
81
}
82

83
void main (void)
84
{
85
        /* use VLO as MCLK and SMCLK source,
86
         * use REFO as ACLK */
87
        CSCTL4 = (SELA | SELMS0 | SELMS1);
88

89
        /* FLL reference is REFOCLK */
90
        CSCTL3 = (SELREF0);
91

92
        lcd_init();
93
        pm5_unlock();
94
        while (1){
95
                lcd_put_temp(1234);
96
                for (uint16_t i = 0; i < 0xfff; i++);
97
        }
98
}
Angehängte Dateien:
Gast #7192657
Lesenswert?

Es gibt die VLCDx-Bits, das so wie ich das verstehe, die Spannung für 
die interne Ladungspumpe festlegt. Das ist aber leider bereits auf das 
Minimum von 2.60 V gesetzt.

Sonst sehe ich keine Möglichkeit, den Kontrast einzustellen.
Moderator (Firma: Titel) Persönliche Seite #7192737
Lesenswert?

Patrick schrieb:
> Das ist aber leider bereits auf das Minimum von 2.60 V gesetzt.
Und die ist dann tatsächlich auch so, wenn du sie misst? Wie passen die 
anderen Spannungen dazu? Hast du da die Pegel, die das Datenblatt 
angibt? Oder ist da ein "etwas ungerader" Pegel im gemuxten Signal?

Dazu gibt es im Kapitel 4.4 der Appnote SLAA654 bei den optionalen 
externen Widerständen ein paar Worte zum Thema "If contrast is not even 
across all segments".

Patrick schrieb:
> Leider habe ich Probleme mit der Lesbarkeit bzw. mit dem Kontrast.
Sieht doch für so ein (S)TN-Display gar nicht sooo schlecht aus.
Welchen Kontrast verspricht das Datenblatt des Glases?
Gast #7194057
Lesenswert?

Lothar M. schrieb:
> Und die ist dann tatsächlich auch so, wenn du sie misst? Wie passen die
> anderen Spannungen dazu? Hast du da die Pegel, die das Datenblatt
> angibt? Oder ist da ein "etwas ungerader" Pegel im gemuxten Signal?

Danke für den Tipp, habe beim Messen meinen Fehler bemerkt:
Ich habe mit LCDSELVDD=1 V_LCD auf VCC gelegt (Mode 2). Daher auch der 
zu hohe Kontrast. Die VLCDx-Bits hatten gar keinen Einfluss. Kapitel 
17.2.7.1 und 17.2.8 im User Guide beschreiben das.

Mir war nicht klar, dass die Kondensatoren an R13, R23, R33 für die 
Ladungspumpe zwingend nötig sind; ich dachte, 100n an LCDCAP0/1 reichen, 
weshalb sie auch auf dem PCB fehlen. Im Mode 3 (Ladungspumpe mit V_LCD 
!= VCC), bleiben alle Segmente aus ohne die Kondensatoren. Die 
Ladungspumpe hat also vorher auch nicht funktioniert.

Ich habe sie nun mit Fädeldraht hingemurkst und nun ist der Kontrast im 
Mode 3 viel besser, und vorallem mit den VLCDx-Bits tatsächlich 
einstellbar. Auch die Signale sehen jetzt für mich gut aus.

Lothar M. schrieb:
> Appnote SLAA654

Danke, irgendwie übersehe ich immer die wichtigen App Notes... Wo 
findest Du die? Produktseite von TI oder Suchmaschine?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren