mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F4620, PICDEM2 Plus und LCD


Autor: Kevin J. (noway)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Moin.

Ich sitze hier mit meinem PICDEM2 Plus Board und einem P18F4620 und 
versuche verzweifelt, dem LCD Leben einzuhauchen. Leider wehrt es sich 
noch.

Ich habe irgendwo in der Initialisierung (in C geschrieben) einen 
Fehler, den ich nicht lokalisieren kann. Nun muss ich dazu sagen, das 
ich ein C Anfänger bin und mich noch in die Materie einarbeiten muss. 
Aber genau aus diesem Grund suche ich hier Hilfe.

Hier meine Initialisierungssequenz:
Anmerkung: Die Datenleitungen 4-7 hängen an RD0-3
#include <p18F4620.h>
 
void main(void)
 
{
#define RW_PIN LATDbits.LATD5        /* PORT for RW */ 
#define TRIS_RW TRISDbits.TRISD5     /* TRIS for RW */ 
#define RS_PIN LATDbits.LATD4        /* PORT for RS */ 
#define TRIS_RS TRISDbits.TRISD4     /* TRIS for RS */ 
#define E_PIN LATDbits.LATD6         /* PORT for D */ 
#define TRIS_E TRISDbits.TRISD6      /* TRIS for E */
 
#define DATA_PORT PORTD /* PORT for Data */
#define TRIS_DATA_PORT TRISD /* TRIS for Data */
 
/*Start der Initialisierung*************/
TRIS_RW = 0;
TRIS_RS = 0;
TRIS_E = 0;
TRIS_DATA_PORT = 0;
 
/*INIT*/
Delay10KTCYx (6); // wait 24ms
DATA_PORT = 0x03;
E_PIN = 1;   // E-Leitung Pulsen lassen
Delay10TCYx (1);
E_PIN = 0 ;
 
Delay1KTCYx(13); // wait 5,2ms
DATA_PORT = 0x03;
E_PIN = 1;   // E-Leitung Pulsen lassen
Delay10TCYx (1);
E_PIN = 0 ;
 
Delay10TCYx(26); // wait 104us
DATA_PORT = 0x03;
E_PIN = 1;   // E-Leitung Pulsen lassen
Delay10TCYx (1);
E_PIN = 0 ;
 
/****4-BIT Initialisierung****/
DATA_PORT = 0x02;
E_PIN = 1;   // E-Leitung Pulsen lassen
Delay10TCYx(1);
E_PIN = 0 ;
Delay10KTCYx(6); // wait 24ms
 
DATA_PORT = 0x00;
Delay10KTCYx(30);
E_PIN = 1;   // E-Leitung Pulsen lassen
Delay10TCYx(1);
E_PIN = 0 ;
 
 
DATA_PORT = 0x02;
Delay10KTCYx(30);
E_PIN = 1;   // E-Leitung Pulsen lassen
Delay10TCYx(1);
E_PIN = 0 ;
 
DATA_PORT = 0x08;
Delay10KTCYx(30);
E_PIN = 1;   // E-Leitung Pulsen lassen
Delay10TCYx(1);
E_PIN = 0 ;
 

/***Function Set ***/
DATA_PORT = 0x00; // 0x0F Display on, Cursor on, Blinking
Delay10KTCYx(30);
E_PIN = 1;   // E-Leitung Pulsen lassen
Delay10TCYx(1);
E_PIN = 0 ;
 
DATA_PORT = 0x0F;
Delay10KTCYx(30);
E_PIN = 1;   // E-Leitung Pulsen lassen
Delay10TCYx(1);
E_PIN = 0 ;
 

}
Wenn ich dieses Programm auf den PIC lade, dann kann ich ganz schwach 
erkennen, wie die obere Zeile des LCD´s blinkt (die gesamte Zeile).
Eigentlich wollte ich aber nur einen blinkenden Cursor haben. Was hab 
ich da falsch gemacht?

Autor: Sascha Focus (sascha_focus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

deine main wird dauerhaft durchlaufen.
Es fehlt:
while(1)
{}

Gruß Sascha

Autor: Kevin J. (noway)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das hatte ich bereits versucht, allerdings ohne Erfolg, weswegen ich 
es aus dem Quelltext wieder entfernt hatte.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo genau hattest Du es drin?

Ist der Watchdog ein- oder ausgeschaltet?

Kannst Du denn sonst z.B. eine Led auf dem PICDEM 2 Plus blinken lassen?

Autor: Kevin J. (noway)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die While-Schleife hatte ich am Ende eingefügt.
Ich kann auf dem Board ohne Probleme LED´s ansteuern. Ich hatte mit den 
LED´s experimentiert als ich mir die Delays.h mal zur Brust genommen 
hatte. Blinklichter waren kurz darauf keine Schwierigkeit.

Ich vermute, dass ich dem LCD in der Initialisierung die Bits falsch 
übermittle, aber ich komm´ einfach nicht dahinter.
Die Konfiguration, also Watchdog Timer etc. ist korrekt eingestellt (WDT 
aus etc.)
Muss man das LCD möglicherweise irgendwie seperat noch "einschalten"? 
Dem Schaltplan des PICDEM Boards entnahm ich, dass das LCD an RD7 seine 
Spannung bezieht. Das macht mich ehrlich gesagt etwas stutzig.

Autor: Sascha Focus (sascha_focus) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
"Dem Schaltplan des PICDEM Boards entnahm ich, dass das LCD an RD7 seine
Spannung bezieht. Das macht mich ehrlich gesagt etwas stutzig."

Wo denn???? Ich sehe davon nichts. Siehe Anhang. Probiere doch zur Not 
mal die Application Maestro Software. Dort wird dir alles für das 
Display erzeugt.

Gruß Sascha

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt zwei Versionen des PICDEM 2 Plus:
Eine nicht-RoHS und eine RoHS-konforme.
Bei der RoHS-konformen ist das Display anders angeschlossen.
Du solltest das mal prüfen.

Sonst noch eine Idee:
Beim Hi-Tech C-Compiler PICC (für PIC16) sind Beispiele für die LCD 
Ansteuerung, auch auf dem PICDEM 2 Plus, dabei.
Die kannst Du wohl relativ einfach nach PIC18 portieren, oder schauen, 
ob die beim PIC18 Compiler auch dabei sind.
Beide Compiler gibt's in einer limitierten Version zum kostenlosen 
Download.
Du wirst verstehen, dass ich die Beispiel-Dateien aus 
Urheberrechtsgründen hier nicht posten kann.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sascha Focus wrote:
> "Dem Schaltplan des PICDEM Boards entnahm ich, dass das LCD an RD7 seine
> Spannung bezieht. Das macht mich ehrlich gesagt etwas stutzig."
>
> Wo denn???? Ich sehe davon nichts. Siehe Anhang.

Du hast den Schaltplan des "alten" Boards gepostet.
Beim neuen ist RD7 tatsächlich über einen NPN Transistor mit der 
Versorgungsspannung des LCD verbunden.

> Probiere doch zur Not
> mal die Application Maestro Software. Dort wird dir alles für das
> Display erzeugt.

Auch eine gute Idee.
In jedem Fall muss geprüft werden, ob es sich um eine "altes" oder neues 
Board handelt (E, R/W und RS anders angeschlossen).
Aber ich glaube nicht, dass der Application Maestro Code zum Einschalten 
von RD7 erzeugt.

Autor: Kevin J. (noway)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So...aktueller Stand: Totale Verwirrung!
Ich habe jetzt diverse Belegungen gefunden und fühl mich etwas 
überfordert.
Mein Board ist rot und nennt sich PicDem 2 Plus Demo Board 2002. Wie ist 
denn nun die Belegung von exakt diesem Board? Ich finde scheinbar immer 
nur die von diesem grünen Board.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kevin J. wrote:
> So...aktueller Stand: Totale Verwirrung!
Ist ja super, dann kann's nur noch besser werden ;-)

> Ich habe jetzt diverse Belegungen gefunden und fühl mich etwas
> überfordert.
Welche denn? Link?

> Mein Board ist rot und nennt sich PicDem 2 Plus Demo Board 2002. Wie ist
> denn nun die Belegung von exakt diesem Board? Ich finde scheinbar immer
> nur die von diesem grünen Board.
Das dürfte das "alte" sein.
Hier alle Dokus:
http://www.microchip.com/stellent/idcplg?IdcServic...

Autor: B. Jue (bjue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte es was zu tun haben mit falsch gesetztem CMCON Register? Dort muß 
0x07 drinnen stehen. Ist normalerweise nach RESET richtig (also 0x07h), 
aber wird ja vielleicht überschrieben bei Dir. Siehe
http://www.mikroe.com/forum/viewtopic.php?p=78461
Trifft für P18F4620 auch zu.

Autor: Kevin J. (noway)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Link. Ich arbeite mich da mal durch ;)

Bzgl CMCON REGISTER:
hatte ich auch schon überlegt. Dies konnte ich aber ausschließen durch 
das testen der Ausgänge. Ich habe via Config Bits in MPLab die Ausgänge 
auf digitale Ein/Ausgänge geschaltet und mit einem kleinen Programm 
getestet (LEDs an/aus etc). Das hat soweit auch wunderbar geklappt, 
weswegen ich denke, dass dies nicht das Problem sein kann.


Eines ist mir bei der Simulation aufgefallen:
Die E-Leitung wird gepulst, allerdings nur im LAT Register. Ich hatte 
daraufhin versucht mir die notwendigen Informationen über LAT und PORT 
Register anzueignen, verstehe aber irgendwie immer noch nicht, in 
welchem Zusammenhang die beiden stehen. Durch ausprobieren hatte ich 
herausgefunden, das ich mit LAT Registern den PORT setzen kann (LED 
Test, wie üblich^^). Wieso bleibt das PORT Register dann leer, bzw 
unbeschrieben wenn ich mir das in der Simulation anschaue? Könnte da ein 
Zusammenhang bestehen, weswegen ich keinen Fortschritt erziele?

Autor: Kevin J. (noway)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich habs hinbekommen. Was genau der Fehler jetzt war, kann ich nicht 
sagen. Aber ich habe jetzt die Pinbelegungen überprüft, die zu 
übermittelnden Nibble etc und das Timing noch einmal überarbeitet. Die 
Kommentare sollten stimmen. Das ganze sieht jetzt so aus:
#include <p18F4620.h>
#include <stdio.h>

void main(void)

{
#define E_PIN    LATAbits.LATA1    /* PORT for D  */ 
#define TRIS_E   TRISAbits.TRISA1  /* TRIS for E  */

#define RW_PIN PORTAbits.LATA2 /* PORT for RW */ 
#define TRIS_RW TRISAbits.TRISA2 /* TRIS for RW */ 

#define RS_PIN LATAbits.LATA3 /* PORT for RS */ 
#define TRIS_RS TRISAbits.TRISA3 /* TRIS for RS */ 


#define DATA_PORT PORTD /* PORT for Data */
#define TRIS_DATA_PORT TRISD /* TRIS for Data */

#define Delay1TCY() Nop() ;


/*Start der Initialisierung*************/
TRIS_RW = 0;
TRIS_RS = 0;
TRIS_E = 0;
TRIS_DATA_PORT = 0;
ADCON1 = 0x0F; //als digitale Ein und ausgänge schalten



  //Initialisierung des LCD-Displays
Delay10KTCYx (25); // wait 250ms nach dem Einschalten

  
  /*Schritt 1 : Zuerst das Obere Display initialisieren */ 
DATA_PORT = 0x03;  //Das ist nötig, weil Port D0..D3 => LCD_Display D4..D7
E_PIN = 1;   // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;


  /*2. Schritt nochmal 0x30 senden*/
Delay1KTCYx(50); // wait 50ms
DATA_PORT = 0x03;
E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;
Delay1KTCYx(25); // wait 25ms

  // 3. Schritt nochmal 0x30 senden ohne Pause zwischen Schritt 2 und 3
Delay1KTCYx(25); // wait 25ms
DATA_PORT = 0x03;
E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;
Delay1KTCYx(25); // wait 25ms

/****4-BIT Initialisierung****/
//4. Schritt diesmal 0x20 senden, damit wird umgeschaltet in den 4 bit Modus
DATA_PORT = 0x02;
E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;
Delay1KTCYx(25); // wait 25ms

/*5. Schritt nun müssen alle Bytes in zwei Blöcken übertragen werden  
    zuerst das Obere Nibble dann das untere Nibble
    im simpel LCD-Initaialisierungs Programm sortiere ich die Nibbles selber
    möchte ich den Wert b'abcdefgh' übertragen dann schicke ich zuersz
    movlw B'0000abcd' und dann movlw b'0000efgh' 
    das ist zum ersten Verständnis hilfreich, und sollte später verbessert werden.

 zuerst muss der Befehl Function Set erfolgen. Hierzu das RS-Bit
 muss 0 sein, weil ein Systembyte übertragen wird Das ist es aber immer noch  denn  PORTA =0
 Das Byte für Systemset 0x28 function set, 4-bit  2-zeilig,  5x7 heißt
 B'00101000' also zuerst B'00000010'  und dann B'00001000' schicken
*/
Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
DATA_PORT = 0x02; 

E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;

Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
DATA_PORT = 0x08;

E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;


/*  so jetzt schalten wir mal das Display ein und lassen den Cursor Blinken.
 dazu brauchen wir den Befehl B'00001111'  ; 0xF display on, cursor on, cursor flash on
 wie oben zwerlegen in B'00000000'  und B'00001111'  !
*/
DATA_PORT = 0x00;
Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;


DATA_PORT = 0x01;
Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;




DATA_PORT = 0x00;
Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;


DATA_PORT = 0x0F;
Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;

/*
wenn wir jetzt hier stoppen würden mit den Befehl
dann müssste der Cursor des LCD_Displays jetzt blinken
Blinkt der Cursor ein der Ecke, dann ist das LCD richtig initialisiert und nun kann man darangehen es mit Text zu füttern
Neu ist jetzt, dass die RS-Leitung immer 1 sein muss, 
weil wir ab jetzt nicht mehr das LCD-Systembeeinflussen wollen sondern 
den Textspeicher.
*/


// Buchstaben H schreiben 
RS_PIN = 1;



DATA_PORT = 0x04;
Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;

DATA_PORT = 0x08;
Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
E_PIN = 1; // E-Leitung Pulsen lassen
Delay1TCY();
E_PIN = 0 ;




RS_PIN = 0;



while(1);
{}

}

Das Display liefert mit diesem Wert ein großes H. Nicht mehr und nicht 
weniger. Ich werd mich jetzt dran setzen und damit etwas 
experimentieren.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.