| 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?.
 |  | 
	
		|  | 
	
		|  |