| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		
			borseyogesh1436
 
 
  Joined: 30 Nov 2017 Posts: 29
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| [SOLVED]How to use glcd data pin from pin8 to pin15 ? | 
			 
			
				 Posted: Tue Jan 02, 2018 12:55 am     | 
				     | 
			 
			
				
  | 
			 
			
				Hi friends 
 
I want to use Glcd data pin from pin 8 to pin 15 of portD of pic24FJ96GA010 and also use portd 4,5,7 for CS 1&2 RST of GLCD.
 
Changes are made in void glcd_writeByte(int1 side, int8 data) and BYTE glcd_readByte(int1 side).
 
 
Code is working when i use PORTF for CS1,2 & RST of glcd, but not working when used PORTD PIN 4,5 and 7 for CS1,2 & RST.
 
 
How to send 8 bit data without affecting rst and cs1&2 ?
 
 
pic24FJ96GA010 with compiler PCD  Ver.5.015
 
 
FULL PROGRAM AND CIRCUIT
 
https://drive.google.com/file/d/1D-OMci3YKztx68kuMQpVusV99kK3je-N/view?usp=sharing
 
 
 	  | Code: | 	 		  
 
#define GLCD_CS1    PIN_D4   // Chip Selection 1
 
#define GLCD_CS2    PIN_D5   // Chip Selection 2
 
#define GLCD_DI      PIN_F3   // Data or Instruction input
 
#define GLCD_RW     PIN_A14   // Read/Write
 
#define GLCD_E       PIN_A15   // Enable
 
#define GLCD_RST    PIN_D7   // Reset
 
 
void glcd_writeByte(int1 side, int8 data)
 
{ 
 
   if(side)                   // Choose which side to write to
 
      output_high(GLCD_CS2);
 
   else
 
      output_high(GLCD_CS1);
 
 
   output_low(GLCD_RW);       // Set for writing 
 
   output_d(data<<8);            // Put the data on the port
 
   delay_cycles(1);
 
   output_high(GLCD_E);       // Pulse the enable pin
 
   delay_cycles(5);
 
   output_low(GLCD_E);
 
   output_low(GLCD_CS1);      // Reset the chip select lines
 
   output_low(GLCD_CS2);
 
}
 
 
BYTE glcd_readByte(int1 side)
 
{
 
   int8 data;              // Stores the data read from the LCD
 
 
   set_tris_d(0xFF00);          // Set port d to input
 
   output_high(GLCD_RW);      // Set for reading
 
 
   if(side)                   // Choose which side to write to
 
   output_high(GLCD_CS2);
 
   else
 
   output_high(GLCD_CS1);
 
 
   delay_cycles(1);
 
   output_high(GLCD_E);       // Pulse the enable pin
 
   delay_cycles(4);
 
   data = input_d();          // Get the data from the display's output register
 
   data=data>>8;
 
   output_low(GLCD_E);
 
   output_low(GLCD_CS1);      // Reset the chip select lines
 
   output_low(GLCD_CS2);
 
   return data;               // Return the read data
 
} | 	  
 
 
THANKS
  Last edited by borseyogesh1436 on Sat Jan 06, 2018 5:38 am; edited 1 time in total | 
			 
		  | 
	
	
		  | 
	
	
		
			temtronic
 
 
  Joined: 01 Jul 2010 Posts: 9589 Location: Greensville,Ontario 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Jan 02, 2018 5:55 am     | 
				     | 
			 
			
				
  | 
			 
			
				I don't use that PIC but the obvious answers are
 
1) those pins are input only
 
2) those pins have another peripheral on them
 
3) those pins are grounded or not connected to GLCD
 
 
ohmeter proves #3, the datasheet #1 and #2
 
 
Jay | 
			 
		  | 
	
	
		  | 
	
	
		
			RF_Developer
 
 
  Joined: 07 Feb 2011 Posts: 839
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Jan 02, 2018 7:56 am     | 
				     | 
			 
			
				
  | 
			 
			
				In both routines you shift data left by eight bits:
 
 
 
As data is int8, what you are doing is shifting all the bits out of the byte. You need to cast to 16 bits before shifting:
 
 
 	  | Code: | 	 		  
 
output_d((int16)data<<8);
 
 | 	  
 
 
Remember, in C, where you put the result of the expression does not determine what type the expression variables need to be.
 
 
When you read, the ports on 24s are sixteen bits wide, so you need to assign to an int16 and then shift. At the moment you assign it to an int8, loosing the top eight bits, i.e. the data, completely.
 
 
Better yet, use Uint8 and Uint16 rather than int8 and int16. The results of shifts on signed variables are not defined in C. Int is signed on 24s (PCD compiler) but unsigned on 18/16/12/10s (PCM and PCH compilers).
 
 
Neither of these has anything to do with port d. | 
			 
		  | 
	
	
		  | 
	
	
		
			temtronic
 
 
  Joined: 01 Jul 2010 Posts: 9589 Location: Greensville,Ontario 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Jan 02, 2018 9:51 am     | 
				     | 
			 
			
				
  | 
			 
			
				OK....can anyone explain WHY you'd alter the data from the GLCD display? 
 
The OP does the right shift >>8, I'd expect to NOT alter the data but them I don't use GLCDs...
 
 
Jay | 
			 
		  | 
	
	
		  | 
	
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Jan 02, 2018 12:14 pm     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Quote: | 	 		  | How to send 8 bit data without affecting rst and cs1&2 ?  | 	  
 
You are not using #fast_io, so CCS i/o functions will set the TRIS before
 
they do the read or write operation.  These i/o functions include input_d() 
 
and output_d(), etc.
 
 
This means the following line in your glcd_readByte() function will set
 
all pins on PortD to be inputs.   
 
 
But this will ruin pins CS1,2 & RST, which must always be outputs.
 
 
 
--------------------------------
 
temtronic, he says the reason in his post:
 
  	  | Quote: | 	 		  | I want to use Glcd data pin from pin 8 to pin 15 of portD  | 	  
 
He is using the upper 8 bits of a 16-bit i/o port on a PIC24. | 
			 
		  | 
	
	
		  | 
	
	
		
			temtronic
 
 
  Joined: 01 Jul 2010 Posts: 9589 Location: Greensville,Ontario 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Jan 02, 2018 12:30 pm     | 
				     | 
			 
			
				
  | 
			 
			
				hmm 16 bit port...doh ! I must be getting old ( or too cold). My mind's kinda stuck in 'BYTE' mode as I'm always using 16 or 18 series I forget about the 'big brother' version of PICs.
 
 
2nd hmm... anyone cut code for a 'flex_GLCD'?
 
 
Jay | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Jan 02, 2018 1:33 pm     | 
				     | 
			 
			
				
  | 
			 
			
				It's worth realising you can cheat.
 
 
If you use:
 
 	  | Code: | 	 		  
 
#BYTE PORTDH=getenv("SFR:PORTD+1
 
 
//You can then write to the high byte of PORTD, without changing
 
//the TRIS, by just writing to PORTDH
 
 
PORTDH=data;
 
 | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		
			borseyogesh1436
 
 
  Joined: 30 Nov 2017 Posts: 29
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Jan 02, 2018 10:46 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Thanks for reply friends
 
 	  | Quote: | 	 		  | output_d((int16)data<<8); | 	   
 
 	  | Code: | 	 		  void glcd_writeByte(int1 side, int8 data)
 
{ 
 
   set_tris_d(0x0000); 
 
   if(side)                   // Choose which side to write to
 
      output_high(GLCD_CS2);
 
   else
 
      output_high(GLCD_CS1);
 
 
   output_low(GLCD_RW);       // Set for writing 
 
   output_d((int16)data<<8);         // Put the data on the port
 
   delay_cycles(1);
 
   output_high(GLCD_E);       // Pulse the enable pin
 
   delay_cycles(5);
 
   output_low(GLCD_E);
 
   output_low(GLCD_CS1);      // Reset the chip select lines
 
   output_low(GLCD_CS2);
 
}
 
 
BYTE glcd_readByte(int1 side)
 
{
 
   int8 data; int16 dat;             // Stores the data read from the LCD
 
 
   set_tris_d(0xFF00);          // Set port d to input
 
   output_high(GLCD_RW);      // Set for reading
 
 
   if(side)                   // Choose which side to write to
 
   output_high(GLCD_CS2);
 
   else
 
   output_high(GLCD_CS1);
 
 
   delay_cycles(1);
 
   output_high(GLCD_E);       // Pulse the enable pin
 
   delay_cycles(4);
 
   dat = input_d();          // Get the data from the display's output register
 
   data=(int8)dat>>8;
 
   output_low(GLCD_E);
 
   output_low(GLCD_CS1);      // Reset the chip select lines
 
   output_low(GLCD_CS2);
 
   return data;               // Return the read data
 
} | 	  
 
 
This doesn't work it will effect on cs1,2and RST but LCD data PIN 8 to PIN15 work
 
 
 
And another change 
 
 	  | Quote: | 	 		  #BYTE PORTDH=getenv("SFR:PORTD+1 
 
PORTDH=data; | 	  
 
 
It is showing error string too long
 
 
I think proper syntax is
 
 	  | Quote: | 	 		  | #BYTE PORTDH=getenv("SFR:PORTD") | 	  
 
I try this
 
 	  | Quote: | 	 		  | #BYTE PORTDH=getenv("SFR:PORTD+1") | 	  
 
But it will showing error
 
Expecting an identifier bad SFR name
 
 
 
I have ready made  hardware setup so that I change LCD pins on software only
 
 
I try other compiler xc16
 
 
 	  | Quote: | 	 		  PORTD & =0X00FF;
 
PORTD |= (data<<8); | 	  
 
 
It will work and not affecting cs1,2and RST.
 
 
But I have to use CCS without changing hardware. Pls help me friends. | 
			 
		  | 
	
	
		  | 
	
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Jan 02, 2018 11:56 pm     | 
				     | 
			 
			
				
  | 
			 
			
				I suspect that he wants you to do this:
 
 	  | Code: | 	 		  | #BYTE PORTDH=getenv("SFR:PORTD")+1  | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		
			borseyogesh1436
 
 
  Joined: 30 Nov 2017 Posts: 29
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Wed Jan 03, 2018 12:24 am     | 
				     | 
			 
			
				
  | 
			 
			
				thanks for reply 
 
 
its working but after connect rst to 5v
 
 
its affecting RST PIN only that is connected to PIND.7 its showing 0v
 
 
why affecting only RST PIN ?
 
 
output_high(GLCD_RST); IS HIGH IN glcd_init
 
 
i change code of TRISDH without that not working proper
 
 
 	  | Code: | 	 		  #BYTE PORTDH=getenv("SFR:PORTD")+1
 
#BYTE TRISDH=getenv("SFR:TRISD")+1
 
 
 
void glcd_init(int1 mode)
 
{
 
   // Initialze some pins
 
   output_high(GLCD_RST);
 
   output_low(GLCD_E);
 
   output_low(GLCD_CS1);
 
   output_low(GLCD_CS2);
 
 
   output_low(GLCD_DI);                 // Set for instruction
 
   glcd_writeByte(GLCD_LEFT,  0xC0);    // Specify first RAM line at the top
 
   glcd_writeByte(GLCD_RIGHT, 0xC0);    //   of the screen
 
   glcd_writeByte(GLCD_LEFT,  0x40);    // Set the column address to 0
 
   glcd_writeByte(GLCD_RIGHT, 0x40);
 
   glcd_writeByte(GLCD_LEFT,  0xB8);    // Set the page address to 0
 
   glcd_writeByte(GLCD_RIGHT, 0xB8);
 
 
   if(mode == ON)
 
   {
 
      glcd_writeByte(GLCD_LEFT,  0x3F); // Turn the display on
 
      glcd_writeByte(GLCD_RIGHT, 0x3F);
 
   }
 
   else
 
   {
 
      glcd_writeByte(GLCD_LEFT,  0x3E); // Turn the display off
 
      glcd_writeByte(GLCD_RIGHT, 0x3E);
 
   }
 
 
   glcd_fillScreen(OFF);                // Clear the display
 
 
   #ifdef FAST_GLCD
 
   glcd_update();
 
   #endif
 
}
 
 
 
void glcd_writeByte(int1 side, int8 data)
 
{ set_tris_d(0x0000); 
 
  output_high(GLCD_RST);
 
   if(side)                   // Choose which side to write to
 
      output_high(GLCD_CS2);
 
   else
 
      output_high(GLCD_CS1);
 
 
   output_low(GLCD_RW);       // Set for writing 
 
   PORTDH=data;
 
   //output_d((int16)data<<8);         // Put the data on the port
 
   delay_cycles(1);
 
   output_high(GLCD_E);       // Pulse the enable pin
 
   delay_cycles(5);
 
   output_low(GLCD_E);
 
   output_low(GLCD_CS1);      // Reset the chip select lines
 
   output_low(GLCD_CS2);
 
}
 
 
 
// Purpose:    Reads a byte of data from the specified chip
 
// Ouputs:     A byte of data read from the chip
 
BYTE glcd_readByte(int1 side)
 
{
 
   int8 data; //int16 dat;             // Stores the data read from the LCD
 
 
   TRISDH=0xFF;               // Set port d to input
 
   output_high(GLCD_RW);      // Set for reading
 
 
   if(side)                   // Choose which side to write to
 
   output_high(GLCD_CS2);
 
   else
 
   output_high(GLCD_CS1);
 
 
   delay_cycles(1);
 
   output_high(GLCD_E);       // Pulse the enable pin
 
   delay_cycles(4);
 
   data = PORTDH  ;        // Get the data from the display's output register
 
   output_low(GLCD_E);
 
   output_low(GLCD_CS1);      // Reset the chip select lines
 
   output_low(GLCD_CS2);
 
   return data;               // Return the read data
 
} | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Wed Jan 03, 2018 1:41 am     | 
				     | 
			 
			
				
  | 
			 
			
				Apologies. The bracket got missed.
 
 
Typing on the train.
 
 
PCM_programmer has given the correct syntax.
 
 
The point is you don't want to be taling to PORTD (this would be the low byte), but the address of PORTD, +1, is the address of just the high byte, using byte I/O.
 
 
I'm quite worried by your compiler version number. 5.015, was a relatively early 'workable' V5 compiler, and I'd not be surprised if this had problems with some features. However D7 is a pin I'd not expect any problems with (hasn't got any other peripheral on it that would affect I/O). Are you _sure_ the physical connection to the pin is working?. Leave everything disconnected, and just toggle this pin. Does it toggle as it should?. | 
			 
		  | 
	
	
		  | 
	
	
		
			borseyogesh1436
 
 
  Joined: 30 Nov 2017 Posts: 29
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Wed Jan 03, 2018 2:25 am     | 
				     | 
			 
			
				
  | 
			 
			
				Thanks for reply.
 
 
Physical connection to the all pin is correct and working properly. I test other compiler "XC16" program for testing is working correctly and PIND7 is also toggle as
 
 	  | Code: | 	 		     
 
output_high(PIN_D7);
 
delay_ms(1000);
 
output_low(PIN_D7);
 
delay_ms(1000); | 	  
 
 
But when i try full code the RST pin always LOW. If it's LOW GLCD doesn't show anything and after i disconnect RST pin and connect that to 5V, LCD working properly in normal mode GLCD. FAST_GLCD MODE its not working any thing.
 
 
code and connection 
 
 
https://drive.google.com/file/d/1PdXr-zwNcDfkmTQuxhC6rc_aoYGfjkeE/view?usp=sharing | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Wed Jan 03, 2018 3:01 am     | 
				     | 
			 
			
				
  | 
			 
			
				If you look through the listing file, RST is being set high:
 
 	  | Code: | 	 		  
 
....................    output_high(GLCD_RST); 
 
*
 
043C:  BCLR.B  2D2.7
 
043E:  BSET.B  2D6.7
 
 | 	  
 
0x2D2 is the TRIS and 2D6 is the port.
 
 
If we then search for 2D6, there are no other instructions on the code turning this bit off. What is the drive current requirement of the RST pin on your LCD?. 
 
It may just require more current than the PIC is able to deliver. What happens if you pull it up with a 100R resistor, rather than a direct connection?. | 
			 
		  | 
	
	
		  | 
	
	
		
			borseyogesh1436
 
 
  Joined: 30 Nov 2017 Posts: 29
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Wed Jan 03, 2018 3:29 am     | 
				     | 
			 
			
				
  | 
			 
			
				thanks for replay Ttelmah
 
 
pullup with 100R is not working, direct 5v is working
 
 
i try that code with other device  i have PIC30f6014Ai try that code with other device  i have PIC30f6014A see if it's working or not 
 
 
thanks once again friends            | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Wed Jan 03, 2018 4:32 am     | 
				     | 
			 
			
				
  | 
			 
			
				The 6014A, is an 80pin chip, while the GA010, is a 100pin chip. I'd be quadruple checking the connections....
 
 
Do you have a data sheet for the GLCD?.
 
What current does it say the RST pin requires?. | 
			 
		  | 
	
	
		  | 
	
	
		 |