Forum: Mikrocontroller und Digitale Elektronik HD44780 Zeigt Buchstabe nicht an


von Jonas (Gast)


Lesenswert?

Hallo zusammen,

ich hab folgendes Problem. Ich versuche gerade eine 2*16 Display mit 
Hilfe eine MSP430G2232 zu programmieren. Bis jetzt hat alles relativ gut 
geklappt nur jetzt bin ich an folgendem Problem und komme nicht mehr 
weiter:

Mein Code sieht wie folgt aus:
1
#include <msp430g2232.h>
2
3
//Port2
4
#define LCD_RS        (0x01)
5
#define LCD_RW        (0x02)
6
#define LCD_E         (0x04)
7
8
void wait(unsigned int i);     // prototypen
9
void LCDInit(void);
10
void LCDClear(void);
11
void LCDClock(void);
12
int main(void);
13
14
15
int main(void)
16
{
17
  WDTCTL = WDTPW + WDTHOLD;      // watchdog off
18
  
19
  BCSCTL2 |= DIVM_3;        // MCLK Teiler 4
20
  
21
  P1DIR = 0xFF;                 // Port1 = OUTPUT (8 datenleitungen zum LCD)
22
  P2DIR = 0xFF;                 // Port2 = OUTPUT (RS --> P2.0; R/W --> P2.1; E --> P2.2)
23
  
24
  P1SEL = 0x00;            
25
  P2SEL = 0x00;            // all ports are GPIO
26
  
27
  P1IE = 0x00;                  
28
  P2IE = 0x00;            // interrupt disable
29
  
30
  P1OUT = 0x00;                 // ports mit null initialisieren
31
  P2OUT = LCD_E;                 // initial nur E (clock) auf high, RS und R/W auf low
32
  
33
  
34
  wait(30000);                // init-zeit des display ist ca. 15 ms
35
  LCDInit();                  // LCD initialisieren ...
36
  LCDClear();                 // ... und dann noch loeschen und cursor an den anfang zurueck
37
  
38
  P1OUT = 71;          // Ausgeben G
39
  P2OUT = LCD_E + LCD_RS;    // 
40
  LCDClock();          // ausführen
41
  LCDClock();          // ausführen
42
  
43
  
44
  while(1);
45
}
46
47
void wait(unsigned int i) // delay function
48
{
49
  unsigned int j;
50
  for(j=0;j<i;j++);
51
}
52
53
void LCDClock(void)
54
{
55
  wait(50);
56
  P2OUT |= LCD_E;            // clock-bit erst mal sicherheitshalber auf high
57
  wait(50);
58
  P2OUT &= ~LCD_E;           // und jetzt auf low
59
  wait(50);
60
}
61
62
void LCDClear(void)
63
{
64
  P1OUT = 0x01;             // clear display
65
  P2OUT = LCD_E;             // RS und R/W low, E high
66
  LCDClock();             // befehl ausfuehren
67
  wait(500);              // clear display braucht was laenger
68
}
69
70
void LCDInit(void)
71
{
72
  P1OUT = 0x38;               // 8 bit operation, 2-zeilen-display, 5*8 dot font
73
  P2OUT = LCD_E;               // RS und R/W low, E high
74
  LCDClock();                 // befehl ausfuehren
75
  P1OUT = 0x0F;               // display anschalten, cursor an, cursor blinkt nicht
76
  P2OUT = LCD_E;               // RS und R/W low, E high
77
  LCDClock();                 // befehl ausfuehren
78
  P1OUT = 0x06;               // cursorrichtung: nach rechts; kein display-shift
79
  P2OUT = LCD_E;               // RS und R/W low, E high
80
  LCDClock();                 // befehl ausfuehren
81
}

Ich wollte probeweiße den Buchstabe "G" auf dem Display ausgeben. Wenn 
ich nun mein Code Step-by-Step durchlaufen lasse funktioniert das auch 
wunderbar, nur wenn ich den MSP430 "freilaufen" lasse zeigt es mir 
nichts an.
Der MCLK des µC ist 250kz und somit ist die wait-Zeit 100µs. Das musste 
ja nach meinen Recherche ja mehr aus ausreichend sein.

danke für eure Hilfe!

MfG

von Karl H. (kbuchegg)


Lesenswert?

Jonas schrieb:

> Der MCLK des µC ist 250kz und somit ist die wait-Zeit 100µs. Das musste
> ja nach meinen Recherche ja mehr aus ausreichend sein.

Wobei sich die Frage erhebt, ob das hier
  wait(50);
tatsächlich 100µs sind.

(Deine wait Funktion ist, mit Verlaub, Müll. Was hab ich davon, wenn ich 
selber rumrechnen muss, damit ich bestimmte Zeiten erreiche. Das soll 
die wait Funktion selbst machen! Als Anwender interessiert mich das doch 
nicht. Ich will einen Aufruf

  wait_us( 100 );

und dann sollen das auch 100 µs sein (oder länger [in Grenzen]), egal 
wie die Clock-Frequenz eingestellt ist. Das ist das Bier der wait_us 
Funktion und nicht das des Aufrufers, wie die Funktion das hinkriegt.

> Wenn ich nun mein Code Step-by-Step durchlaufen lasse funktioniert
> das auch wunderbar

Deutliches Indiz, dass du das LCD überfährst. Also: Zeiten länger 
machen.

von Jens B. (nixiefreak)


Lesenswert?

Vielleicht wird deine Warteschleife ja auch rausoptimiert, wenn du es 
durchkompilierst, aber im schrittweisen Durchfahren nicht?

von Jonas (Gast)


Lesenswert?

ja, ich habe jetzt die dumme wait Funktion, welche ich aus dem Internet 
geklaut habe, durch ein
1
__delay_cycles(15);
 ersetzt und jetzt funktionert es.

Danke für eure Hilfe :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.