vezzo Inserito: 9 febbraio 2010 Segnala Share Inserito: 9 febbraio 2010 (modificato) Ciao a Tutti,vi ringrazio anche solo per aver letto il mio post, veniamo al dunque vorrei utilizzare il display della mia scheda microchip picdem 2 plus, dopo varie ricerche e prove con il tester ho individuato i pin dati db4.....db7 ed i comandi rs rw e visto che il datasheet era errato....ho steso un file per gestire il mio display, utilizzo un pic 16f877a con il port d, ho esaminato il tutto + e + volte ma non riesco a capire perchè non funziona....allego il codice qualcuno mi può aiutare???Se ho tralasciato qualche info scusatemi...ma chiedetemi pure tutto quello che vi serve grazie #include "Lcd_dichiarazioni.h" void LcdInit() { LCD_PWR_DIR = 0; //VCC-VDD Display LCD LCD_RS = 0; //pulisco i port LCD_E = 0; LCD_RW = 0; LCD_RS_DIR = 0; //puntano ai tris del port exp TRISD.0 LCD_E_DIR = 0; LCD_RW_DIR = 0; LCD_PWR = 1; //accendo il display Delay_ms(15); //15ms ScriviHbit(0b.0011.0000,1); //#1 Send control sequence Delay_ms(4); //4ms ScriviHbit(0b.0011.0000,1); //#2 Send control sequence Delay_us(100); //100us ScriviHbit(0b.0011.0000,1); //#3 Send control sequence Delay_us(100); //100us ScriviHbit(0b.0011.0000,1); //#4 set 4-bit LcdPronto(); //LCD Pronto??? ScriviByte(0b.0010.1000,1); //#5 Function Set ScriviByte(0b.0000.1101,1); //#6 Display = ON ScriviByte(0b.0000.0001,1); //#7 Display Clear ScriviByte(0b.0000.0110,1); //#8 Entry Mode ScriviByte(0b.1000.0000,1); //DDRAM addresss 0000 // ScriviByte(0b.0000.0010,1); //return home } void ScriviHbit(char byte, bit RS) //Scrittura al display LCD del H-BYTE { //Tipo di dato??? if (RS) { LCD_RS = 1; //Dati LCD_RS=1 } else { LCD_RS = 0; //Registro istruzioni, address counter LCD_RS=0 } LCD_RW = 0; //PIC ---> LCD LCD_D4_DIR = 0; //SETTO I PORT COME OUTPUT LCD_D5_DIR = 0; LCD_D6_DIR = 0; LCD_D7_DIR = 0; nop(); nop(); LCD_E = 1; //Clock per inizio scrittura LCD_D7 = byte.7; //Passaggio H-BYTE LCD_D6 = byte.6; LCD_D5 = byte.5; LCD_D4 = byte.4; nop(); nop(); LCD_E = 0; //Clock per fine scrittura } void ScriviByte(char byte,bit RS) { static char SwapByte; LcdPronto(); //LCD PRONTO?? ScriviHbit(byte, RS); //SCRIVO H-BIT SwapByte = (byte << 4); //SWAP DEL BYTE DA SCRIVERE << 4 ScriviHbit(SwapByte, RS); //SCRIVO L-BIT } void LcdPronto() //Controllo disponibilità LCD { static char ReadByte; ReadByte = LcdLeggi(1); if (ReadByte.7) { return; } else { LcdPronto(); } } char LcdLeggi(char RS) //Lettura dal display LCD { char DatiLetti; LCD_D4_DIR = 1; //Setto i port come input LCD_D5_DIR = 1; LCD_D6_DIR = 1; LCD_D7_DIR = 1; //Tipo di dato??? if (RS) { LCD_RS = 1; //Dati LCD_RS=1 } else { LCD_RS = 0; //Registro istruzioni, address counter LCD_RS=0 } LCD_RW = 1; //PIC <-- LCD nop(); nop(); LCD_E = 1; //Clock inizio lettura H-BYTE nop(); nop(); nop(); nop(); DatiLetti.7 = LCD_D7; //Lettura H-BYTE DatiLetti.6 = LCD_D6; DatiLetti.5 = LCD_D5; DatiLetti.4 = LCD_D4; LCD_E = 0; //Clock fine lettura H-BYTE nop(); nop(); nop(); nop(); nop(); nop(); nop(); nop(); LCD_E = 1; //Clock inizio lettura L-BYTE nop(); nop(); DatiLetti.3 = LCD_D7; //Lettura L-BYTE DatiLetti.2 = LCD_D6; DatiLetti.1 = LCD_D5; DatiLetti.0 = LCD_D4; LCD_E = 0; //Clock fine lettura L-BYTE return DatiLetti; } void LcdGoto(char x, char y) { static char xy_addr; switch(x) { case 1: //Prima Linea xy_addr = 0x80 | y; break; case 2: //Seconda Linea xy_addr = 0xC0 | y; break; } ScriviByte(xy_addr,0); } void Delay_us(unsigned int us) { static unsigned int temp1; us = ((us - 18)/8); for (temp1=0; temp1<us; temp1++) { nop(); } } void Delay_ms(unsigned int ms) { static unsigned int temp,tempus; for (temp=0; temp<ms; temp++) { for (tempus=0; tempus<99; tempus++) { nop2(); nop(); } } } Modificato: 9 febbraio 2010 da vezzo Link al commento Condividi su altri siti More sharing options...
rfabri Inserita: 9 febbraio 2010 Segnala Share Inserita: 9 febbraio 2010 Fai attenzione che vanno solitamente usati i pin D4 (11),D5 (12),D6 (13),D7 (14) per i dati, mentre per comunicare con il display devi collegare al tuo pic solo i pin RS (4) e EN (6),mentre R/W (5) va sempre a massa,vedrai che poi funziona,BYE. Link al commento Condividi su altri siti More sharing options...
vezzo Inserita: 9 febbraio 2010 Autore Segnala Share Inserita: 9 febbraio 2010 rfabri+9/02/2010, 00:51--> (rfabri @ 9/02/2010, 00:51) Effettivamente è propio quello che ho fatto, con la piccola differenza che ho gestito anche il pin RW, basso in scrittura e alto in lettura , i pin dei dati sono corretti dal d4 al d7 rispettivamente portd.0 al portd.3.....non sò più dove sbattere la testa Grazie Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 9 febbraio 2010 Segnala Share Inserita: 9 febbraio 2010 Che "C" usi? Se mi ricordo, in giornata, ti allego il SW ("C" CSC) che uso di solito e che non da problemi.Il "trucco" sta tutto nei tempi di inizializzazione . Link al commento Condividi su altri siti More sharing options...
vezzo Inserita: 9 febbraio 2010 Autore Segnala Share Inserita: 9 febbraio 2010 Livio Orsini+9/02/2010, 09:32--> (Livio Orsini @ 9/02/2010, 09:32) Eccomi....all'ora il compitalore che utilizzo è il CC5X, ho letto qualche cosa in merito alle temporizzazioni, io ho seguito quelle del datasheet dell' HD44780U, per verificarle in Mplab le ho testate con i breakpoint e lo stop watch...è un'azione corretta?? Grazie Grazie Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 9 febbraio 2010 Segnala Share Inserita: 9 febbraio 2010 Questo programma è una prova per display in modalità 4 bit. Legge un canale analogico e lo visualizza sul dispay. E' auto documentato con i commenti abbondanti. Ha sempre funzionato. Link al commento Condividi su altri siti More sharing options...
vezzo Inserita: 10 febbraio 2010 Autore Segnala Share Inserita: 10 febbraio 2010 Grazie mille!!Questa sera mi ci metto e provo subito; devo riuscire a fare funzionare anche il mio file oa mai è una questione di pricipio....questa sera vi faccio sapere.Grazie Grazie Link al commento Condividi su altri siti More sharing options...
vezzo Inserita: 12 febbraio 2010 Autore Segnala Share Inserita: 12 febbraio 2010 Ci sono!!Sono riuscito a sistemare il tutto, leggendo il codice di Livio (Grazie ) mi sono illuminato....ovvero nelle prime righe utilizzo una funzione chiamata ScriviHbit(byte,RS)dove i parametri passati sono il byte, e RS ovvero se a 1 dato se a 0 istruzione!!!Durante l'inizializzazione passavo tutti i parametri con RS alto!!!Mentre invece queste sono istruzioni, modificato quello tutto ok!!Ho anche aumentato di 1ms il primo delay ed anche il secondo, l'altro errore che ho trovato è sulla lettura del bd7 per LCD ready, anche qui la funzione LcdLeggi(RS), in questa funzione leggo i dati e li restituisco in un byte, l'unico parametro è l'RS!!! anche qui l'ho messo a 1, mentre doveva essere a 0.Nel primo caso mi ha fregato il copia incolla....è una brutta bestia il copia ed incolla...bisogna starci attenti!!!Grazie a tutti Posterò il codice corretto e con qualche altra aggiunta. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 12 febbraio 2010 Segnala Share Inserita: 12 febbraio 2010 Bene ci sei riuscito ed hai descritto la soluzione e gli inconvenienti, in perfetto accordo con lo spirito del forum. Link al commento Condividi su altri siti More sharing options...
vezzo Inserita: 16 febbraio 2010 Autore Segnala Share Inserita: 16 febbraio 2010 Rieccomi....è quasi tutto ok, ma (c'é sempre un ma) il busy flag mi sta vermente rompendo le scatole; accade questo:Supponiamo di passare la seguente stringa di caratteri "0123456789ABCDEF", dopo aver scritto i primi 8 ovvero fino al 7 il pic si pianta o meglio aspetta il busy flag che effettivamente è alto, se elimino il controllo del busy flag in scrittura....tutto ok scrive tutta la stringa non capisco prima è ok poi no?? per il resto il sw è apposto ho anche aggiunto una funzione per scriver una stringa, poi appena è ok lo posto...ma ora il BusyFlag!!!...ma è veramente necessario???Grazie Grazie Link al commento Condividi su altri siti More sharing options...
Nikiki Inserita: 16 febbraio 2010 Segnala Share Inserita: 16 febbraio 2010 il busy flag ti dovrebbe consentire di accedere al display alla massima velocità senza usare i delay. Se usi i delay in modo corretto non c'è bisogno che testi il BF.Ma sei sicuro di operare bene per testare il BF? Qual'è la funzione incaricata di questo, LcdPronto()?Se non ricordo male il Byte Flag si testa con RS=0 e R/W=1, tu invece chiami la funzione di lettura con RS=1... Controlla, forse l'ho interpretata male. Link al commento Condividi su altri siti More sharing options...
vezzo Inserita: 16 febbraio 2010 Autore Segnala Share Inserita: 16 febbraio 2010 (modificato) Nikiki+16/02/2010, 01:10--> (Nikiki @ 16/02/2010, 01:10)Ciao,hai interpretato benissimo, infatti mi sono dimentacto di dire nei post precedenti che ho coretto anche quell'errorino, nel sw dove ho ilproblema la lettura avviene gia con RS a 0 lo allego cosi puoi visionarlo.Grazi grazieScarica qui il file File Lcd_4bit.c Modificato: 16 febbraio 2010 da vezzo Link al commento Condividi su altri siti More sharing options...
fabmatt Inserita: 26 marzo 2010 Segnala Share Inserita: 26 marzo 2010 Buongiorno, ho iniziato da poco a programmare i pic, ci sto lavorando da giorni ma non riesco a far funzionare un semplice display a 2 righe. Conosco il visual basic, e quindi mi sto cercando di programmare con il picbasic. E' possibile avere qualche esempio per iniziare?Grazie. Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora