HD44780 Zeigt Buchstabe nicht an

Gast #2724948
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
#2724962
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.
Gast #2725042
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 :)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.