Progetti

   

Tutorial

   

Servizi

   

Sponsor  

   
Benvenuto, Ospite
Nome utente: Password: Ricordami
  • Pagina:
  • 1
  • 2

ARGOMENTO: Modifica Libreria Laurtec GLCD

Modifica Libreria Laurtec GLCD per PIC16F877A e GLCD 192x64 6 Anni 8 Mesi fa #1

  • Video Lab
  • Avatar di Video Lab
  • Offline
  • Expert Boarder
  • Volere è Potere
  • Messaggi: 85
  • Ringraziamenti ricevuti 12
  • Karma: 2
Come da titolo apro questo post per comunicare che ho modificato con successo la libreria GLCD di Mauro, per adattarla ad un display 192x64 della Winstar WG19264E-YYH-V#N, oltre che a farla funzionare su un PIC16F877A.

File allegato:

Nome del file: LibreriaGL...2x64.rar
Dimensione del file:426 KB


Per compilare il tutto ho usato Mplab X e come compilatore HI-TECH 9.82, che comunque per quanto riguarda il PIC16F877A risulta identico al nuovo compilatore XC, io utilizzo HI-TECH perchè ho la versione completa e quindi supporta l'ottimizzazione del codice, ed è tanta roba, è proprio vero che dalla versione completa alla versione Lite il codice lievita di 3 volte, testato.

Ovviamente ho dovuto modificare tutte le direttive che fanno riferimento a XC e al C18 nei due file di Mauro.
Ho modificato i vari #define
#ifndef GLCD_K0108B_H
#define GLCD_K0108B_H
 
 
#include <htc.h>
#include <stdlib.h>
#include <delay.h>
#define NOP_DELAY _delay(3)
 

Il ritardo _delay è definito nella libreria htc.h come per quella xc.h allo stesso modo.
Nel file h ho dovuto modificare la definizione dei pin
//**************************************************
// GLCD pin constants 
//**************************************************
 
  //  #define GLCD_DATA_WRITE  PORTD  il PIC16F877A non ha il registro LAT, quindi va usato solo il registro PORT
    #define GLCD_DATA                             PORTD
    #define GLCD_DATA_DIRECTION      TRISD
 
    #define GLCD_D_I      RB0
    #define GLCD_R_W   RB1
    #define GLCD_E         RB2
    #define GLCD_CS1    RE0
    #define GLCD_CS2    RE1
    #define GLCD_CS3    RE2
    #define GLCD_RST    RC2
    #define GLCD_LED    RC4

Ho dovuto definire le nuove "misure" :
//**************************************************
// GLCD Controller constants
//**************************************************
 
#define INPUT 0xFF
#define OUTPUT 0x00
 
#define NUMBER_OF_PAGES 8
#define X_RESOLUTION 192
#define Y_RESOLUTION 64
 
#define CONTROLLER_MAX_X 128
#define CONTROLLER_MID_X 64

Il display che usato io, ha i pin Chip Select che funzionano negati, ossia attivi bassi, per ovviare a questo ho aggiunto una nuova macro solo per i CS
//**************************************************
// General Purpose constants 
//**************************************************
 
#define TURN_ON_LED_GLCD    0b00000001
#define TURN_OFF_LED_GLCD   0b00000000
 
#define TURN_ON_DISPLAY     0b00000001
#define TURN_OFF_DISPLAY    0b00000000
 
#define HIGH_GLCD           0b00000001
#define LOW_GLCD            0b00000000
#define CS_ON                 0  // Nuove macro solo per pin CHIP SELECT
#define CS_OFF               1  // Nuove macro solo per pin CHIP SELECT
#define RESET_L             0  // Nuove macro solo per pin reset
#define RESET_H             1  // Nuove macro solo per pin reset
#define EN_L                    0
#define EN_H                   1
 
#define ENABLE_GLCD         0b00000001
#define DISABLE_GLCD        0b00000000
 
#define ENABLE_RESET_GLCD   0b00000000
#define DISABLE_RESET_GLCD  0b00000001
 
#define GLCD_CHIP_SELECT_1 0x00
#define GLCD_CHIP_SELECT_2 0x01
 
#define FILLING_WHITE 0x00
#define FILLING_BLACK 0xFF
 
 
 
//***************************************************

Ho effettuato queste modifiche per poter rendere modificabile in modo più rapido il codice per adattarlo a display diversi. Se si utilizza un display con CHIP SELECT attivo alto basta scambiare di valori CS_ON =1 e CS_OFF=0

Un altro problema che ho incontrato il pin di RESET.
Probabilmente il display utilizzato da me ha un carico capacitivo molto alto, quindi sullo spunto il pic non è in grado di pilotarlo in modo adeguato, mandandolo in protezione.
In teoria utilizzando una resistenza in serie da 100ohm si dovrebbe risolvere, io per semplicità ho utilizzato un transistor NPN come buffer tra il PIC e il display.

In fondo al file h ci sono 2 loghi, quello attivo è quello della foto


Quello commentato è il logo LAURTEC modificato per il display 192x64.
In allegato allo zip c'è anche il datasheet del display.
Il controller usato è NT7108C che comunque è identico al KS0108B, difatti timing delle varie fasi di lettura e scrittura sul display sono identiche.

Ovviamente ho dovuto modificare tutte le funzioni primarie dove avvengono le funzioni di scrittura e lettura visto che ora c'è una porzione di schermo in più da controllare.
Di seguito una di esse (ad ogni modo sono tutte quelle dove sono presenti i pin CS)
/*********************************************
//             clear_GLCD
//*********************************************
void clear_GLCD (unsigned char filling_color) {
 
	unsigned char page = 0;
	unsigned char address = 0;
 
	GLCD_CS1 =CS_ON;
	GLCD_CS2 =CS_OFF;
	GLCD_CS3 =CS_OFF;
 
	set_address_GLCD (address);
 
	for (page = 0; page < NUMBER_OF_PAGES; page++) {
		set_page_GLCD (page);
		for (address = 0; address < Y_RESOLUTION; address++) {
 
		//	wait_busy_status_GLCD ();
			write_data_GLCD (filling_color);
		//	wait_busy_status_GLCD ();
		}
	}
 
	GLCD_CS1 = CS_OFF;
	GLCD_CS2 = CS_ON;
	GLCD_CS3 = CS_OFF;
 
	address = 0;
	set_address_GLCD (address);
 
	for (page = 0; page < NUMBER_OF_PAGES; page++) {
		set_page_GLCD (page);
 
		for (address = 0; address < Y_RESOLUTION; address++) {
		//	wait_busy_status_GLCD ();
			write_data_GLCD (filling_color);
		//	wait_busy_status_GLCD ();
		}
	}
 
	GLCD_CS1 = CS_OFF;
	GLCD_CS2 = CS_OFF;
	GLCD_CS3 = CS_ON;
 
	address=0;
	set_address_GLCD (address);
 
	for (page = 0; page < NUMBER_OF_PAGES; page++) {
		set_page_GLCD (page);
		for (address = 0; address < Y_RESOLUTION; address++) {
 
		//	wait_busy_status_GLCD ();
			write_data_GLCD (filling_color);
		//	wait_busy_status_GLCD ();
		}
	}
 
	GLCD_CS1 = CS_OFF;
	GLCD_CS2 = CS_OFF;
	GLCD_CS3 = CS_OFF;
 
}

Resoconto finito, ringrazio Mauro per la sua libreria, e spero che questa modifica possa tornare utile ad altri.
Volere è Potere
Ultima modifica: 6 Anni 8 Mesi fa da Video Lab.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Ringraziano per il messaggio: alfa75, toni

Modifica Libreria Laurtec GLCD per PIC16F877A e GLCD 192x64 6 Anni 8 Mesi fa #2

  • alfa75
  • Avatar di alfa75
  • Offline
  • Platinum Boarder
  • Messaggi: 527
  • Ringraziamenti ricevuti 86
  • Karma: 7
Ottimo lavoro!
prossimamente la proverò per un mio progetto
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Modifica Libreria Laurtec GLCD per PIC16F877A e GLCD 192x64 6 Anni 6 Mesi fa #3

  • Video Lab
  • Avatar di Video Lab
  • Offline
  • Expert Boarder
  • Volere è Potere
  • Messaggi: 85
  • Ringraziamenti ricevuti 12
  • Karma: 2
Aggiorno il post, in quanto ho adattato la libreria per utilizzarla con il ChipKitUno32 equipaggiato con PIC32MX320F128H.
Il Display utilizzato è una variante di quello che ho usato con il PIC16F877A, ossia WG19264A-YYH-V#N000 che si differenzia per la tensione di alimentazione che è a 3.3V, mentre l'altro era a 5V.
Questo è dovuto al fatto che il PIC32MX è a 3.3V, anche se ha dei pin 5V tollerant, però poi ci sarebbero stati problemi con i livelli dei segnali di pilotaggio, altra soluzione utilizzare un ic adattatore di livello, ma fortunatamente avevo già entrambi i display.
Altra differenza i comandi CS1, CS2 e CS3 sono attivi alti, mentre in quello precedente viceversa.
Spero di aver fatto cosa gradita.
p.s. Su questo pic le impostazioni dei Registri TRIS LAT e PORT sono fondamentali, anche perchè il pic configurato con le mie impostazioni ha come frequenza di Clock 80 Mhz.
Per sbaglio inizialmente ho invertito l'utilizzo del registro LAT e PORT.... non vi dico le testate nel muro per capire come mai in lettura dalla linea dati non mi rilevasse la status del display...

File allegato:

Nome del file: ChipKitUno.X.rar
Dimensione del file:390 KB


Sono passato al PIC32MX perchè avevo bisogno di più spazio per il mio progetto e 2 usart native, e poi perchè nel cassetto c'era già il ChipKitUNO 32.
Ho provato anche con l'Orbit16 di Gianni, ma purtroppo non c'erano abbastanza pin per quello che devo fare io (4 tasti, 2 usart e la gestione del GLCD).
Ho provato ad interfacciare la linea dati del GLCD con il PCF8574A, ma non funziona per problematiche di Timing, ossia la scrittura e la lettura della linea dati va fatta entro un certo tempo, utilizzndo il PCF8574A si perde molto tempo in lettura e scrittura.
Saluti

Ho utilizzato Mplab IDE X e XC32
Volere è Potere
Ultima modifica: 6 Anni 6 Mesi fa da Video Lab.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Modifica Libreria Laurtec GLCD per PIC16F877A e GLCD 192x64 6 Anni 6 Mesi fa #4

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4677
  • Ringraziamenti ricevuti 561
  • Karma: 52
ottimo,

grazie per la condivisione.

Ma mi state lasciando solo con i PIC18! :)

Saluti,

Mauro
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Modifica Libreria Laurtec GLCD per PIC16F877A e GLCD 192x64 6 Anni 6 Mesi fa #5

  • Video Lab
  • Avatar di Video Lab
  • Offline
  • Expert Boarder
  • Volere è Potere
  • Messaggi: 85
  • Ringraziamenti ricevuti 12
  • Karma: 2
Grazie a te Mauro, che hai fatto il più del lavoro, senza la tua libreria partire da zero sarebbe stato decisamente più lungo.
Ora sto studiando delle modifiche per poter stampare in qualsiasi posizione dello schermo delle immagini di dimensioni diverse.
Credo che le tratterò come dei caratteri più "grandi" e modificherò la funzione di stampa char aggiungendo le dimensioni del logo.
Volere è Potere
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
  • Pagina:
  • 1
  • 2
Moderatori: Mauro Laurenti
Powered by Forum Kunena
   
© LaurTec 2006-2015