Forum: Mikrocontroller und Digitale Elektronik LCD über 8Bit C Code


von student (Gast)


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

: Bearbeitet durch User
von Rene K. (xdraconix)


Lesenswert?

Da wäre am interessantesten:

- Welches Display
- Was steht in der "xlcd.h"

von student (Gast)


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.

von Volker S. (vloki)


Lesenswert?

Gibt das Display überhaupt etwas aus?

Stimmt das Pinning der Schaltung mit dem der vor-kompilierten Bibliothek 
überein? (xlcd ist ein.....)

student schrieb:
> In der Headerdatei #include "xlcd.h" stehen Definitionen(z.B die Ports
> und 4/8-Bitmode)
Hast du da was geändert?

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Ich kenne LCD-Libs typischer Weise so, daß man ihnen erstmal die Pins, 
an denen das LCD hängt, bekannt machen muß.

von Forist (Gast)


Lesenswert?

student schrieb:
> Ich wäre dankbar, wenn ihr einen Blick auf den untenstehenden Code
> werfen würdet.

So verrückt, wie der Quellcode ist, wird man beim Lesen doch ganz 
verrückt.

Wenigstens könntest du ihn als C-Code taggen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

student schrieb:
> Allerdings gibt das LCD nicht den gewünschten Text aus.
Sondern was?

Hast du ein Oszilloskop?

von LCD Mann (Gast)


Lesenswert?

vielleicht hältst Du das Display ja auf dem Kopf und kannst es deshalb 
nicht lesen???

von student (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Welchen Sinn hat das "extern" vor den Funktionsdefinitionen der 
"Delay"-Funktionen?

Welchen Sinn hat das "return" am Ende dieser Funktionen?

Was würde in so einer Funktion geschehen, wenn da kein "return" am Ende 
stünde?

von K. J. (Gast)


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.

von Peter D. (peda)


Lesenswert?

Hier mal eine einfache und sicher funktionierende LCD-Lib.
Die Anpassungen an den PIC (Pinnamen und Delays) sollten nicht schwer 
fallen.

http://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001?name=PNphpBB2&file=viewtopic&t=102296

von Volker S. (vloki)


Lesenswert?

Peter D. schrieb:
> Die Anpassungen an den PIC (Pinnamen und Delays) sollten nicht schwer
> fallen
Könnte das sogar einfacher sein als die original XLCD von Microchip zu 
verwenden? ( JA ;-)

Hier ist noch eine für PICs inklusive Test Projekt: 
http://picforum.ric323.com/viewtopic.php?f=40&t=210

von student (Gast)


Lesenswert?

Hallo zusammen,

ich bin leider noch nicht weiter gekommen.
Was bedeutet es, wenn die obere der beiden Zeilen schwarz leuchtet?
Danke fürs Lesen und antworten!

Gruß

von Frank M. (ukw) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von student (Gast)


Lesenswert?

Danke für die Antwort
Ich schaue mal ´die Sachen nach.

von Volker S. (vloki)


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.

: Bearbeitet durch User
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.