[Beginner]I2C LCD

[Beginner]I2C LCD

Postby Entropy » Wed Sep 09, 2015 6:54 pm

Knowing nothing, I recently bought an LCD who turn out it use I2C for comunication, this is the datasheet: I2C LCD
The pic I'm using is 18F2550

First I need someone to confirm or explain me this:
18F2550
- pins (21)SDA and (22)SCK need to be pull-up or not? on page 214 from pic manual: Selection of any I2C mode with the SSPEN bit set forces the SCL and SDA pins to be open-drain, provided these pins are programmed as inputs by setting the appropriate TRISC or TRISD bits. To ensure proper operation of the module, pull-up resistors must be provided externally to the SCL and SDA pins.
For me something is wrong here, what TRISC and TRISD have anything to do with i2c? because I see SDA and SCL belong to port B

- (page 211) SSPM3:SSPM0:1000 = I2C Master mode, clock = FOSC/(4 * (SSPADD + 1)) This.. I dont even know. I believed that SSPADD is holding the slave address. At page 230 I2C Master mode, the Baud Rate Generator (BRG) reload value is placed in the lower seven bits of theSSPADD register. So from bellow 0111110... my clock will be 20000000/(4*(62+1))= ~79365? :shock: What about this 400 kHz? how cand I reach that?

- I2C LCD (page 13): Only one 7-bit slave addresses (0111110) is reserved for the ST7032. The R/W is assigned to 0 for Write only., how cand I transmit only 7 bits? should be 0b00111110?
Entropy
 
Posts: 24
Joined: Fri Sep 04, 2015 7:04 am
Location: Timisoara, Romania

Re: [Beginner]I2C LCD

Postby jtemples » Wed Sep 09, 2015 9:10 pm

what TRISC and TRISD have anything to do with i2c?

Ignore it, it's a cut-and-paste error. I2C is on PORTC on most 8-bit PICs.

I believed that SSPADD is holding the slave address.

It does in slave mode. In master mode, it's the clock divider.

What about this 400 kHz? how cand I reach that?

Choose a value for SSPADD that gives you 400000.

Only one 7-bit slave addresses (0111110) is reserved for the ST7032. The R/W is assigned to 0 for Write only., how cand I transmit only 7 bits? should be 0b00111110

You don't transmit 7 bits. The address is 7 bits, and you must also include the R/W bit at bit 0. So you will load 01111100 when transmitting the address byte.
jtemples
Verified identity
 
Posts: 195
Joined: Sun May 25, 2014 2:23 am
Location: The 805
PIC experience: Professional 5+ years with MCHP products

Re: [Beginner]I2C LCD

Postby AussieSusan » Thu Sep 10, 2015 3:37 am

As for whether the lines need a pull up or not (regardless of documentation error) that is a standard part of I2C. A line driver can switch between devices and to be able to detect things such as clock stretching, the "driver" also needs to detect what the receiver is doing. The driver is typically "open collector" to allow this to occur and therefore there needs to be a pull-up on the line somewhere.
Susan
AussieSusan
Verified identity
 
Posts: 173
Joined: Mon Jun 16, 2014 4:45 am
PIC experience: Experienced Hobbyist

Re: [Beginner]I2C LCD

Postby Entropy » Thu Sep 10, 2015 5:51 am

one more thing, TRISBbits.RB0/RB1 is input or output? because since I made this post I watch alot of youtube videos and still get conflicting info. Not to mention on youtube everyone and their mother use everything except MPLAB x8, but that is another story
Entropy
 
Posts: 24
Joined: Fri Sep 04, 2015 7:04 am
Location: Timisoara, Romania

Re: [Beginner]I2C LCD

Postby jtemples » Thu Sep 10, 2015 6:10 am

What you quoted above from the data sheet is correct.
jtemples
Verified identity
 
Posts: 195
Joined: Sun May 25, 2014 2:23 am
Location: The 805
PIC experience: Professional 5+ years with MCHP products

Re: [Beginner]I2C LCD

Postby Entropy » Thu Sep 10, 2015 6:29 am

jtemples wrote:What you quoted above from the data sheet is correct.

thank you
Entropy
 
Posts: 24
Joined: Fri Sep 04, 2015 7:04 am
Location: Timisoara, Romania

Re: [Beginner]I2C LCD

Postby drh » Thu Sep 10, 2015 2:25 pm

User avatar
drh
Verified identity
 
Posts: 61
Joined: Tue May 27, 2014 3:31 pm
Location: Hemet, Calif.
PIC experience: Professional 5+ years with MCHP products

Re: [Beginner]I2C LCD

Postby Entropy » Thu Sep 10, 2015 6:15 pm

jtemples wrote:[Choose a value for SSPADD that gives you 400000.

SSPADD support float? for a XTAL of 20MHz, SSPADD should be 11.5 for the exact match
in general if I dont have the exact number, the clock is better to go under or over 400kHz? Atm SSPADD=12; //400Khz= 20000000/(4 * (SSPADD + 1))= 384615.3846153846
so far this is my progress http://i.imgur.com/4g6buel.jpg I guess what I see there is i2c is initialized over and over again
Last edited by Entropy on Thu Sep 10, 2015 6:18 pm, edited 1 time in total.
Entropy
 
Posts: 24
Joined: Fri Sep 04, 2015 7:04 am
Location: Timisoara, Romania

Re: [Beginner]I2C LCD

Postby jtemples » Thu Sep 10, 2015 6:17 pm

If your I2C device is specified for a particular frequency, you don't want to go over that frequency.
jtemples
Verified identity
 
Posts: 195
Joined: Sun May 25, 2014 2:23 am
Location: The 805
PIC experience: Professional 5+ years with MCHP products

Re: [Beginner]I2C LCD

Postby Entropy » Sat Sep 26, 2015 11:36 am

most buzy for this 3 weeks but this days I got around to program this a bit. My pic I2C comunicate with LCD http://i.imgur.com/92WmEur.jpg

but I have a problem, I dont understand this LCD what do he want from me. From manual at page 10, lets take DISPLAY ON/OFF for example:
MOV I2C_DATA,#0CH ; Display ON/OFF
LCALL WRITE_CODE
At page 10 this code dont tell much.

But also at page 24 is a bit more data, DISPLAY could be 0b00001111 with all the ON/OFF seting, cursor, blinking. Same goes for every comand there at page 10. My problem is I dont understand if for every command I need to give him #00H first? (as possibile says in page 10) or just one #00H at begining. The order of this commands is good?

Also I dont get how to display text after I'm done with setting of the LCD. My Progress so far if I look verry patiently at the LCD some times I see the cursor blink for a split second. This is the code:

Code: Select all
#include <xc.h>
#include <stdlib.h>
#include <stdio.h>
#include <i2c.h>

#pragma config PLLDIV = 1       // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
#pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
#pragma config USBDIV = 1       // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator (HS))
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
#pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOR = ON         // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3         // Brown-out Reset Voltage bits (Minimum setting)
#pragma config VREGEN = OFF     // USB Voltage Regulator Enable bit (USB voltage regulator disabled)
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
#pragma config CCP2MX = ON      // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = ON      // PORTB A/D Enable bit (PORTB<4:0> pins are configured as analog input channels on Reset)
#pragma config LPT1OSC = OFF    // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM is not code-protected)
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM is not write-protected)
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)

#define _XTAL_FREQ 20000000
unsigned char error;

void init_I2C(){
    SSPSTAT=0b10000000;
    SSPCON1=0b00101000;
    SSPCON2bits.GCEN=0;
    SSPADD=49;    //100Khz= 20000000/(4 * (SSPADD + 1))
}
void main(void){
   
    ADCON1=0b00001111;
    TRISBbits.RB0=1;
    TRISBbits.RB1=1;
    init_I2C();
    while (1){
        SSPCON2bits.SEN=1;
        while (SSPCON2bits.SEN); //wait for start seq to finish
        SSPBUF=0b01111100; //device address + write
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x00;
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x38;                        //38H
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x00;
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x39;                        //39H
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x00;
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x14;                        //14H
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
               
        SSPBUF=0x00;
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x79;                        //79H
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
         
        SSPBUF=0x00;
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x50;                        //50H
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x00;
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x6C;                        //6cH
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0x00;
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
        SSPBUF=0b00001111;                        //DISPLAY ON
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
         
        SSPBUF=0x00;
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
         
        SSPBUF=0b00000001;                        //CLEAR DISPLAY
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
         
        SSPBUF=0x00;
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
         
        SSPBUF=0b00000010;                        //RETURN HOME
        if (SSPCON1bits.WCOL) goto stop;
        while(SSPSTATbits.BF); //wait until write cycle is complete
        while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_nW)); //wait MSSP idle
        while(!PIR1bits.SSPIF);
        if(SSPCON2bits.ACKSTAT) goto stop;
       
             
        stop:
        SSPCON2bits.PEN = 1;//initiate stop sequence
        while (SSPCON2bits.PEN);
        __delay_ms(30);__delay_ms(30);__delay_ms(30);__delay_ms(30);
       
     }
}   
   
Entropy
 
Posts: 24
Joined: Fri Sep 04, 2015 7:04 am
Location: Timisoara, Romania


Return to Graphics and LCD

Who is online

Users browsing this forum: No registered users and 6 guests