Répondre à la discussion
Affichage des résultats 1 à 25 sur 25

Compilateur C18 et lib LCD !!



  1. #1
    kronanberg

    Compilateur C18 et lib LCD !!


    ------

    Bonjour,

    Voila je suis en train de me faire une librairie pour mon ecran LCD 2x16. Je programme un PIC18F2423 avec le compilateur MCC18.
    Pour le moment je n'arrive toujours pas à faire fonctionner ma librairie LCD mais je viens de m'apercevoir qu'une fonction qui permet de commander un seul bit d'un port ne fonctionne pas comme je le pensais.

    Voila l'exemple :

    Code:
    	while(1)
    	{
    		PORTAbits.RA0 = 1;
    		PORTAbits.RA1 = 1;
    		for(i=0;i<10000;i++);
    		PORTAbits.RA0 = 0;
    		PORTAbits.RA1 = 0;
    		for(i=0;i<10000;i++);	
    	}
    Je visualise l'état des sorties RA0 et RA1 à l'aide de 2 Leds. Le souci est que la commande "PORTAbits.RA1=1" met à zéro le bit RA0 et à 1 le bit RA1 ???
    st ce normal ?? je ne vois pas pourquoi je n'arrive pas à commander directement le port bit à bit !!!

    Je pense que c'est pour ça que ma librairie LCD à pas beaucoup de chance de fonctionner car je déclare les broches comme ceci :

    Code:
    /********************************************************************
    *		DEFINISSION DU BROCHAGE ENTRE L'ECRAN LCD ET LE PIC			*
    *********************************************************************	
    *	CONTROLE 														*
    *				RS	=>	RB0	(fil vert)								*
    *				RW	=>	RB1	(fil jaune)								*
    *				E	=>	RB2	(fil mauve)								*
    *********************************************************************
    *	DONNEES SUR 4 BITS												*
    *				D4	=>	RC4											*
    *				D5	=>	RC5											*
    *				D6	=>	RC6											*
    *				D7	=>	RC7											*
    ********************************************************************/
    #define LCD_RS		PORTBbits.RB0
    #define LCD_RW		PORTBbits.RB1
    #define LCD_E		PORTBbits.RB2
    
    #define TRIS_LCD_RS	TRISBbits.TRISB0
    #define TRIS_LCD_RW	TRISBbits.TRISB1
    #define TRIS_LCD_E	TRISBbits.TRISB2
    
    #define D4			PORTCbits.RC4
    #define D5			PORTCbits.RC5
    #define D6			PORTCbits.RC6
    #define D7			PORTCbits.RC7
    
    #define TRIS_D4		TRISCbits.TRISC4
    #define TRIS_D5		TRISCbits.TRISC5
    #define TRIS_D6		TRISCbits.TRISC6
    #define TRIS_D7		TRISCbits.TRISC7
    Voila si quelqu'un a déjà eu ce problème !!!

    -----

  2. Publicité
  3. #2
    vede

    Cool Re : Compilateur C18 et lib LCD !!

    Bonsoir Kronanberg,

    ça serait pas une histoire de LATCH...

    remplacer PORT par LATCH, genre :

    LATCHbits.RA0 = 1;

    pour "assigner" les ports sur un 18Fxxxx...

    vede
    ;O]
    ___________________
    no pub....

  4. #3
    RISC

    Re : Compilateur C18 et lib LCD !!

    Salut,

    Comme VEDE l'a mentionné il faut IMPERATIVEMENT utiliser LATx au lieu de PORTx UNIQUEMENT pour les broches en sortie, sans quoi si 2 instructions de manipulation de bits sur le même port se suivent on prend le risque d'avoir le premier qui retombe.

    Il faut donc utiliser LATAbits.LATA0 au lieu de PORTAbits.RA0

    ATTENTION : cela ne s'applique qu'aux broches en sortie et SURTOUT pas aux broches en entrée ou il faut toujours utiliser PORTx car dans ce cas on veut absolument lire le PORT physique et pas le registre LATx

    a+

  5. #4
    kronanberg

    Re : Compilateur C18 et lib LCD !!

    Merci pour ces réponses. Le test avec les Leds fonctionne mieux!
    Reste maintenant a essayé de faire fonctionner mon LCD !!!

    Mais va falloir que je me replonge dans la documentation car je ne comprend pas trop pourquoi en passant par le port ça ne fonctionne pas !!

    Il me semble que j'avais deja eu ce soucis en plus et du coup j'écrivais directement sur le PORT entier !!!

    Bon je me lance dans mon LCD !!!

    Merci encore

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    kronanberg

    Re : Compilateur C18 et lib LCD !!

    Du coup pour ma librairie LCD, comme je voulais pouvoir faire une librairie ou je pourrai utiliser n'importe quelles broches du PIC, il faut que j'utilise les broches en sortie avec LATCH et Celle en entrée avec PORT !!

    Alala ça va compliquer un petit peu le programme !! Mais c'est bien ça fais bosser un peu

  9. #6
    kronanberg

    Re : Compilateur C18 et lib LCD !!

    Je configure donc mes constante comme ça

    #define LCD_RS LATBbits.LATB0
    #define LCD_RW LATBbits.LATB1
    #define LCD_E LATBbits.LATB2

    #define TRIS_LCD_RS TRISBbits.TRISB0
    #define TRIS_LCD_RW TRISBbits.TRISB1
    #define TRIS_LCD_E TRISBbits.TRISB2

    //Bit de Lecture des données
    #define L_D4 PORTCbits.RC4
    #define L_D5 PORTCbits.RC5
    #define L_D6 PORTCbits.RC6
    #define L_D7 PORTCbits.RC7

    //Bit d'ecriture des données
    #define E_D4 LATCbits.LATC4
    #define E_D5 LATCbits.LATC5
    #define E_D6 LATCbits.LATC6
    #define E_D7 LATCbits.LATC7

    #define TRIS_D4 TRISCbits.TRISC4
    #define TRIS_D5 TRISCbits.TRISC5
    #define TRIS_D6 TRISCbits.TRISC6
    #define TRIS_D7 TRISCbits.TRISC7
    Mais pour l'instant ça veut toujours pas fonctionner !! Le LCD

  10. Publicité
  11. #7
    RISC

    Re : Compilateur C18 et lib LCD !!

    Salut,

    Le problème peut aussi venir de tes tempos...
    99% des problèmes de gestion des LCD sont du aux différences entre les différents CI compatibles avec le HD44780. Télécharges la datasheet précise du controleur LCD utilisé sur ton afficheur.

    La plupart des controleurs LCD (compatibles HD44780) sont compatibles au niveau des commandes MAIS pas au niveau des tempos pour chaque commande.
    Le compilateur C18 est fourni je crois avec une librairie appelée XLCD.
    Tu trouveras aussi des exemples sur le site de l'IUFM d'aix avec la carte PICDEM 2 PLUS.

    a+

  12. #8
    vede

    Cool Re : Compilateur C18 et lib LCD !!

    re ;O]

    une suggestion : c'est de tester avant chaque envoi
    si le LCD est vraiment prêt à recevoir une nouvelle
    commande/donnée, en "lisant" son flag BF (Busy Flag)...

    comme présenté en bas de ce doc
    http://www.aurel32.net/elec/lcd.php
    (section "4 bits)

    mais ça va encore te compliquer la programmation...
    comme te préconises RISC ci-dessus commences par tester en augmentant tes tempos...

    .
    Dernière modification par vede ; 03/05/2010 à 22h25.

  13. #9
    kronanberg

    Re : Compilateur C18 et lib LCD !!

    Reboujour !! Et merci des conseils comme toujours !!

    Après quelque tempo et une petite révision du code, j'arrive enfin a afficher des caractères !!!

    Voici une petit ébauche de ma librairie LCD dont j'ai repris pas mal l'exemple de ce liens : http://nalhossri.free.fr/LCD4bits.h/LCD4bits.h.html

    Ben finalement il accepte pas mes 16000 caractères du code !!
    Tant pis !!!!!

    Je vais pouvoir me coucher moins fructrer que hier de pas avoir réussi à terminer ce code

    a+

  14. #10
    ricolab

    Re : Compilateur C18 et lib LCD !!

    Bonjour

    J'essaie de faire fonctionner cette librairie de gestion d'afficheurs alphanumériques (http://nalhossri.free.fr/LCD4bits.h/LCD4bits.h.html) et j'obtient une erreur lors de la compilation.
    J'utilise un pic18f2550 , je suis sous Mplab 8.43 et compile par C18. j'obtiens une erreur au niveau du champs de bits (ligne soulignée):

    struct { //une structure 8 bits (champ de bits).
    byte bit0:1,
    bit1:1,
    bit2:1,
    bit3:1,
    bit4:1,
    bit5:1,
    bit6:1,
    bit7:1;
    }bits;
    byte octet; //un byte (octet).
    } mon_octet ;

    et l'erreur est la suivante.
    ----------------------------------------------------------------------
    Debug build of project `D:\mesdoc\programmation microcontroleur\droids\compas\ compas.mcp' started.
    Language tool versions: mplink.exe v4.30.01, mcc18.exe v3.30
    Preprocessor symbol `__DEBUG' is defined.
    Wed May 05 01:44:48 2010
    ----------------------------------------------------------------------
    Clean: Deleting intermediary and output files.
    Clean: Done.
    Executing: "C:\MCC18\bin\mcc18.exe" -p=18F2520 "MultiFace.c" -fo="MultiFace.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
    MPLAB C18 v3.30 (evaluation)
    Copyright 2000-2009 Microchip Technology Inc.
    Days remaining until evaluation becomes feature limited: 59
    D:\mesdoc\programmation microcontroleur\droids\compas\ LCD4bits.h:33:Error: syntax error
    Halting build on first failure as requested.
    ----------------------------------------------------------------------
    Debug build of project `D:\mesdoc\programmation microcontroleur\droids\compas\ compas.mcp' failed.
    Language tool versions: mplink.exe v4.30.01, mcc18.exe v3.30
    Preprocessor symbol `__DEBUG' is defined.
    Wed May 05 01:44:49 2010
    ----------------------------------------------------------------------
    BUILD FAILED

    Si vous avez une idée de solution, merci d'avance

  15. #11
    kronanberg

    Re : Compilateur C18 et lib LCD !!

    Salut !!

    C'est normal que tu es une erreur le type byte n'est pas declarer :

    Donc y faut soit que tu codes la structure comme ceci :
    /****************************** ****************************** ********
    * DECLARTION D'UNE STRUCTURE COMPORTANT 8 BITS et 1 OCTET *
    * CETTE STRUCTURE CORRESPONDRA A LA LIGNE DE DONNEES RELIE *
    * A L'ECRAN LCD *
    ****************************** ****************************** *********/
    union{
    struct{
    char bit0:1,
    bit1:1,
    bit2:1,
    bit3:1,
    bit4:1,
    bit5:1,
    bit6:1,
    bit7:1;
    }bits;
    char octet;
    }mon_octet;
    ou alors que tu déclares un type byte avant ta structure, comme ceci :

    /****************************** ****************************** ********
    * DECLARATION DES TYPES *
    ****************************** ****************************** ********/
    typedef unsigned char byte;
    typedef unsigned int word;
    typedef unsigned long dword;
    Je me suis aussi servit de ce code pour faire ma librairie LCD. Mais j'ai tjrs un petit problème pour afficher une chaine de caractère !!

    Tiens moi au courant si ça fonctionne !!

    A+

  16. #12
    kronanberg

    Re : Compilateur C18 et lib LCD !!

    re !!

    Par contre dans cette librairie il ne tient pas compte des temps d'attente des écran LCD donc il faut que tu les rajoutes dans le code.

  17. Publicité
  18. #13
    kronanberg

    Re : Compilateur C18 et lib LCD !!

    Bonjour !!

    Voila j'ai toujours un souci avec mon affichage LCD. J'arrive à afficher un caractère mais j'ai du mal à afficher une chaine de caractère !!
    Voila mon code :

    Code:
    /********************************************************************
    * FONCTION		void aff_car(byte c)								*
    *********************************************************************
    * DESCRIPTION   Affiche le caractère dont le code ascii est c		*
    *********************************************************************
    * PARAMETRES														*
    * 				ENTREES		octet c									*
    * 				SORTIES	  	rien									*
    ********************************************************************/
    void aff_car(byte c)
    {
    	ecr_data (c);
    }
    
    /********************************************************************
    * FONCTION		void aff_txt(byte *message)							*
    *********************************************************************
    * DESCRIPTION   Affiche le message stocke en ROM					*
    *********************************************************************
    * PARAMETRES														*
    * 				ENTREES		*message 								*
    * 				SORTIES	  	rien									*
    *********************************************************************
    * OPTION		\r provoque le retour au début de la ligne suivante *
    ********************************************************************/
    void aff_txt(byte *message)
    {
    
    	while(*message!= '\0')			//écriture sur le LCD de toute la chaîne.
    	{	        
    
    		if(*message=='\r')
    			xy_lcd(1,2);
    		else
    			aff_car(*message);      //écriture sur le LCD d'un caractère du message.
    
    		*message++;
    	};
    }

    Lorsque j'utilise cette instruction cela fonctionne :

    char ch[] = "MASTER_SIAM";
    aff_txt(ch);

    Mais lorsque je mets celle ça ne fonctionne plus :

    char *ch1 = "MASTER_SIAM";
    aff_txt(*ch1);

    Ni quand j'écris directement cette chaine :
    aff_txt("TEST");

    Je suppose que c'est à cause que je passe par un pointeur mais j'ai utilisé toutes les manière pour définir le pointeur et je ne comprend pas pourquoi ça ne fonctionne pas !!

    Je veux bien un peu d'aide !! Merci !

  19. #14
    sdec25

    Re : Compilateur C18 et lib LCD !!

    Bonjour,
    A mon avis c'est le type de variable (ram/rom) qui cause le problème.
    essaie comme ça :
    Code:
    void aff_txt(rom char *message);
    aff_txt("texte");
    Par contre ça ne fonctionnera plus avec un tableau char[] (il faudra utiliser 2 fonctions).

  20. #15
    kronanberg

    Re : Compilateur C18 et lib LCD !!

    Salut !!

    Exactement, c'est ça le soucis je viens de trouver un autre exemple sur le Net !! Merci !!

    Mais sinon comment je peut faire pour declarer deux fonction avec le même nom genre :

    void aff_txt(rom char *message);
    void aff_txt(byte *message);
    Histoire que ça fonctionne dans n'importe quel cas ! PArce que j'ai vu sur la librairie lcd d'un collegue qu'il declare 2 fonctions du même nom avec de type différents et lui ça fonctionne (sur Source Boost) mais moi le compilo C18 y veut rien savoir ???

  21. #16
    sdec25

    Re : Compilateur C18 et lib LCD !!

    En C++ on peut déclarer 2 fonctions qui ont le même nom mais pas les mêmes paramètres à condition que le compilateur puisse les différencier.
    En C ce n'est pas possible.

  22. #17
    ricolab

    Re : Compilateur C18 et lib LCD !!

    Je tiens tout d'abord à remercier tous les intervenants car c'est (presque) mon premier programme sur Pic et c'était mal parti mais grace à vous c'est passé comme une lettre à la poste.
    J'ai rencontré les même problèmes de tempo, La fonction busy n'est pas au point mais je l'ai shunté par une tempo. la fonction aff_txt(); fait toujours des siennes mais la solution de sdec25 fontionne bien (du moins pour ce que je cherche à faire). Dans un soucis d'apprentissage que signifie "type de variable (ram/rom) " Je vois bien la diff entre la ram et la rom (comme dans les pocket pc) mais pourquoi ont ils des type de variable différents.

    kronanberg , si tu trouve une solution pour aff_txt(); n'hésite pas à nous en faire part.
    Je suis désolé de n'apporter à cette discution plus de questions que de solutions (Ah ces newb ils servent vraiement à rien!!!!)

  23. #18
    RISC

    Re : Compilateur C18 et lib LCD !!

    Salut,

    Les PIC18 (comme tous les autres PICs sauf les PIC32) ont une architecture de type HARVARD, c'est à dire que la mémoire FLASH et la mémoire RAM sont dans 2 espaces distincts nécessitant des instructions différentes (par opposition à beaucoup d'autres micros qui ont une architecture Von Neumann dont la mémoire RAM et FLASH se distingue simplement par leurs adresses).
    L'avantage de l'architecture Harvard est d'avoir 2 bus et de pouvoir simultanément aller chercher une donnée et une instruction.
    Donc quand on écrit en C, il faut spécifier au compilateur ou l'on souhaite qu'il place les données.
    Il y a des options par défaut :
    * variables en RAM (c'est le plus logique)
    * constantes en FLASH
    mais il est également possible de mettre des constantes en RAM.

    Ceci se précise donc par l'attribut ROM (FLASH) ou RAM (RAM).

    a+

  24. Publicité
  25. #19
    ricolab

    Re : Compilateur C18 et lib LCD !!

    Merci pour ces explications !!
    Pour le problème de busy c'est résolu... Il fallait lire avec PORT la broche 7 et pas chercher à gagner du temps en faisant des copier coller du LAT qui précède. Re merci à RISC qui l'avait bien précisé dans son 3° post. Pour une fois qu'un proto fonctionne avant d'aller au lit, faut féter ça...
    Bonne nuit

  26. #20
    ricolab

    Re : Compilateur C18 et lib LCD !!

    RE...

    A chaque fois que j'utilise la fonction aff_txt("coucou");
    J'ai le message warning à la compilation:
    Warning [2066] type qualifier mismatch in assignment

    L'affichage fonctionne bien sur le LCD mais si j'utilise 10 fois la fonction, j ai 10 warning.

    J'ai déclaré la fonction comme discuté plus tot:
    void aff_txt(rom char *message){

    Quelqu'un aurait il une explication et comment y remédier.

  27. #21
    sdec25

    Re : Compilateur C18 et lib LCD !!

    Citation Envoyé par ricolab Voir le message
    Quelqu'un aurait il une explication et comment y remédier.
    type attendu par la fonction : rom char *
    type d'une variable "texte" : const rom char *

    1) Ce n'est qu'un warning, on peut l'ignorer
    2) Mets plutôt const rom char* comme type de paramètre dans ta fonction.

  28. #22
    ricolab

    Re : Compilateur C18 et lib LCD !!

    PARFAIT: Ca c'est une réponse efficace !
    Ce n'était qu'un warning mais comme on disait dans l'agence tous risques:
    "j'adore quand un plan se déroule sans accros"

  29. #23
    kronanberg

    Re : Compilateur C18 et lib LCD !!

    Salut !!!

    Tiens je vais pouvoir supprimer mes warning aussi

    Sinon "ricolab" tu te serts que de la fonction qui permet d'afficher une chaine de caractère en ROM ou de l'autre aussi ?

    J'aurai voulu essayer de faire un fonction qui permet d'afficher n'importe qu'elle chaine de caractère qu'elle soit écris en ram ou en rom? Mais je n'ai tjrs pas trouvé de solution !!

    Peut être en tester la variable passer en paramètres mais je ne suis pas sur que ça fonctionne !!

    a+

  30. #24
    ricolab

    Re : Compilateur C18 et lib LCD !!

    je ne me sert que de aff_txt("blablabla").
    Pour les float, j'ai fait une fonction séparée qui affiche chiffre par chiffre.
    c'est pas le plus pratique mais ça fonctionne trés bien

  31. Publicité
  32. #25
    RISC

    Re : Compilateur C18 et lib LCD !!

    Salut,

    Ne pas oublier que les PIC ont une architecture Harvard (2 bus : un pour les données et un pour les instructions).
    Le qualificateur ROM (ou const par défaut) permet au PIC de savoir qu'il doit aller chercher la chaine de caractères dans la FLASH. A l'inverse, pas de qualificateur ou chaine dans la RAM : const RAM char * (pointeur vers une chaine constante dans la RAM).

    Cela permet au compilateur de générer les instructions d'accès aux chaines dans la RAM ou la FLASH.

    a+

Discussions similaires

  1. Librairie en C18 pour LCD
    Par Nappa dans le forum Électronique
    Réponses: 13
    Dernier message: 20/02/2014, 21h21
  2. Problème Librairie XLCD - compilateur C18
    Par jorg1n dans le forum Électronique
    Réponses: 27
    Dernier message: 08/06/2009, 07h00
  3. PICDem 2 plus - C18 et LCD
    Par hoffmann dans le forum Électronique
    Réponses: 5
    Dernier message: 07/10/2008, 19h35
  4. l'utilité du compilateur C18 v3_20 pour l'instalation du MPLAB.
    Par Chaouki22 dans le forum Électronique
    Réponses: 3
    Dernier message: 29/04/2008, 18h14
  5. [Programmation]Différence Compilateur C C18/IAR PIC18
    Par jorg1n dans le forum Électronique
    Réponses: 3
    Dernier message: 01/04/2008, 08h38
Découvrez nos comparatifs produits sur l'informatique et les technologies.