LCD2004 Sainsmart e PIC16F1829

  • giacomino
  • Autore della discussione
  • Nuovo Utente
  • Nuovo Utente
Di più
8 Anni 3 Settimane fa #1 da giacomino
LCD2004 Sainsmart e PIC16F1829 è stato creato da giacomino
Buonasera a tutti e grazie in anticipo per il supporto.

Sono nuovo del forum e della programmazione di controllori, sto utilizzando il PIC in oggetto alloggiato sulla board inclusa nello starterkit pick3. Ora per mia disgrazia mi sono fatto prestare il display LCD in oggetto, è un display 20x4 (piuttosto famoso tra gli utenti arduino a quanto pare, che monta un controllore pcf8574t). Ha 4 pin, VDD, GND, SDA, SCL e sto cercando di comunicare con tale perifierica per mezzo del protocollo I2C.

Ora ho letto il mitico libro xc8 step by step più la guida al suddetto protocollo ed ho implementato la comunicazione I2C nel modo seguente:
Code:
#include <xc.h> #include <htc.h> #include <pic16lf1829.h> #include <stdio.h> #define _XTAL_FREQ 500000 #define I2C_SPEED 100000 // bps #define SDA_DIR TRISBbits.TRISB4 // Data pin direction #define SCK_DIR TRISBbits.TRISB6 // Clock pin direction #define PULL_UPS void i2c_init(); void i2c_start(); void i2c_restart(); void i2c_stop(); void i2c_waitIDLE(); void i2c_sendACK(); void i2c_sendNACK(); unsigned char i2c_sendByte(unsigned char data); void main(void) { OSCCON = 0b00111000; i2c_init(); i2c_start(); i2c_waitIDLE(); i2c_sendByte(0b1001110); // 1) sarebbe 0x27 più 0 finale che indica che voglio inviare dati alla periferica ...... i2c_waitIDLE(); i2c_stop(); } void i2c_init(void) { #ifdef PULL_UPS WPUB4 = 1; WPUB6 = 1; nWPUEN = 0; //enable the global weak pull-up bit #endif SDA_DIR = 1; // Make SDA and SCK_DIR = 1; // SCK pins input SSPADD = ((_XTAL_FREQ/4)/I2C_SPEED) - 1; // BF RCinprocess_TXcomplete; UA dontupdate; SMP endsample_disable; P stopbit_notdetected; S startbit_notdetected; R_nW write_noTX; CKE tx_on_idle_to_active; D_nA lastbyte_address; SSP1STAT = 0x80; // SSPEN enabled; WCOL no_collision; SSPOV no_overflow; CKP lo_hold; SSPM I2CMaster_FOSC/4_SSPxADD; SSP1CON1 = 0x28; // ACKSTAT received; RCEN disabled; RSEN disabled; ACKEN disabled; ACKDT acknowledge; SEN disabled; GCEN disabled; PEN disabled; SSP1CON2 = 0x00; // BOEN disabled; AHEN disabled; SBCDE disabled; SDAHT 300nshold; ACKTIM ackseq; DHEN disabled; PCIE disabled; SCIE disabled; SSP1CON3 = 0x08; // SSPBUF 0x0; SSP1BUF = 0x00; // SSPMSK 0x0; SSP1MSK = 0x00; } void i2c_start() { SSP1CON2bits.SEN = 1; while(SSP1CON2bits.SEN); } void i2c_restart() { SSP1CON2bits.RSEN = 1; while(SSP1CON2bits.RSEN); } void i2c_stop() { SSP1CON2bits.PEN = 1; while(SSP1CON2bits.PEN); } void i2c_waitIDLE() { while( SSP1STATbits.R_nW | SSP1CON2bits.SEN | SSP1CON2bits.RSEN | SSP1CON2bits.PEN | SSP1CON2bits.RCEN | SSP1CON2bits.ACKEN ) { continue; } } void i2c_sendACK() { SSP1CON2bits.ACKDT = 0; SSP1CON2bits.ACKEN = 1; } void i2c_sendNACK() { SSP1CON2bits.ACKDT = 1; SSP1CON2bits.ACKEN = 1; } unsigned char i2c_sendByte(unsigned char data) { SSP1BUF = data; i2c_waitIDLE(); return (unsigned char)(!SSP1CON2bits.ACKSTAT); }
Collegando il display alle porte RB4 (SDA1) e RB6 (SCL1) e i restanti 2 pin a Vdd e Gnd il display si illumina ma nonostante tenti di inviare ulteriori bit alla periferica dopo l'istruzione del punto 1) non appare mai niente.. Ho scaricato anche il datasheet di tale display ma francamente non è chiarissimo. Vi sono vari codici per resettare il display retroilluminarlo ecc.. (che ho prontamente e invano inoltrato) ma niente.

Qualcuno può darmi qualche suggerimento?
Grazie mille

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi