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

LCD 16x2 with PIC16F887

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



Joined: 11 Sep 2010
Posts: 8

View user's profile Send private message

LCD 16x2 with PIC16F887
PostPosted: Sat Sep 11, 2010 3:57 am     Reply with quote

Hi I have read all of the posts on the LCD problems, I've used Flex_lcd and the normal LCD library, this is my first project working with CCS and I know I'm just doing something dumb, I've been stuck on this for a few days now and I was hoping that someone could help me! The pins are right and I have triple checked the contrast voltage. I'm using a MC1602C-syl LCD 16x2 but all that I can get are black squares.

Here is the code from the flex_lcd();
Code:

#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7

#define LCD_E     PIN_D0
#define LCD_RS    PIN_D2
#define LCD_RW    PIN_D3

// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

#define USE_LCD_RW   1 



and here is all my code:
Code:

#include <16F887.H>
#fuses INTRC_IO, NOWDT, BROWNOUT, PUT, NOLVP, XT
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <input.c>
#include <string.h> 
#include "flex_lcd.c"
//====================================
#define FOUR_PHASE TRUE
#define LOWTOHIGH  TRUE
#byte CCP1CON = 0x17
#byte CCP2CON = 0x1D
#byte PWM1CON = 0x9B
#BYTE port_b = 6
BYTE const POSITIONS[4] = {0b0101,
                           0b1001,
                           0b1010,
                           0b0110};

boolean new = false;
char c = ' ';
int pos = -1;
int currentpos = 0;
char d = ' ';
int speed = -1;


#int_rda
void serial_isr() {
        c=getc();
        printf(" %c ",c);
        lcd_putc(c);
        if(c=='q')
            new = true;
        if((c != '1') && (c != '2') && (c != '3') && (c != '4') && (c != 'r') && (c != 'f') && (c != 'q')){
         printf( "WRONG INPUT");
         c = ' ';
        }
}
void stepper_motor_f(int steps)
{
   BYTE k,t;
   for(t = 0; t <=abs(currentpos);t++)
   {
      for(k = 0;k<=steps;k++)
      {
        static BYTE state = 0;
        delay_ms(10);
        set_tris_b(0xf0);
        port_b = POSITIONS[ state ];
        state++;
        if (state == 5) state = 0;
      }
   }
   currentpos = pos;
}
void stepper_motor_r(int steps)
{
   BYTE k,t;
   for(t = 0; t <=abs(currentpos);t++)
   {
      for(k = 0;k<=steps;k++)
      {
        static BYTE state = 4;
        delay_ms(10);
        set_tris_b(0xf0);
        port_b = POSITIONS[ state ];
        state--;
        if (state == 0) state = 4;
      }
   }
   currentpos = pos;
}
void DC_motor_r()
{
   int16 pwm_r;
   int k = 0;
   output_low(PIN_A1);
   output_low(PIN_A2);
   setup_ccp2(CCP_PWM);
   setup_timer_2(T2_DIV_BY_1, 128, 1);
   pwm_r = speed;
   while(k == 0)
   {
      set_pwm2_duty(pwm_r);
      output_high(PIN_A0);
      output_high(PIN_A3);
      if(new) k = 1;
      printf(" Running: ");
      delay_ms(1000);
   }
   output_low(PIN_A0);
   set_pwm2_duty(0);
   output_low(PIN_A1);
   output_low(PIN_A2);
   output_low(PIN_A3);
}
void DC_motor_f()
{
   int16 pwm_l;
   int k = 0;
   output_low(PIN_A0);
   output_low(PIN_A3);
   setup_ccp2(CCP_PWM);
   setup_timer_2(T2_DIV_BY_1, 128, 1);
   pwm_l = speed;
   while(k == 0)
   {
      set_pwm2_duty(pwm_l);
      output_HIGH(PIN_A1);
      output_HIGH(PIN_A2);
      if(new) k = 1;
      printf(" Running: ");
      delay_ms(1000);
   }
   output_low(PIN_A0);
   set_pwm2_duty(0);
   output_low(PIN_A1);
   output_low(PIN_A2);
   output_low(PIN_A3);
}

void main()
{
     enable_interrupts(global);
     enable_interrupts(int_rda);
     printf("Booting...");
     delay_ms(50);
      lcd_init();
      delay_ms(50);
      lcd_putc("\fHello World\n");
      lcd_putc("Line Number 2");
while(1)
  {
     printf(" Please Select a fan position(1 - 4): ");
     new = false;
     do
     {
        if (c != ' ') 
        {
         if(c == '1') pos = 1;
         if(c == '2') pos = 2;
         if(c == '3') pos = 3;
         if(c == '4') pos = 4;
         currentpos = pos - currentpos;
         if (currentpos < 0)
         {
            stepper_motor_r(12);
            printf("Step Back ");
            c = ' ';
         }else
         if (currentpos > 0)
         {
            stepper_motor_f(14);
            printf("Step Forward ");
            c = ' ';
         }
        }
      }while(pos == -1);
     printf(" Please Select a fan direction(r/f): ");
     do
     {
         if(c == 'r') d = 'r';
         if(c == 'f') d = 'f';
     }while(d == ' ');
     printf(" Please Select a fan speed(1 - 4): ");
     do{
            if(c == '1') speed = 400;
            if(c == '2') speed = 250;
            if(c == '3') speed = 180;
            if(c == '4') speed = 128;
     }while(speed == -1);
     if (d == 'r')
     {
         DC_motor_r();
         printf("DCr ");
     }else
      if (d == 'f')
     {
         DC_motor_f();
         printf("DCf ");
     }
     d = ' ';
     c = ' ';
     pos = -1;
     speed = -1;
  }
}



I have also tested the LCD with a basic program and i get the same result.
Ttelmah



Joined: 11 Mar 2010
Posts: 19542

View user's profile Send private message

PostPosted: Sat Sep 11, 2010 4:18 am     Reply with quote

Are you sure your serial receive line is pulled high at the PIC?.
Problem is that in the ISR for the serial, you output a minimum of 3 characters, and up to eleven characters. If the line is not pulled high, you will get garbage characters received, and this will then hang the UART (you have time to send just _one_ character in the ISR without this happening....). Add 'ERRORS' to your RS232 declaration to avoid the hang, and re-design the code so it won't happen....
Realistically, start your debugging without most of the code. Just use a routine to send some simple text to the LCD, and get this going _before_ trying to build your whole program. This is a 'key' parts to software development - get individual parts working first...
Check the LCD connections again, looking particularly for things like shorts between the connections...

Best Wishes
MikeP



Joined: 07 Sep 2003
Posts: 49

View user's profile Send private message

PostPosted: Sat Sep 11, 2010 5:34 am     Reply with quote

I am guessing you really want to use the built in clock change the following line to this.


Code:

#fuses INTRC_IO, NOWDT, BROWNOUT, PUT, NOLVP
William



Joined: 11 Sep 2010
Posts: 8

View user's profile Send private message

PostPosted: Sun Sep 12, 2010 1:39 am     Reply with quote

Thanks for the advice. I'm looking into those problems. As for the LCD here is the code I'm using at the moment but its still not working. I have a Contrast voltage of 0.4 all the pins are right. I even re-soldered them.

Test code:
Code:

#include <16F887.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)

#include "flex_lcd.c"
   
//==========================
void main()
{
lcd_init();  // Always call this first.

lcd_putc("\fHello World\n");
lcd_putc("Line Number 2");

while(1);
}

Here are the datasheets for the pic and the LCD. I don't know what I'm doing wrong.

LCD: http://uk.farnell.com/everbouquet/mc1602c-syr/lcd-module-alphanumeric-2x16-stn/dp/1220424

Pic: http://ww1.microchip.com/downloads/en/DeviceDoc/41291E.pdf[/code]
Ttelmah



Joined: 11 Mar 2010
Posts: 19542

View user's profile Send private message

PostPosted: Sun Sep 12, 2010 7:20 am     Reply with quote

So, you have got a 4MHz crystal connected to the PIC (with load capacitors)?.
If not, this won't work.

Best Wishes
William



Joined: 11 Sep 2010
Posts: 8

View user's profile Send private message

PostPosted: Sun Sep 12, 2010 12:49 pm     Reply with quote

No I don't have one connected, is that the "XT" in the fuses list? I'm really new to a lot of this stuff, sorry.
Ttelmah



Joined: 11 Mar 2010
Posts: 19542

View user's profile Send private message

PostPosted: Sun Sep 12, 2010 2:14 pm     Reply with quote

Exactly.
You had the internal oscillator selected, and the external crystal (which can result in a potentially impossible setup...), then removed the INTRC_IO fise (which says use the internal oscillator, and assign the external pins for IO), and have left the 'XT' fuse (which says I have an external crystal connected, not faster than 4MHz). With this (and 4MHz selected for the clock) you need a 4MHz crystal on the oscillator pins, with it's correct load capacitors.
If you haven't got a crystal, change your fuses to:

fuses INTRC_IO, NOWDT, BROWNOUT, PUT, NOLVP

Best Wishes
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