CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

18f4550 and nokia lcd

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
adalucio



Joined: 16 Mar 2009
Posts: 29

View user's profile Send private message

18f4550 and nokia lcd
PostPosted: Fri Nov 19, 2010 1:53 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Fri Nov 19, 2010 3:53 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Sat Nov 20, 2010 6:38 am     Reply with quote

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

View user's profile Send private message

PostPosted: Sun Nov 21, 2010 10:00 am     Reply with quote

SOLVED!!!!!
Very Happy Very Happy Very Happy

it seems that I cannot write directly SSPEN

so I have to change

Code:
SSPEN=0;

to
Code:
setup_spi(SPI_SS_DISABLED);


and


Code:
SSPEN=1;

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?
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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