|
|
View previous topic :: View next topic |
Author |
Message |
seme1
Joined: 13 Jun 2009 Posts: 21
|
How to drive GLCD with Controller AVANT SBN0064G |
Posted: Mon Jun 29, 2009 8:47 am |
|
|
I have a graphics lcd with the controller AVANT SBN0064G. I have seen the example code provided with CCS, but it was for a different controller.
The GLCD datasheet is
http://download.maritex.com.pl/pdfs/op/TG12864B-31.pdf
And for the controller, it is:
http://www.allshore.com/pdf/Avant%20SBN0064G.pdf
Can anybody please give me hints on how to start working with this GLCD ? I need to display simply English characters/words first.
Any help is very much appreciated. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jun 29, 2009 1:30 pm |
|
|
Here is how find a driver for your controller:
Search for the following terms in http://www.google.com
Quote: | SBN0064G compatible |
This will find information on which "standard" controllers are compatible
with your controller.
Result:
http://www.marketa.com/eng/semicon_pro_avant.html
This page shows that your controller is compatible with the KS0108.
Next, search the CCS drivers directory for that driver. Result:
Quote: | c:\program files\picc\drivers\ks0108.c |
|
|
|
seme1
Joined: 13 Jun 2009 Posts: 21
|
|
Posted: Mon Jun 29, 2009 5:22 pm |
|
|
Thanks for the response.
I tried running a simple software on to see if I got the right driver, but screen is showing nothing (blank), not even garbage characters.
Code: |
#include <18F46K20.h>
#fuses XT, NOWDT, PUT ,BROWNOUT, NOLVP
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=8000000)
//#define FAST_GLCD
#include <HDM64GS12.c>
#include <graphics.c>
#include <math.h>
// #device adc=8
#include <stdio.h>
#include <stdlib.h>
void main() {
char voltText[] = "Volts", warning[] = "Warning";
glcd_init(ON); // Must initialize the LCD
glcd_rect(1, 5, 126, 15, NO, ON); // Outline the bar
glcd_text57(70, 18, voltText, 1, ON); // Display "Volts"
glcd_circle(30, 47, 10, NO, ON); // Draw the clock circle
#ifdef FAST_GLCD
glcd_update();
#else
delay_ms(100); // Reduces flicker by allowing pixels to be on
// much longer than off
#endif
for(;;) {
}
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jun 29, 2009 5:32 pm |
|
|
Quote: | #fuses XT, NOWDT, PUT ,BROWNOUT, NOLVP
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=8000000) |
Look in this section of the 18F46K20 data sheet:
Quote: | TABLE 26-6: EXTERNAL CLOCK TIMING REQUIREMENTS |
It's on page 382 in the Acrobat reader:
http://ww1.microchip.com/downloads/en/DeviceDoc/41303E.pdf
It shows the maximum crystal frequency for the XT mode is 4 MHz.
You need to change the fuse to HS for an 8 MHz crystal. |
|
|
seme1
Joined: 13 Jun 2009 Posts: 21
|
|
Posted: Mon Jun 29, 2009 5:49 pm |
|
|
I don't think that is the cause of the problem as I tried to get some text displayed on a basic 2-line LCD, and it worked perfectly fine.
I changed the fuse to HS anyway to see if it would make any difference. The GLCD is still not showing anything (blank screen with nothing on it) |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jun 29, 2009 7:52 pm |
|
|
Post a list of the connections between your PIC and the LCD.
Post the actual pin numbers. |
|
|
seme1
Joined: 13 Jun 2009 Posts: 21
|
|
Posted: Mon Jun 29, 2009 8:29 pm |
|
|
GLCD ----------- PIC
4 (RS) ---------- 35 (B2)
5 (RW) ---------- 37 (B4)
6 (E) ------------- 38 (B5)
7 ------------- 19 (D0)
8 ------------- 20 (D1)
9 --------------- 21 (D2)
10 ------------- 22 (D3)
11 ------------- 23 (D4)
12 ------------- 24 (D5)
13 ------------- 25 (D6)
14 -------------- 26 (D7)
15 (CS1) ------------- 33 (B0)
16 (CS2) -------------- 34 (B1)
17 (RST) --------------- 15 (C0) |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jun 29, 2009 9:07 pm |
|
|
I assume you're using the 40-pin DIP package for the PIC.
There are some wiring errors. The data bus is supposed to
be completely on Port D, but the upper 4 bits are are Port C
by mistake. See the lines shown in bold below:
Quote: |
GLCD ----------- PIC
++++++++++
4 (RS) ---------- 35 (B2)
5 (RW) ---------- 37 (B4)
6 (E) ------------- 38 (B5)
7 ------------- 19 (D0)
8 ------------- 20 (D1)
9 --------------- 21 (D2)
10 ------------- 22 (D3)
11 ------------- 23 (D4) *** Is pin C4, should be RD4, pin 27
12 ------------- 24 (D5) *** Is pin C5, should be RD5, pin 28
13 ------------- 25 (D6) *** Is pin C6, should be RD6, pin 29
14 -------------- 26 (D7) *** Is pin C7, should be RD7, pin 30
15 ------------- 33 (B0)
16 -------------- 34 (B1)
17 --------------- 15 (C0) |
|
|
|
seme1
Joined: 13 Jun 2009 Posts: 21
|
|
Posted: Tue Jun 30, 2009 5:09 am |
|
|
Thanks again for the response. I fixed the wiring as you suggested (4 wires), and it's still showing nothing (screen is blank)
What else could be the reason ? |
|
|
seme1
Joined: 13 Jun 2009 Posts: 21
|
|
Posted: Tue Jun 30, 2009 9:14 am |
|
|
To try and figure out what could be wrong, I wrote the following routine:
Code: |
#include <18F46K20.h>
#fuses XT, NOWDT, PUT ,BROWNOUT, NOLVP
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=8000000)
#define FAST_GLCD
#include <HDM64GS12.c>
#include <graphics.c>
#include <math.h>
// #device adc=8
#include <stdio.h>
#include <stdlib.h>
void main() {
char voltText[] = "Volts", warning[] = "Warning";
output_high(PIN_A1);
glcd_init(ON); // Must initialize the LCD
glcd_rect(1, 5, 126, 15, NO, ON); // Outline the bar
glcd_text57(70, 18, voltText, 1, ON); // Display "Volts"
glcd_circle(30, 47, 10, NO, ON); // Draw the clock circle
glcd_fillScreen(ON);
output_high(PIN_A0);
#ifdef FAST_GLCD
glcd_update();
#else
delay_ms(100); // Reduces flicker by allowing pixels to be on
// much longer than off
#endif
for(;;) {
glcd_fillScreen(ON);
glcd_update();
output_toggle(PIN_A0); // an LED is connected to A0
delay_ms(1000);
glcd_fillScreen(OFF);
glcd_update();
output_toggle(PIN_A0);
delay_ms(1000);
}
} |
And the results are as follows:
WHEN LED is HIGH
GLCD ----------- Voltage
4 (RS) ---------- 2.61 (not stable)
5 (RW) ---------- 0.78
6 (E) ------------- goes to 0.1 for a moment then 0
7 ------------- 0
8 ------------- 0
9 --------------- 0
10 ------------- 0
11 ------------- 0
12 ------------- 0
13 ------------- 0
14 -------------- 0.01
15 (CS1) ------------- goes to 0.1 for a moment then 0
16 (CS2) -------------- goes to 0.1 for a moment then 0
17 (RST) --------------- 2.71
LED LOW:
GLCD ----------- Voltage
4 (RS) ---------- 2.67 (not stable,, goes to 3 sometimes)
5 (RW) ---------- 0.64
6 (E) ------------- goes to 0.1 for a moment then 0
7 ------------- 3.04
8 ------------- 3.08
9 --------------- 3.07
10 ------------- 3.07
11 ------------- 3
12 ------------- 3
13 ------------- 3
14 -------------- 0.01
15 (CS1) ------------- goes to 0.1 for a moment then 0
16 (CS2) -------------- goes to 0.1 for a moment then 0
17 (RST) --------------- 3.05
The screen of the LCD is still blank. In one occasion while I was measuring the voltage values for some of the lcd pins, half of the right side of the screen went fully black except for random dots in the top which kept going on and off with the LED going on/off. The rest of the screen stayed intact. This kept me wondering about the voltage values and maybe the GLCD needs higher voltage than what is currently fed into it. I am supplying 5V to pin 2 (VDD) of the glcd, and I don't see how this could be the problem. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jun 30, 2009 12:14 pm |
|
|
Using a voltmeter won't help. You need an oscilloscope.
1. Delete the following line. It adds complexity that you don't need at
this point.
2. Post a detailed description of your contrast control circuit (connected
to pin 3 on the LCD). Measure the contrast voltage on pin 3 of the LCD.
What is it ?
3. Post the #define statements for the LCD pins, that are near the top
of the HDM64GS12.c file. |
|
|
seme1
Joined: 13 Jun 2009 Posts: 21
|
|
Posted: Sat Jul 04, 2009 3:11 pm |
|
|
Hi,
I commented out the line #define FAST_GLCD, and it didn't make any difference.
I did notice though that sometimes the lcd displays partly the text "Volts:" and the text shakes for few seconds before the led goes on and the screen picture changes.
The code I ran is the following:
Code: |
#include <18F46K20.h>
#fuses XT, NOWDT, PUT ,BROWNOUT, NOLVP
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=8000000)
//#define FAST_GLCD
#include <HDM64GS12.c>
#include <graphics.c>
void main() {
char voltText[] = "Volts", warning[] = "Warning";
glcd_init(ON); // Must initialize the LCD
output_high(PIN_A0);
for(;;) {
glcd_fillScreen(ON);
#ifdef FAST_GLCD
glcd_update();
#else
delay_ms(100); // Reduces flicker by allowing pixels to be on much longer than off
#endif
output_toggle(PIN_A0);
delay_ms(1000);
glcd_fillScreen(OFF);
#ifdef FAST_GLCD
glcd_update();
#else
delay_ms(100); // Reduces flicker by allowing pixels to be on much longer than off
#endif
output_toggle(PIN_A0);
delay_ms(1000);
glcd_rect(1, 5, 126, 15, NO, ON); // Outline the bar
glcd_text57(70, 18, voltText, 1, ON); // Display "Volts"
glcd_circle(30, 47, 10, NO, ON); // Draw the clock circle
output_toggle(PIN_A0);
#ifdef FAST_GLCD
glcd_update();
#else
delay_ms(100); // Reduces flicker by allowing pixels to be on much longer than off
#endif
delay_ms(1000);
}
} |
The difference in the voltage between pins 3 and 18 (VEE) is about 1.5v. On pin 3, the voltage is about 3.2V.
The define statements you asked for are:
Code: |
#ifndef HDM64GS12
#define HDM64GS12
#ifndef GLCD_WIDTH
#define GLCD_WIDTH 128
#endif
#ifndef GLCD_CS1
#define GLCD_CS1 PIN_B0 // Chip Selection 1
#endif
#ifndef GLCD_CS2
#define GLCD_CS2 PIN_B1 // Chip Selection 2
#endif
#ifndef GLCD_DI
#define GLCD_DI PIN_B2 // Data or Instruction input
#endif
#ifndef GLCD_RW
#define GLCD_RW PIN_B4 // Read/Write
#endif
#ifndef GLCD_E
#define GLCD_E PIN_B5 // Enable
#endif
#ifndef GLCD_RST
#define GLCD_RST PIN_C0 // Reset
#endif
#define GLCD_LEFT 0
#define GLCD_RIGHT 1
#ifndef ON
#define ON 1
#endif
#ifndef OFF
#define OFF 0
#endif
|
Last edited by seme1 on Sat Jul 04, 2009 6:43 pm; edited 1 time in total |
|
|
seme1
Joined: 13 Jun 2009 Posts: 21
|
|
Posted: Sat Jul 04, 2009 3:23 pm |
|
|
I uploaded a video showing exactly what I am getting now. The "Volts" text no longer appears !! (note the blinking green LED in the bottom right corner, that is PIN_A0)
http://tinypic.com/r/24y0e1j/5 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Jul 05, 2009 2:56 pm |
|
|
Your video is out of focus, so it's difficult to see any detail.
Your test program is too complicated. You're doing too many tests.
The screen is filled with many different results, so it's difficult to
trouble-shoot the problem.
I would try a test that just draws a single vertical line (full height)
in the middle of the display:
Code: |
#include <18F46K20.h>
#fuses HS, NOWDT, PUT, BROWNOUT, NOLVP, NOPBADEN
#use delay(clock=8000000)
#include <HDM64GS12.c>
#include <graphics.c>
//================================
void main()
{
glcd_init(1);
// syntax: glcd_line(x1, y1, x2, y2, color)
// Draw a vertical line down the middle of the screen
glcd_line(63, 0, 63, 63, 1);
while(1);
} |
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|