|
|
View previous topic :: View next topic |
Author |
Message |
adalucio
Joined: 16 Mar 2009 Posts: 29
|
18f4550 and nokia lcd |
Posted: Fri Nov 19, 2010 1:53 pm |
|
|
Hi all
I'm using nokia lcd board from sparkfun. I have successfully drived the lcd with a 16f877a. Now I'm tryng to connect it to a 18f4550 (with a crystal 20mhz).
Problem: no output on SDO line
Here is my code
main.c
Code: |
#include "main.h"
#include "nokia.h"
//#include "font.h"
void main()
{
int16 i;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_4); // come da programma esempio
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_b(0x00); // all outputs, can change to mask only hardware SPI bits if needed
set_tris_c(0x00); // all outputs, can change to mask only hardware SPI bits if needed
// ----------------------------------------------------------------------
delay_ms(200);
init_lcd();
test_colori();
while(1)
{
output_toggle(PIN_D2);
delay_ms(500);
}
}
|
main.h
Code: |
#include <18F4550.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES PUT //Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES NOSTVREN //Stack full/underflow will not cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL5 //Divide By 5(20MHz oscillator input)
#FUSES CPUDIV1 //No System Clock Postscaler
#FUSES NOUSBDIV //USB clock source comes from primary oscillator
#FUSES VREGEN //USB voltage regulator enabled
#FUSES NOICPRT //ICPRT disabled
#use delay(clock=20000000)
|
nokia.h
Code: |
#define LCD_RESET PIN_C0
#define LCD_CS PIN_C1
#define SPI_DO PIN_C7
#define SPI_DI PIN_C6 //unused
#define SPI_CLK PIN_B1
#bit SSPEN = 0xFC6.5 // bit to turn on/off hardware SPI
// Epson S1D15G10 Command Set
#define DISON 0xaf
#define DISOFF 0xae
#define DISNOR 0xa6
#define DISINV 0xa7
#define SLPIN 0x95
#define SLPOUT 0x94
#define COMSCN 0xbb
#define DISCTL 0xca
#define PASET 0x75
#define CASET 0x15
#define DATCTL 0xbc
#define RGBSET8 0xce
#define RAMWR 0x5c
#define RAMRD 0x5d
#define PTLIN 0xa8
#define PTLOUT 0xa9
#define RMWIN 0xe0
#define RMWOUT 0xee
#define ASCSET 0xaa
#define SCSTART 0xab
#define OSCON 0xd1
#define OSCOFF 0xd2
#define PWRCTR 0x20
#define VOLCTR 0x81
#define VOLUP 0xd6
#define VOLDOWN 0xd7
#define TMPGRD 0x82
#define EPCTIN 0xcd
#define EPCOUT 0xcc
#define EPMWR 0xfc
#define EPMRD 0xfd
#define EPSRRD1 0x7c
#define EPSRRD2 0x7d
#define NOP 0x25
#define ENDPAGE 132
#define ENDCOL 130
/* Colori */
#define WHITE 0b11111111
#define BLACK 0b00000000
#define RED 0b11100000
#define BLUE 0b00000011
#define GREEN 0b00011100
/*
#define DarkBlue 0x02
#define LightBlue 0x03
#define DarkGreen 0x14
#define LightGreen 0x1c
#define DarkRed 0x60
#define LightRed 0xe0
#define White 0xff
#define Black 0x00
#define Yellow 0xdd
#define Purple 0x62
#define RED 0xE0 // Color Code
#define GREEN 0x1C
#define BLUE 0x03
#define YELLOW 0xFC
#define MAGENTA 0xE3
#define CYAN 0x1F
#define BLACK 0x00
#define WHITE 0xFF
*/
#use fast_io(C)
#use fast_io(B)
void spi_command(int dat)
{
output_low(LCD_CS); // enable chip
SSPEN = 0; // shut off hardware SPI allowing direct access to SPI in/out pins
output_low (SPI_DO); // output low on data out (9th bit low = command)
output_high (SPI_CLK);
delay_cycles(1); // send clock pulse
output_low (SPI_CLK);
SSPEN=1; // turn hardware SPI back on
spi_write(dat); // make PIC do the work for the command byte
output_high(LCD_CS); // disable
}
void spi_data(int dat)
{
output_low(LCD_CS); // enable chip
SSPEN = 0; // turn off hardware SPI allowing us direct access to SPI in/out pins
output_high (SPI_DO); // output high on data out (9th bit high = data)
output_high (SPI_CLK);
delay_cycles(1); // send clock pulse
output_low (SPI_CLK);
SSPEN=1; // turn hardware SPI back on
spi_write(dat); // make PIC do the work for the data byte
output_high(LCD_CS); // disable
}
void pset(unsigned char color, unsigned char x, unsigned char y)
{
// sets the starting page(row) and column (x & y) coordinates in ram,
// then writes the colour to display memory. The ending x & y are left
// maxed out so one can continue sending colour data bytes to the 'open'
// RAMWR command to fill further memory. issuing any other command
// finishes RAMWR.
x += 2; // for some reason starts at 2
spi_command(PASET); // page start/end ram
spi_data(x);
spi_data(ENDPAGE);
spi_command(CASET); // column start/end ram
spi_data(y);
spi_data(ENDCOL);
spi_command(RAMWR); // write
spi_data(color);
}
void init_lcd()
{
// reset display
output_low (SPI_CLK);
output_low (SPI_DO);
output_high (LCD_CS);
output_low (LCD_RESET);
delay_ms(100);
output_high (LCD_RESET);
//init'd, now drop CS to send commands/data and raise when finished
spi_command(DISCTL); // display control
spi_data(0x0C); // 12 = 1100 - CL dividing ratio [don't divide] switching period 8H (default)
spi_data(0x20); // 32 = (128/4)-1 (round up) number of display lines for scanning
spi_data(0x0C); // 12 = 1100 - number of lines to be inversely highlighted
spi_data(0x00);
spi_command(COMSCN); // common scanning direction
spi_data(0x01);
// 0 0 0 = 1 -> 80 81 -> 160
// 0 0 1 = 1 -> 80 81 <- 160
// 0 1 0 = 1 <- 80 81 -> 160
// 0 1 1 = 1 <- 80 81 <- 160
spi_command(OSCON); // internal oscialltor ON
spi_command(SLPOUT); // sleep out
spi_command(PWRCTR); // power ctrl
spi_data(0x0f); //everything on, no external reference resistors
delay_ms(100);
spi_command(DISINV); // invert display mode
spi_command(DATCTL); // data control
spi_data(0x00); // normal display of page/column address, page scan direction
spi_data(0x00); // normal RGB arrangement
spi_data(0x01); // 8-bit grayscale
spi_command(VOLCTR); // electronic volume, this is the contrast/brightness
spi_data(0x30); // volume (contrast) setting - fine tuning 23
spi_data(0x03); // internal resistor ratio - coarse adjustment
spi_command(RGBSET8); // setup 8-bit color lookup table [RRRGGGBB]
//RED
spi_data(0);
spi_data(2);
spi_data(4);
spi_data(6);
spi_data(8);
spi_data(10);
spi_data(12);
spi_data(15);
// GREEN
spi_data(0);
spi_data(2);
spi_data(4);
spi_data(6);
spi_data(8);
spi_data(10);
spi_data(12);
spi_data(15);
//BLUE
spi_data(0);
spi_data(4);
spi_data(9);
spi_data(15);
spi_command(NOP); // nop
delay_ms(100);
spi_command(DISON); // display on
}
void test_colori()
{
int16 i;
pset(RED, 0, 0); // red pixel top left (also sets start of bulk write, see pset routine)
for(i=1; i<=16900; i++)
{ // 130x130 = 16900
spi_data(RED); // fill screen red
}
delay_ms(2000);
pset(BLUE, 0, 0);
for(i=1; i<=16900; i++)
{ // 130x130 = 16900
spi_data(BLUE); // fill screen blue
}
delay_ms(2000);
pset(GREEN, 0, 0);
for(i=1; i<=16900; i++)
{ // 130x130 = 16900
spi_data(GREEN); // fill screen green
}
delay_ms(2000);
pset(WHITE, 0, 0);
for(i=1; i<=16900; i++)
{ // 130x130 = 16900
spi_data(WHITE); // fill screen white
}
delay_ms(2000);
pset(BLACK, 0, 0);
for(i=1; i<=16900; i++)
{ // 130x130 = 16900
spi_data(BLACK); // fill screen black
}
}
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Nov 19, 2010 3:53 pm |
|
|
Try a simple program like this, and see what you get on the SDO pin.
You should see a signal. If not, do you have some other chip connected
to that line ? Maybe that chip is holding the SDO line at a low level ?
If it doesn't work and you can't decide the reason, then post your
compiler version.
Code: |
#include <18F4550.h>
#fuses HS,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=20000000)
// SPI mode definitions for 16F and 18F PICs (not for PIC24).
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
//======================================
void main(void)
{
setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_4);
while(1)
{
spi_write(0x55);
}
} |
|
|
|
adalucio
Joined: 16 Mar 2009 Posts: 29
|
|
Posted: Sat Nov 20, 2010 6:38 am |
|
|
ok I have SDO output (perhaps an error of measurement before)
but no results on lcd! it is strange because the same program on 16f877 works fine.
SSPEN is correct?
Code: |
#bit SSPEN = 0xFC6.5
|
|
|
|
adalucio
Joined: 16 Mar 2009 Posts: 29
|
|
Posted: Sun Nov 21, 2010 10:00 am |
|
|
SOLVED!!!!!
it seems that I cannot write directly SSPEN
so I have to change
to
Code: | setup_spi(SPI_SS_DISABLED); |
and
to
Code: | setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_4); |
why I cannot access SSPEN directly? |
|
|
|
|
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
|