Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Libreria LCD PIC18fxxx

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Libreria LCD PIC18fxxx

Messaggioda Foto UtenteMarcRider » 8 set 2013, 16:12

Salve a tutti, sto cercando di scrivere una libreria per pilotare gli lcd alfanumerici.

Ho studiato un po quella che in dotazione della microchip, ma non mi ci sono soffermato troppo, il mio controller è diverso e poi un po per mio diletto, ho deciso di rifarmi una libreria da 0.

Prima ho fatto funzionare LCD, ed ora vorrei creare una libreria il più dinamica possibile.

Arriviamo al dunque:
Siccome per ora lo piloto a 8bit, più i 3bit di controllo, mi capita che non uso una sola porta.
ad esempio adesso ho così cunfigurato il PIC:
Codice: Seleziona tutto
#define D7 PORTCbits.RC7
#define D6 PORTCbits.RC6
#define D5 PORTCbits.RC5
#define D4 PORTCbits.RC4
#define D3 PORTCbits.RC3
#define D2 PORTBbits.RB4  // <---
#define D1 PORTCbits.RC1
#define D0 PORTCbits.RC0
#define bit4  1
#define bit8  0

// porte SW
#define E PORTBbits.RB1
#define RW PORTBbits.RB2
#define RS PORTBbits.RB3


ho pensato di fare una 'struct' sull'header così:

Codice: Seleziona tutto
struct PinPort
{
    char D7;
    char D6;
    char D5;
    char D4;
    char D3;
    char D2;
    char D1;
    char D0;
    char E;
    char RW;
    char RS;
};


poi leggendo la guida della casa, che consiglia di creare un file.c per ogni funzione , pensavo di richiamare la struttura, così:

Codice: Seleziona tutto
void Comando(char NumBit, char D7, char D6, char D5, char D4, char D3, char D2, char D1, char D0, PinPort StrutturaPorte)
{
    StrutturaPorte.RS = 0;     //poiché è un comando
    StrutturaPorte.RW = 0;     //siamo in scrittura
   
    //8bit
    if (NumBit == 0)
    {
        StrutturaPorte.D7 = D7;
        StrutturaPorte.D6 = D6;
        StrutturaPorte.D5 = D5;
        StrutturaPorte.D4 = D4;
        StrutturaPorte.D3 = D3;
        StrutturaPorte.D2 = D2;
        StrutturaPorte.D1 = D1;
        StrutturaPorte.D0 = D0;

        StrutturaPorte.E = 1;  //invio il comando di accensione del display
        Ritardo(1);
        StrutturaPorte.E = 0;  //Togle
    } // else bit 4 modalità, da finire...
   

}


ovviamente nel main.c prima di usare qualsiasi funzione devo inizializzare la struttura e poi usarla, passandola come argomento ad ogni funzione.

Sicuramente è una pessima idea, però se qualcuno ha un consiglio sul come fare...

Il mio obbiettivo è decidere all'inizio ogni porta per ogni comando e poi usare le funzioni in modo che eseguano i comandi direttamente.

Non so magari mi complico troppo la vita.
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

0
voti

[2] Re: Libreria LCD PIC18fxxx

Messaggioda Foto UtenteTardoFreak » 8 set 2013, 16:41

Puoi fartiun' idea leggendo QUESTO articolo
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[3] Re: Libreria LCD PIC18fxxx

Messaggioda Foto UtenteMarcRider » 8 set 2013, 17:08

Ora inizio ad avere decisamente un po di confusione.
Ho letto l'articolo che hai scritto, ora mi rimetterò a riscrivere la libreria da zero.
Però volevo chiederti, perché la casa scrive questo? http://microchip.wikidot.com/mplab:how-to-work-with-libraries
Ammeno che non ho capito male, qui proprio salta l'header e lo crea dopo per poter usare la libreria. Nel tuo articolo invece, direi che usi esclusivamente gli header, e un file.c dove inserire il codice "operativo".

Poi ho letto:
Codice: Seleziona tutto
//------------------------------------------------------------------------------
//  Impostazioni di default.
//  Nel caso i segnali non siano difiniti venegono impostati di default
//    D4 = RD0
//    D5 = RD1
//    D6 = RD2
//    D7 = RD3
//    RS = RE0
//    E  = RE1

#ifndef HD44780_D4
  #define HD44780_D4 LATDbits.LATD0
  #define HD44780_D4_DIR TRISDbits.TRISD0
#endif

#ifndef HD44780_D5
  #define HD44780_D5 LATDbits.LATD1
  #define HD44780_D5_DIR TRISDbits.TRISD1
#endif

#ifndef HD44780_D6
  #define HD44780_D6 LATDbits.LATD2
  #define HD44780_D6_DIR TRISDbits.TRISD2
#endif

#ifndef HD44780_D7
  #define HD44780_D7 LATDbits.LATD3
  #define HD44780_D7_DIR TRISDbits.TRISD3
#endif

#ifndef HD44780_RS
  #define HD44780_RS LATEbits.LATE0
  #define HD44780_RS_DIR TRISEbits.TRISE0
#endif

#ifndef HD44780_E
  #define HD44780_E LATEbits.LATE1
  #define HD44780_E_DIR TRISEbits.TRISE1
#endif

// Di default il numero di linee è impostato ad 1
#ifndef HD44780_LINES
  #define HD44780_LINES 1
#endif

#endif


Alcune volte il codice parla più delle parole stesse, e tu qui dichiari che quelle sono le porte di default nel caso che non vengano configurate dall'utilizzatore.
E se invece uno volesse impostarle e non usare quelle di default cosa scriverebbe nel codice? cioè come faccio a cambiarle senza ricompilare la libreria?
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

0
voti

[4] Re: Libreria LCD PIC18fxxx

Messaggioda Foto UtenteMarcRider » 8 set 2013, 17:10

mi compare proprio la possibilità di modificare ad esempio il parametro HD44780_D7?
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

0
voti

[5] Re: Libreria LCD PIC18fxxx

Messaggioda Foto UtenteMarcRider » 8 set 2013, 17:12

scusami, ci sono arrivato da solo dopo che ho scritto :)

Grazie, ora ho tutti gli strumenti che mi occorrono!
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

0
voti

[6] Re: Libreria LCD PIC18fxxx

Messaggioda Foto UtenteMarcRider » 9 set 2013, 17:32

Ho seguito l'articolo, ed ho scritto questo pezzo di codice:

Hardware.h
Codice: Seleziona tutto
...

#ifndef STLCD_D3
#define STLCD_D3 LATCbits.LATC3
#define STLCD_D3_DIR TRISCbits.TRISC3
#endif

#ifndef STLCD_D2
#define STLCD_D2 LATCbits.LATC2
#define STLCD_D2_DIR TRISCbits.TRISC2
#endif

#ifndef STLCD_D1
#define STLCD_D1 LATCbits.LATC1
#define STLCD_D1_DIR TRISCbits.TRISC1
#endif

...


dunque, ho compilato la libreria che ha quell'header con quelle impostazioni.
Ho copiato il file X.lib all'interno del mio progetto e i relativi Header.
Ora ho bisogno di cambiare la STLCD_D2

Prima ho sostituito sul file header copia hardware.h questo:

Codice: Seleziona tutto
#ifndef STLCD_D2
#define STLCD_D2 LATBbits.LATB4
#define STLCD_D2_DIR TRISBbits.TRISB4
#endif


Ho ricompilato, e facendo un debug, continua a modificare RC2 e non RB4

Poi ho scritto:

Codice: Seleziona tutto
void main(void) {

    TRISB = 00000000;
    PORTB = 00000000;
    TRISA = 00000000;
    PORTA = 00000000;
    TRISC = 00000000;
    PORTC = 00000000;

    STLCD_D2 = LATBbits.LATB4;
    STLCD_D2_DIR = TRISBbits.TRISB4;


Quindi sul main.c del progetto su cui sto lavorando che usa la libreria appena creata.

Dove sbaglio?
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

0
voti

[7] Re: Libreria LCD PIC18fxxx

Messaggioda Foto UtenteMarcRider » 9 set 2013, 18:14

Quindi ho dovuto specificarlo. Nella parte che interessa il module HD44780 non ho scritto niente perché ho tenuto la definizione di default delle linee di I/O. Nel caso avessi voluto, chessò, assegnare la linea RS al pin RB2 avrei dovuto scrivere

#define HD44780_RS LATBbits.LATB2
#define HD44780_RS_DIR TRISBbits.TRISB2
In tal caso tale simbolo sarebbe stato definito da me e quindi, invece di assumere il valore di default avrebbe mantenuto il valore assegnatogli da me in questo file.



Continuo a non capire. Questa è la prima prova che ho fatto sul main.c. Continua ad evitarmi questa definizione e va avanti con quella di default :(
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

0
voti

[8] Re: Libreria LCD PIC18fxxx

Messaggioda Foto UtenteMarcRider » 10 set 2013, 17:55

Dunque, ricominciando da zero, ho riportato la libreria da me creata sul progetto dove mi serve.
Ho poi creato un ulteriore file header chiamato impostazioniProgetto.h .
Al suo interno ho creato:

#undef definizione
#define definizione xxxx

Il risultato è che le funzioni della libreria continuano ad usare la vecchia definizione.
Ma se vado ad usare "definizione" nel mio progetto sul main, allora mi restituisce il vero valore a lei riassegnato.

Sto sbagliando qualcosa? oppure ciò che è impostato sulla libreria ormai è così e non si può cambiare?
Se così fosse è una grossa limitazione perché se volessi riutilizzare qualsiasi libreria fatta, e volessi anche solo cambiare un semplice piedino come nel mio caso, dovrei ricompilare tutta la libreria prima di usarla.
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 17 ospiti