LCD über 8Bit C Code

Gast #4779289
Lesenswert?

Hallo zusammen,

ich bin dabei, ein LCD anzusteuern.
Allerdings gibt das LCD nicht den gewünschten Text aus.
Ich wäre dankbar, wenn ihr einen Blick auf den untenstehenden Code 
werfen würdet. Vlt fällt euch ein bzw mehrere Fehler auf.

1
#include <p18f2525.h>
2
#include "delays.h"    
3
#include "xlcd.h"
4

5
/*DECLARATIONS****************************************/
6
#pragma config OSC = HS   //CPU=8 MHz
7
#pragma config PWRT = ON
8
#pragma config WDT = OFF  //Watchdog Timer
9
#pragma config LVP = OFF  //Low Voltage ICSP
10

11

12

13
/*FUNCTIONS*******************************************/
14
extern void DelayFor18TCY( void )
15
{
16
  Nop();
17
  Nop();
18
  Nop();
19
  Nop();
20
  Nop();
21
  Nop();
22
  Nop();
23
  Nop();
24
  Nop();
25
  Nop();
26
  Nop();
27
  Nop();
28
  Nop();
29
return;
30
}
31

32
extern void DelayPORXLCD (void)
33
{
34
  Delay1KTCYx(30); // Delay of 15ms
35
                   // Cycles = (TimeDelay * Fosc) / 4
36
                   // Cycles = (15ms * 8MHz) / 4
37
                   // Cycles = 60,000
38
  return;
39
}
40
extern void DelayXLCD (void)
41
{
42
  Delay1KTCYx(10); // Delay of 5ms
43
                   // Cycles = (TimeDelay * Fosc) / 4
44
                   // Cycles = (5ms * 8MHz) / 4
45
                   // Cycles = 20,000
46
  return;
47
}
48

49
void Pininit (void)
50
{
51
LATB = 0x0000;
52
    LATA = 0x0000;
53
    LATC = 0x0000;
54
    ADCON1bits.PCFG0 = 1;
55
    ADCON1bits.PCFG1 = 1;
56
    ADCON1bits.PCFG2 = 1;
57
    ADCON1bits.PCFG3 = 1;
58
  ADCON1bits.VCFG0 = 1;
59
  ADCON1bits.VCFG1 = 1;
60
    TRISB = 0x0000;
61
    TRISC = 0x0000;
62
    TRISA = 0x0000;
63
}
64

65
void LCDinit(void)
66
{
67
OpenXLCD(FOUR_BIT&LINES_5X7);
68
while(BusyXLCD());
69
WriteCmdXLCD(0x06);
70
WriteCmdXLCD(BLINK_ON);
71

72
}
73

74

75

76

77
/*MAIN************************************************/
78
void main(void)
79
{
80
Pininit();
81
LCDinit();
82
putrsXLCD("Hello World");
83

84
while(1)
85
{
86

87
}
88

89
}

--

Diese Forensoftware bietet [ c ] [ /c ] - Tags zur 
Quellcodeformatierung.
Nutze sie!

-rufus
Gast #4779304
Lesenswert?

Stimmt, hätte ich dazu schreiben sollen
Das Display ist vom Typ CV4162B und der Controller im LCD ist der 
Sitronix ST7066U.
Der PIC, den ich programmiere ist der PIC18f2525.
In der Headerdatei #include "xlcd.h" stehen Definitionen(z.B die Ports 
und 4/8-Bitmode) und Funktionen für das LCD.
Gast #4780029
Lesenswert?

Vielen Dank für die Anworten.
Bis jetzt ist die Hintergrundbeleuchtung an und die obere Zeile wird 
schwarz angezeigt.
In der Headerdatei habe ich die Pins, die da als Beispiel angegeben 
waren so geändert, wie ich das LCD angeschlossen habe.
Ich nutze MPLAB von Microchip, da war die Headerdatei schon dabei, die 
man nur leicht abändern muss.
Gast #4780078
Lesenswert?

Würde mich da Rufus an schlissen wofür das Return ? wen die Funktion zu 
ende ist geht es da weiter wo die Funktion aufgerufen wurde, das Return 
kann ehr dafür sorgen das das Programm an undefinierter stelle 
weiterleuft, da kein Einsprungstelle gesetzt ist wohin zurückgesprungen 
werden kann.

Dein Configwort sieht für nen PIC18F ziemlich kurz aus, würde das immer 
Komplet definieren, es sei den du weist zu 100% was der Compiler mit dem 
Rest als Default macht.

Danach würde ich mal überprüfen ob ADCON1 richtig gesetzt ist, und die 
TRIS Register die stehen bei dir alle auf Ausgang aber

while(BusyXLCD())

würde dafür sprechen das min einer Eingang sein muss.
Moderator Persönliche Seite #4784281
Lesenswert?

student schrieb:
> Was bedeutet es, wenn die obere der beiden Zeilen schwarz leuchtet?

Das bedeutet, dass Dein LCD erstmal funktioniert, aber noch nicht von 
der Software initialisiert worden ist. So sieht das Erscheinungsbild 
auch aus, wenn überhaupt kein µC angeschlossen ist. Jede zweite Zeile 
ist dabei schwarz. Das hilft Dir zum Beispiel, den Kontrast korrekt 
einzustellen.

Fazit:

Deine Software arbeitet nicht korrekt. Überprüfe, ob Pins in Soft- und 
Hardware übereinstimmen. Delays durch Nops zu generieren ist ziemlich 
unportabel, da sie vom verwendeten Takt des µCs abhängen. Da würde ich 
mal prüfen, ob die geforderten Delays (s. Datenblatt zum LCD) überhaupt 
eingehalten werden. Ist Dir aufgefallen, dass die verwendeten 
Delay-Werte einen µC-Takt von 8MHz voraussetzen?

Testweise kannst Du die Delays ja mal verdoppeln. Alternativ würde kann 
man die Delays auch sauber über einen Timer generieren.
#4784321
Lesenswert?

student schrieb:
> In der Headerdatei habe ich die Pins, die da als Beispiel angegeben
> waren so geändert, wie ich das LCD angeschlossen habe.
> Ich nutze MPLAB von Microchip, da war die Headerdatei schon dabei, die
> man nur leicht abändern muss.

Wenn man das Pinning ändert, muss man die Prozessorbibliothek neu 
kompilieren. Die wurde ja mit der originalen Headerdatei erstellt!

Das ist meiner persönlichen Meinung nach der totale Schwachsinn und 
bringt eigentlich jeden der die Bibliothek zum ersten mal benutzt zum 
verzweifeln, weil natürlich keiner daran denkt, dass der Code ja schon 
kompiliert in der Bibliothek vorliegt und es deshalb wirkungslos bleibt, 
wenn man nur den Header ändert.

Alternativ zum Neu-Erstellen der Bibliothek kann man auch alle 
benötigten Source-Dateien dem Projekt hinzufügen. Dann werden die 
entsprechenden Funktionen auch neu kompiliert.

PS: Die oben verlinkte LCD Bibliothek ist vor längerer Zeit aus den XLCD 
Sourcefiles hervorgegangen, weil das Original eigentlich unbrauchbar 
ist.

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