Behöver hjälp med att få LCD fungera på PIC18F458

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av jfri »

Kompilatorn MCC18 har ju inbyggda funktioner för LCD displayer. Dessa försöker jag använda men får dom inte att fungera.
Använder en GDM1602K LCD display inköpt på Electrokit som har fungerat med annan 16F PIC tidigare
http://www.electrokit.se/download/GDM1602K.pdf
Programmet nedan verkar köras då det tänder lysdioden. Men den släcks aldrig så det verkar som om programmet fastnar i LCD funktionerna. Listar också min modifierade xlcd.h.

Kod: Markera allt

#include <stdio.h>
#include <p18cxxx.h>
#include<delays.h>
#include "xlcd.h"
void		Initiering(void);
#pragma config WDT = OFF , WDTPS = 128
#pragma config OSC = HS
#pragma config LVP = OFF

void		main(void)
{
	Initiering();
	do {} while(1);	
}

void		Initiering(void)
{
	TRISA = 0;					//LCD använder RA0-RA5
	TRISC = 0;					//LED på RC3 för teständamål (ser att programmet körs)
	TRISE=  0;					//LCD R/W till RE0
	ADCON1 = 0x07;			//Konfigurera alla AD pinnar till digital I/O
	PORTC = 0b00001000;		//Tänder LED fungerar
	while( BusyXLCD() );		//Ingen skillnad med eller utan denna rad
	OpenXLCD( FOUR_BIT & LINES_5X7 );	//Setup pins
	WriteCmdXLCD( DON );					//Display on	
	WriteCmdXLCD( CURSOR_ON);			//Cursor på	
	WriteCmdXLCD( BLINK_ON );				//Blinka cursor
	WriteDataXLCD('X');						//Skriv ett X
	PORTC = 0;				//Släcker LED men det händer inte	
}

extern void DelayFor18TCY(void)
{
	Delay10TCYx( 2 );	
}

extern void DelayPORXLCD(void)	//Delay 15 mS
{
	Delay1KTCYx(75);	
}

extern void DelayXLCD(void)		//Delay 5 mS
{
	Delay1KTCYx(25);	
}

[code]
#ifndef __XLCD_H
#define __XLCD_H
#include "p18cxxx.h"
/* PIC18 XLCD peripheral routines.
 *
 *   Notes:
 *      - These libraries routines are written to support the
 *        Hitachi HD44780 LCD controller.
 *      - The user must define the following items:
 *          - The LCD interface type (4- or 8-bits)
 *          - If 4-bit mode
 *              - whether using the upper or lower nibble
 *          - The data port
 *              - The tris register for data port
 *              - The control signal ports and pins
 *              - The control signal port tris and pins
 *          - The user must provide three delay routines:
 *              - DelayFor18TCY() provides a 18 Tcy delay
 *              - DelayPORXLCD() provides at least 15ms delay
 *              - DelayXLCD() provides at least 5ms delay
 */

/* Interface type 8-bit or 4-bit
 * For 8-bit operation uncomment the #define BIT8
 */
/* #define BIT8 */

/* When in 4-bit interface define if the data is in the upper
 * or lower nibble.  For lower nibble, comment the #define UPPER
 */
/* #define UPPER */

/* DATA_PORT defines the port to which the LCD data lines are connected */
 #define DATA_PORT      		PORTA
 #define TRIS_DATA_PORT 	TRISA

/* CTRL_PORT defines the port where the control lines are connected.
 * These are just samples, change to match your application.
 */
 #define RW_PIN   LATEbits.LATE0   	/* PORT for RW */
 #define TRIS_RW  TRISEbits.TRISE0    	/* TRIS for RW */

 #define RS_PIN   LATAbits.LATA5   		/* PORT for RS */
 #define TRIS_RS  TRISAbits.TRISA5    	/* TRIS for RS */

 #define E_PIN    LATAbits.LATA4  		/* PORT for D  */
 #define TRIS_E   TRISAbits.TRISA4    	/* TRIS for E  */

/* Display ON/OFF Control defines */
#define DON         		0b00001111  /* Display on      */
#define DOFF        		0b00001011  /* Display off     */
#define CURSOR_ON   	0b00001111  /* Cursor on       */
#define CURSOR_OFF 	 0b00001101  /* Cursor off      */
#define BLINK_ON    	0b00001111  /* Cursor Blink    */
#define BLINK_OFF   	0b00001110  /* Cursor No Blink */

/* Cursor or Display Shift defines */
#define SHIFT_CUR_LEFT    	0b00000100  /* Cursor shifts to the left   */
#define SHIFT_CUR_RIGHT   0b00000101  /* Cursor shifts to the right  */
#define SHIFT_DISP_LEFT   	0b00000110  /* Display shifts to the left  */
#define SHIFT_DISP_RIGHT  0b00000111  /* Display shifts to the right */

/* Function Set defines */
#define FOUR_BIT   	0b00101100  /* 4-bit Interface               */
#define EIGHT_BIT  	0b00111100  /* 8-bit Interface               */
#define LINE_5X7   	0b00110000  /* 5x7 characters, single line   */
#define LINE_5X10  	0b00110100  /* 5x10 characters               */
#define LINES_5X7 	 0b00111000  /* 5x7 characters, multiple line */

#define PARAM_SCLASS auto
#define MEM_MODEL far  /* Change this to near for small memory model */

/* OpenXLCD
 * Configures I/O pins for external LCD
 */
void OpenXLCD(PARAM_SCLASS unsigned char);

/* SetCGRamAddr
 * Sets the character generator address
 */
void SetCGRamAddr(PARAM_SCLASS unsigned char);

/* SetDDRamAddr
 * Sets the display data address
 */
void SetDDRamAddr(PARAM_SCLASS unsigned char);

/* BusyXLCD
 * Returns the busy status of the LCD
 */
unsigned char BusyXLCD(void);

/* ReadAddrXLCD
 * Reads the current address
 */
unsigned char ReadAddrXLCD(void);

/* ReadDataXLCD
 * Reads a byte of data
 */
char ReadDataXLCD(void);

/* WriteCmdXLCD
 * Writes a command to the LCD
 */
void WriteCmdXLCD(PARAM_SCLASS unsigned char);

/* WriteDataXLCD
 * Writes a data byte to the LCD
 */
void WriteDataXLCD(PARAM_SCLASS char);

/* putcXLCD
 * A putc is a write
 */
#define putcXLCD WriteDataXLCD

/* putsXLCD
 * Writes a string of characters to the LCD
 */
void putsXLCD(PARAM_SCLASS char *);

/* putrsXLCD
 * Writes a string of characters in ROM to the LCD
 */
void putrsXLCD(const rom char *);

/* User defines these routines according to the oscillator frequency */
extern void DelayFor18TCY(void);
extern void DelayPORXLCD(void);
extern void DelayXLCD(void);

#endif

[/code]
Användarvisningsbild
Icecap
Inlägg: 26654
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av Icecap »

Första sak du ska göra är att flytta LED-släckningen till efter första steget i LCD-initieringen.

Och resten av programmet är bara skit, det är omöjligt att veta vad som händer i de olika rutiner!

Det finns en anledning till att jag aldrig använder sådana färdiga saker.
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av jfri »

Programmet stannar även i första LCD initieringsraden setup pins. Detta är visst förkompilerade funktioner och själva källkoden finns tydligen inte tillgänglig.
Så nej man vet inte vad som i detalj sker i funktionerna. Men varför skulle man behöva det? Ingår funktioner i kompilatorn så får man ju förutsätta att de är testade och fungerar.
Förutsättningen är ju enligt dokumentationen att man har en HD44780 kompatibel LCD display och att man ändrar i xlcd.h vilket är fallet för mig.
Användarvisningsbild
Icecap
Inlägg: 26654
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av Icecap »

Och vad hjälper det dig? Skiten fungerar ju inte eller hur?

Alltså kan den knappast vara speciell "förkompilerat" eller felsäker...

Sedan är det knappast raketvetenskap att skriva en initieringsrutin till ett LCD, det finns högvis med sådana i forumet och på internet. Och fördelen med dom?

De fungerar!
ghu
Inlägg: 701
Blev medlem: 6 juni 2010, 14:28:18

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av ghu »

Förmodligen är det just det att koden är förkompilerad som är problemet.
Om man ändrar i xlcd.h för att använda t ex andra pinnar än standard måste man kompilera om xlcd filerna, annars används de förkompilerade.
Enklaste sättet att kompilera om filerna är att addera filerna som källkodsfiler i projektet.
Observera att källkoden till alla biblioteksrutiner finns i kompilatorns installationskatalog.
Leta upp källfilerna och addera dem till ditt projekt som "Sourcefiles".

Om det är första gången som man använder xlcd rutinerna så är det rekommendabelt att använda standardinställningarna i xlcd.h för att förstå hur det fungerar. Då behöver man inte heller kompilera om.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av Swech »

Det skall väl gå att få detta att funka,
Har du kollat att dina angivna värden för delayerna är ok?

Hade du testat att bara köra
OpenXLCD( FOUR_BIT & LINES_5X7 );
och därefter tänt porten?

Swech
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av jfri »

ghu skrev:Förmodligen är det just det att koden är förkompilerad som är problemet.
Om man ändrar i xlcd.h för att använda t ex andra pinnar än standard måste man kompilera om xlcd filerna, annars används de förkompilerade.
Enklaste sättet att kompilera om filerna är att addera filerna som källkodsfiler i projektet.
Observera att källkoden till alla biblioteksrutiner finns i kompilatorns installationskatalog.
Leta upp källfilerna och addera dem till ditt projekt som "Sourcefiles".

Om det är första gången som man använder xlcd rutinerna så är det rekommendabelt att använda standardinställningarna i xlcd.h för att förstå hur det fungerar. Då behöver man inte heller kompilera om.
Hittade dessa filer och kopierade till min projekt katalog samt adderade dom till mitt projekt. Ändrade #include <xlcd.h> till #include "xlcd.h". Ändå samma problem.
Programmet fastnar i

Kod: Markera allt

OpenXLCD( FOUR_BIT & LINES_5X7 );	//Setup pins

och att det fastnar tycker jag är märkligt
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46998
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av TomasL »

Vad menar du med "fastnar"
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46998
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av TomasL »

Kan inte se att du anropar XLCDInit() nånstans, dvs du initierar inte displayen.
Är KS0066 kompatibel med HD44780?
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av jfri »

Med fastnar menar jag att programraden efter (som släcker LEDen) aldrig utförs.
Initieringen sker i funktionen OpenXLCD( FOUR_BIT & LINES_5X7 );
Ja LCD displayen är HD44780 kompatibel.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46998
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av TomasL »

Nej, det är ingen initiering, du måste köra XLCDInit , vilket är funktionen som initierar displayen.
Ett kort ord RTFM.
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av jfri »

Från manualen citerar jag
OpenXLCD Configure the I/O lines used for controlling the LCD and
initialize the LCD
.
Den funktion du nämner finns inte omnämnd i manualen och inte heller bland de filer som fanns i XLCD katalogen under MCC18
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46998
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av TomasL »

Såg det nu, det var en betydligt äldre version jag själv hade, vilken har XLCDInit.

Nåväl, Hur har du kopplat, Vilka pinnar går vart?
Fungerar displayen? (kanske svårt att veta iofs).
EN variant, om du inte har en logikanalysator är att stega fram programmet, och ha lysdioder på utgångarna. så du kan se vilka signaler du får ut.

Får du några varningar när du kompilerar?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av sodjan »

Jag ser igentligen inget större problem., bara att köra felsökning enligt kurs 1A.
Har du gjort någonting alls för att felsöka ?

Har du kollat assembler listan (det kan inte bli speciellt mycket av
den där lilla koden) och kollat om den gör rimliga saker ?

Kolla dina delayer, speciellt vid uppstart. Lägg gärna en längre delay (1 sec minst)
först i koden innan du gör någonting alls mot LCD'n. Det tar ett tag för LCD'n
att köra sina POST (Power On Self Test).

Får du samma problem vid power-on av PIC+LCD som om du enbart resettar
PIC'en utan att stänga av LCD'n ?

Fungerar LCD'n ? (Testa med annan kod, något som kör mer "direkt" utan fördiga libbar).
Skriv (eller hitta något) som kör lite direkta kommandon till LCDn...
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: Behöver hjälp med att få LCD fungera på PIC18F458

Inlägg av jfri »

Ja har gjort felsökning. Har kontrollerat att det är rätt kopplat
LCD PIC
pin 4 RS - pin 7 RA5
pin 5 RW - pin 8 RE0
pin 6 E - pin 6 RA4
pin 7 DB0 - pin 2 RA0
pin 8 DB1 - pin 3 RA1
pin 9 DB2 - pin 4 RA2
pin 9 DB3 - pin 3 RA3
(samt GND +5V och A K för backlight)
Har också kollat min xlcd.h och att det är denna som används. Har också kopplat LED till RC3 för felsökningsämdamål.
Har emellertid förutsatt att de färdiga rutiner jag försöker använda fungerar så jag har inte gått in och analyserat assemblerkod.
Har dock nu också flyttat in tänd LED raden i openxlcd.c och sett att programmet stannar vid dess första anrop while( BusyXLCD() );
Ser också att funktionen korrekt tolkat att jag använder 4 bit mode och lower nibble.
Denna funktion returnerar 0 så länge alla data pinnar är 0. Förslaget med extra fördröjning före LCD initiering hjälpte inte.
Denna LCD har tidigare fungerat och då använde jag 8 bit mode så den hårdvaran kan inte användas nu.
Samma sak om jag bara resettar (från MPLAB)
Skriv svar