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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von student (Gast)


Bewertung
0 lesenswert
nicht 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 Moderator
von Rene K. (xdraconix)


Bewertung
0 lesenswert
nicht lesenswert
Da wäre am interessantesten:

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

von student (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


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

Hast du ein Oszilloskop?

von LCD Mann (Gast)


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

von student (Gast)


Bewertung
0 lesenswert
nicht 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) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort
Ich schaue mal ´die Sachen nach.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.