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

Lcd + pic16f84a



  1. #1
    lukis54

    Lcd + pic16f84a


    ------

    Bonjour a tous,

    Dans le cadre de mon BTS SE, j'ai réaliser une plaque avec un PIC16F84A. cette plaque doit recevoir un message envoyer depuis un ordinateur avec le logiciel Hercules vers ma plaque en RS232 avec un port DB9 et une max232, qui par la suite ce message doit s'affiché sur un afficheur LCD 2x16. Je dois aussi réaliser
    un Programme en C, je l'est fait. Mon problème est que ce LCD ne s'initialise pas correctement, il m'affiche des caractères bizarres ( voir pièces jointes).
    LCD.png

    J’espère que vous pourrais m'aider, Merci d'avance pour vos réponses. =)

    -----

  2. Publicité
  3. #2
    juju_du_26

    Re : Lcd + pic16f84a

    Bonjour
    Je ne connais pas le C mais il faudrait au moins nous montrer ton schéma et le programme que tu as fait .

  4. #3
    vincent66

    Re : Lcd + pic16f84a

    Bonjour et bienvenue sur futura !
    Et que devrait-il afficher normalement ?

    Vincent
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  5. #4
    gabuzo

    Re : Lcd + pic16f84a

    Slt !

    Ca ressemble à une erreur de code ASCII.
    Je suis Charlie

  6. #5
    lukis54

    Re : Lcd + pic16f84a

    Merci d'avoir répondu rapidement. Je vous met ça tout de suite en pièce jointe. Normalement je dois recevoir des caractères normaux (exemple: j'envoie Hello, la plaque doit recevoir les caractères et les afficher comme je les ai écris sur le logiciel).
    Sans 1.png

  7. A voir en vidéo sur Futura
  8. #6
    lukis54

    Re : Lcd + pic16f84a

    Voila le programme que j'ai pu réaliser en cours, mon problème ce passe dans l’initialisation du LCD qui est sur le port b du PIC.

    Pièce jointe supprimée
    Dernière modification par JPL ; 13/06/2013 à 19h57.

  9. Publicité
  10. #7
    JPL

    Re : Lcd + pic16f84a

    Il est préférable d'utiliser la balise Code (#) du mode avancé pour intégrer le code dans le message.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  11. #8
    lukis54

    Re : Lcd + pic16f84a

    Pouvez-vous me donner un exemple svp, car je ne sais pas ce que c'est la balise Code (#) du mode avancé .

  12. #9
    JPL

    Re : Lcd + pic16f84a

    C'est ma journée de bonté :

    Code:
    #include <htc.h>				// Bibliothéque HITECH
    
    #ifndef _XTAL_FREQ				// Définition de la fréquence du quartz associé au PIC. */
    #define _XTAL_FREQ 8000000		//														*/
    #endif							//	
    
    
    __CONFIG(HS & WDTDIS & UNPROTECT);
    
    //****************************************************************************************************************************
    
    // Définition des variables générales.
    unsigned char MT81, MT82;			// Mémoire travail
    unsigned char CPTDP, FLASC2, MASC2,PTAFF, SPBRG,BRGH;
    
    unsigned short MT161, MT162,FLAGRCT = 0,FLAGEMI;
    unsigned short MPRD2 ; 				// Mémoire associée au TIMER1 demie période de réception.
    unsigned char TABRCPT[16] = {0x20};
    //****************************************************************************************************************************
    
    // Définition des variables LCD.
    
    // Ecriture de la table des messages (ROM)
    
    // Chaque message se termine par un caractére de 'FIN' de valeur '\0' (Caractére de controle NUL valeur ASC2 =0, 8 bits.).
    
    const unsigned char TABMESS[ ]= "\0 ATTENTE RECEPT \0  Lucas Louis  \0   BTS SE 2013   \0                \0"; 	// Ecriture de la table des messages (ROM)
    unsigned char MESSX[18] = {0}; // message (RAM 16 caractéres + '\0')
    //****************************************************************************************************************************
    
    // Equivalences LCD.
    
    #define D7 RB0
    #define D6 RB1
    #define D5 RB2
    #define D4 RB3
    
    #define RS RB4	
    #define EN RB5
    
    
    //****************************************************************************************************************************
    
    //Equivalences PORTC. Connection RS232/DB9
    
    #define RXPIC RA0	// Entrée de réception (IRQ)
    #define RTS RA2	// Controle de flux Sortie.
    
    //****************************************************************************************************************************
    
    //Déclaration des sous-fonctions LCD.
    void INITLCD (void);			// Initialisation du LCD
    void CHOIXMESS (char);			// Copie du message sélectionné en RAM MESSX 
    void AFFICHLCD1 (void);			// Affichage du message MESSX ( ligne 1, 16 caractéres)
    void AFFICHLCD2 (void);			// Affichage du message MESSX ( ligne 2, 16 caractéres)
    void EMILCD (char);				// Positionnement et émission (caractere ou commande) au LCD, MSB puis LSB.			
    void ENVOI (void);				// Copie des bits D0 RA1,D1 RA2,D2 RA3 ,D3 RA4 et validation de la donnée (EN).
    
    //Déclaration des sous-fonctions associées au programme d'émission réception.
    void INITTRANS (void);				// INIT Transmission RXPIC TXPIC IRQ
    void TEMPO (void);
    void CYCLE (void);					// Fonction récursive.
    void AFFICHE (void);				// Affichage du caractére Emi et Reçu.
    
    //****************************************************************************************************************************
    
    //Fonction Principale
    
    void main (void)
    {
    TEMPO();
    INITLCD ();
    
    TEMPO();
    CHOIXMESS (2);		// Choix du message 2.
    AFFICHLCD1 ();
    
    TEMPO();
    CHOIXMESS (3);		// Choix du message 3.
    AFFICHLCD2 ();
    
    TEMPO();
    CHOIXMESS (1);		// Choix du message 4.
    AFFICHLCD1 ();
    
    TEMPO();
    CHOIXMESS (4);		// Choix du message 5.
    AFFICHLCD2();
    
    INITTRANS ();
    
    CYCLE();
    }
    //****************************************************************************************************************************
    
    void CYCLE (void)
    
    {
    
    AFFICHE ();				
    
    CYCLE();						// Bouclage.
    }
    
    
    //****************************************************************************************************************************
    
    void AFFICHE (void)
    // Réception (interruption).
    {
    	if (FLAGRCT == 1 & FLAGEMI ==0)
    
    			{
    	
    			MT81 = 0;
    			while (MT81 != 16)  		
    
    					{ 
    					MESSX[MT81] = TABRCPT[MT81]; 	// Emission au LCD des caractéres 0 à 15 du message contenu dans MESSX.
    					MT81++;
    					}
    					AFFICHLCD2 ();
    			}
    
    	
    
    }
    //****************************************************************************************************************************
    void TEMPO (void)
    {
    __delay_ms(20);__delay_ms(20);__delay_ms(20);__delay_ms(20);__delay_ms(20);
    }
    
    //****************************************************************************************************************************
    void INITTRANS (void)
    {
    TRISB0 = 1;		//Entrée de réception (IRQ)
    
    TRISB1 =0;		//RTS Controle de flux Sortie.
    RTS = 1;		// Arret reception.
    
    // Activation des interruptions PORTB0 et Timer 0.
    
    GIE =1; // Activation globale des IRQ.
    
    EEIE = 1; // Activation des IRQ périfériques.
    
    
    // PB0 IRQ
     
    INTE = 1; // Activation.
    OPTION = OPTION | 0b10000000 ;	// PB0 front descendant sur PB0, pas de pulup.
    OPTION = OPTION & 0b10111111 ;
    
    // Valeur du registre associé à la vitesse de transmission SPBRG = 129 soit 9600 BAUD (Voir documentation technique)
    
    SPBRG = 129;
    
    // Sélection vitesse de transmission lente BRGH = 0 Baud Rate = FOSC/(64(X+1)), rapide BRGH = 1 Baud Rate = FOSC/(16(X+1))1.
    
    BRGH = 1;
    }
    //****************************************************************************************************************************
    // Initialisation du LCD.
    void INITLCD (void)
    {
    __delay_ms(20);			// Temps de mise en fonction du LCD
    __delay_ms(20);
    
    TRISB=TRISB & 0b000000000;		// Initialisation du PORT B
    PORTB = 0;
    
    TRISA=TRISA & 0b01110100;		// Initialisation du PORT A
     
    	EN = 0 ;				// Initialisation de la broche de validation des données (CLK).
    	RS = 0;					// Mode commande (Accés au registre de commande du LCD).
    
    	EMILCD (0x33);			// Mode 8 bit, 2/16
    	EMILCD (0x08);			// affichage off
    	EMILCD (0x01);			// clear et home
    	EMILCD (0x0C);			// Affichage on, curseur clign off 
    	EMILCD (0x06);			// Pas de decalage
    
    RS = 1;					// Mode caractère (Accés au registre d'affichage du LCD).
    }
    
    //****************************************************************************************************************************
    // Positionnement et émission (caractere ou commande) au LCD, MSB puis LSB.
    
    
    void EMILCD (char DLCD)		// DLCD mémoire associée à la fonction EMILCD (Ne peut étre utilisée que dans cette fonction).
    {
    MT81=DLCD;				// Envoi du MSB de DLCD.
    MT81 = MT81 / 16 ;		// Positionnement du MSB de DLCD en Bit0, Bit1, Bit2, Bit3.
    ENVOI ();				// Envoi du MSB.
    
    MT81=DLCD;				// Envoi du LSB de DLCD.
    ENVOI ();				// Envoi du LSB.
    
    }
    
    //****************************************************************************************************************************
    
    //*****************************************************************************
    // Copie des bit0 RD0, bit1 RD1, bit2 RD2, bit3 RD3 et validation de la donnée (EN).
    //*****************************************************************************
    
    void ENVOI (void)
    {
    
    MT81 = MT81 & 0b00001111;			// Mise à 0 des bits 7, 6, 5, 4.
    PORTB = PORTB | MT81; 				// Recopie des 1 PORTD0 à PORTA3
    MT81 = MT81 | 0b11110000;			// Mise à 1 des bits 7, 6, 5, 4.
    PORTB = PORTB & MT81;				// Recopie des 0 PORTD0 à PORTD3
    
    	// Validation de la donnée
    
    EN = 1;				// Front descendant
    
    __delay_us(10);		// Temporisation de 10 us. Fréquence du signal d'horloge associé au LCD.
    
    EN = 0;
    
    __delay_ms(20);		// Temporisation de 20 ms. Avant le caractére suivant.
    
    }
    
    //*********************************************************************************
    //*********************************************************************************
    
    //*****************************************************
    // Affichage du message MESSX ( ligne 2, 16 caractéres)
    //*****************************************************
    
    		void AFFICHLCD2 (void)
    
    		{	// Début.
    			RS = 0; 			// Mode commandes
    			EMILCD( 0xA8 ); 	// Positionnement du curseur.Ligne 2
    			RS = 1; 			// Mode caractéres.
     			
    			MT82=0;	
    		
    			while (MESSX[MT82] != 0)  		// Tant que le caractére est différent de '\0'
    
    					{ 
    					EMILCD(MESSX[MT82]); 	// Emission au LCD des caractéres 0 à 15 du message contenu dans MESSX.
    					MT82++;
    					}
     						
    		}	// FIN.	
    
    //****************************************************************************************************************************
    
    //*****************************************************
    // Affichage du message MESSX ( ligne 2, 16 caractéres)
    //*****************************************************
    
    		void AFFICHLCD1 (void)
    
    		{	// Début.
    			RS = 0; 			// Mode commandes
    			EMILCD( 0x80 ); 	// Positionnement du curseur.Ligne 1
    			RS = 1; 			// Mode caractéres.
     			
    			MT82=0;	
    		
    			while (MESSX[MT82] != 0)  		// Tant que le caractére est différent de '\0'
    
    					{ 
    					EMILCD(MESSX[MT82]); 	// Emission au LCD des caractéres 0 à 15 du message contenu dans MESSX.
    					MT82++;
    					}
     						
    		}	// FIN.	
    
    //****************************************************************************************************************************
    
    //******************************************
    // Copie du message sélectionné en RAM MESSX 
    //******************************************
    
    void CHOIXMESS (char PTMESS)
    													
    	{	// Début.
    
    	MT161=0;MT162=0;MT81=0;			// MT161 pointeur de caractére, MT162 pointeur de message.							
    
    	while ( MT162 != PTMESS)  		// Initialisation du pointeur de caractéres.(Premier caractére du message sélectionné)
    
    			{
    			while ( TABMESS[MT161] != 0) MT161++;
     			MT161++;
    			MT162++;
    			}										
    
    	while ( TABMESS[MT161] != 0) {MESSX[MT81]=TABMESS[MT161]; MT161++;MT81++;}		// Copie du message dans MESSX.																	
    
    
    	MESSX[MT81]=0;		// Insertion du caractére de fin de message '\0'.	
     																	
    	}	// FIN.
    Pour cela il faut cliquer sur Répondre et non sur Réponse rapide. Ou bien si on a cliqué sur le bouton vert Répondre à la discussion il faut ensuite, au bas de la fenêtre, cliquer sur Aller en mode avancé. Ensuite il suffit de regarder la barre d'outils.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  13. #10
    paulfjujo

    Re : Lcd + pic16f84a

    bonsoir,

    C'est normal l'inversion de sens des bits DATA du LCD ?
    RB0 -> D7
    ....
    RB3 -> D4
    car je n'ai pas vu ton code..

  14. #11
    pilatomic

    Re : Lcd + pic16f84a

    Le truc c'est que lors de l'initialisation, y'a un timing à respecter, sans quoi ça rate, cf pages 45 et 46 (respectivement pour initialiser en mode 8 bits et 4 bits ) du datasheet : https://www.sparkfun.com/datasheets/LCD/HD44780.pdf

  15. #12
    lukis54

    Re : Lcd + pic16f84a

    d'accord merci de vos réponses, cela change quoi l'inversion de RB0 -> D7 ... RB3 -> D4??
    Dans mon programme il y a bien le délais de 40 ms au debut, mon problème se passe au niveau de port b.

  16. Publicité
  17. #13
    vincent66

    Re : Lcd + pic16f84a

    cela change quoi l'inversion de RB0 -> D7 ... RB3 -> D4??
    MMmmmppffff ouah ha ha ha ha houlà houlà ..!
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  18. #14
    spown

    Re : Lcd + pic16f84a

    Bonjour/bonsoir est bienvenu sur FUTURA,

    Peux tu me dire où t'as utilisé tes déclaration D7~D4 ?

    Pour les LCD faut envoyer les 4 bits MSB au début, puis les 4 bites LSB.

    A ton avis, le microcontrôleur va commencer sa lecture/ecriture par RB0 ou RB3 ?

Sur le même thème :

Discussions similaires

  1. Mrf24j40a + pic16f84a
    Par aminos18 dans le forum Électronique
    Réponses: 2
    Dernier message: 19/04/2011, 14h38
  2. EEPROM pic16f84a
    Par guijac92 dans le forum Électronique
    Réponses: 2
    Dernier message: 06/10/2008, 13h49
  3. PIC16f84a
    Par clinon dans le forum Électronique
    Réponses: 33
    Dernier message: 06/08/2007, 03h31
  4. pic16f84A
    Par spike 03100 dans le forum Électronique
    Réponses: 5
    Dernier message: 06/02/2007, 20h22
  5. programme pic16F84A
    Par amgab2003 dans le forum Électronique
    Réponses: 0
    Dernier message: 26/03/2006, 12h14
Découvrez nos comparatifs produits sur l'informatique et les technologies.