Affichage de temperature sur un LCD a l'aide de pic24f
Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

Affichage de temperature sur un LCD a l'aide de pic24f



  1. #1
    mconf

    Affichage de temperature sur un LCD a l'aide de pic24f


    ------

    Bonjour, je suis débutante en microcontrôleur et je vais réaliser un projet à l'aide de pic24f256g110 et C sous Mplab. Mon but est de détecter une température à l'aide d'un capteur de température lm35 et l'afficher sur un LCD. vraiment je suis bloqué j'ai réalisé un code en se basant sur plusieurs codes sur net que j'arrive pas à l comprendre surtout tous ce qui est configuration des registres de Convertisseur analogique numérique et celle de LCD :
    Code:
    #include "p24fj256GB110.h"
    
    
    // JTAG/Code Protect/Write Protect/Clip-on Emulation mode
    //Watchdog Timer/ICD pins select
    _CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx2) 
    // Disable CLK switch and CLK monitor, OSCO or Fosc/2, HS oscillator,
    // Primary oscillator
    _CONFIG2(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_XT & FNOSC_PRI)
    
    
    ////////////////////////////////////////////////////////* Digital Thermometer using PIC24F and LM35 
    
    ///Internal Oscillator @ 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF Copyright @ Rajendra Bhatt November 8, 2010 */
    
    // LCD module connections
    // LCD display ports etc
    #define LCD_RS LATD0_bit;
    //sbit LCD_EN at LATD1_bit;
    //sbit LCD_D4 at LATD2_bit;
    //sbit LCD_D5 at LATD3_bit;
    //sbit LCD_D6 at LATD4_bit;
    //sbit LCD_D7 at LATD5_bit;
    #define LCDdata LATE					// data port
    #define LCDdataEnable	TRISE
    #define RS LATBbits.LATB15				// RS bit in LCDstatus
    #define RW LATDbits.LATD5				// read/write bit in LCDstatus
    #define E  LATDbits.LATD4   			// enable bit in LCDstatus
    #define Eenable TRISDbits.TRISD4
    #define ERSenable TRISDbits.TRISD5
    #define RWenable TRISBbits.TRISB15
    
    void lcd_delay() { mSecDelay(2); }  // if LCD does not work make this longer
    
    // Write a nibble to the LCD
    // may have to adjust delays to suit the processor and clock
    void lcdNibble(int n)
    {
        int lcd=LCDdata;
    	lcd_delay();
        LCDdata=n;
    	lcd_delay();
        E=1;					// take clock E high 
    	lcd_delay();
        E=0;
    	lcd_delay();
     }
    
    // Write a Control Command to the LCD
    // This is written as two nibbles
    void lcdCmd(int c)
    {
     	RS=0;			        // Take RS pin low for command
    	lcdNibble(c);			        // Makeup Lower Nibble
    }
    
    // write a data byte to LCD
    int lcdPutchar(int d)
    {
    //    printf("%c", d);
    	RS=1; 				// Take RS pin high for data
    	lcdNibble(d);		            // Makeup Lower Nibble
        return 1;
    }
    
    // Initialise the LCD in 4bit Mode
    void lcdInit()
    {
    	E=0;				// take E low
     	RS=0;				// Take RS pin low for command
     	RW=0;				// Take RS pin low for command
        // set RS, RW and E bits as output
    	Eenable =0;
    	ERSenable =0;
    	RWenable =0;
        LCDdataEnable &= 0x0;          // set bits 0-3 output for data
    	lcdNibble(0x3);		// This put the LCD into Soft Reset 
    	lcdNibble(0x3);
    	lcdNibble(0x3);
    	lcdNibble(0x2);
    	lcd_delay();
    //	lcdCmd(0x28);			// 2 line, 4 bit mode 
    	lcdCmd(0x38);			// 2 line, 8 bit mode 
    	lcd_delay();
        lcdCmd(0x6);			// increment cursor after each write
    	lcd_delay();
        lcdCmd(0x1);			// clear display
    	lcd_delay();
        lcdCmd(0x2);			// home
    	lcd_delay();
        lcdCmd(0xF);			// turn disply on
    	lcd_delay();
    }
    // End LCD module connections
    
    
    // Define Messages
    char message0[] = "LCD Initialized";
    char message1[] = "Room Temperature";
    
    
    // String array to store temperature value to display
    char *tempC = "000.0";
    char *tempF = "000.0";
    
    
    // Variables to store temperature values
    unsigned int tempinF, tempinC;
    unsigned long temp_value;
    
    
    void Display_Temperature() {
     // convert Temp to characters
     if (tempinC/10000)
     // 48 is the decimal character code value for displaying 0 on LCD
     tempC[0] = tempinC/10000 + 48;
     else tempC[0] = ' ';
     tempC[1] = (tempinC/1000)%10 + 48; // Extract tens digit
     tempC[2] = (tempinC/100)%10 + 48; // Extract ones digit
     // convert temp_fraction to characters
     tempC[4] = (tempinC/10)%10 + 48; // Extract tens digit
     // print temperature on LCD
     Lcd_Out(2, 1, tempC);
     if (tempinF/10000)
     tempF[0] = tempinF/10000 + 48;
     else tempF[0] = ' ';
     tempF[1] = (tempinF/1000)%10 + 48; // Extract tens digit
     tempF[2] = (tempinF/100)%10 + 48;
     tempF[4] = (tempinF/10)%10 + 48;
     // print temperature on LCD
     Lcd_Out(2, 10, tempF);
    }
    
    int main (void)
    {
    
    // ANSEL = 0b00000100; // RA2/AN2 is analog input
    // ADCON0 = 0b01001000; // Connect AN2 to S/H, select Vref=1.19V
     //CMCON0 = 0x07 ; // Disbale comparators
    
     //////////////////////////////////////////Converting One Channel, Manual Sample Start, Manual Conversion Start Code///////////////////////////////////////////////////
     int ADCValue;
     AD1PCFG = 0xFFFB; // AN2 as analog, all other pins are digital
     AD1CON1 = 0x0000; // SAMP bit = 0 ends sampling and starts converting
     AD1CHS0 = 0x0002; // Connect AN2 as S/H+ input
     // in this example AN2 is the input
     AD1CSSL = 0;
     AD1CON3 = 0x0002; // Manual Sample, Tad = 3Tcy
     AD1CON2 = 0;
     AD1CON1bits.ADON = 1; // turn ADC ON
     while (1) // repeat continuously
     {
     AD1CON1bits.SAMP = 1; // start sampling...
     Delay(); // Ensure the correct sampling time has elapsed
     // before starting conversion.
     AD1CON1bits.SAMP = 0; // start converting
     while (!AD1CON1bits.DONE){}; // conversion done?
     ADCValue = ADC1BUF0; // yes then get ADC value
     }
    
    
     TRISC = 0b00000000; // PORTC All Outputs
     TRISA = 0b00001110; // PORTA All Outputs, Except RA3 and RA2
     lcdInit()
     Delay();
     Lcd_Out(1,1,message1); // Write message1 in 1st row
     // Print degree character
     Lcd_Chr(2,6,223);
     Lcd_Chr(2,15,223);
     // Different LCD displays have different char code for degree symbol
     // if you see greek alpha letter try typing 178 instead of 223
     Lcd_Chr(2,7,'C');
     Lcd_Chr(2,16,'F');
     do {
     temp_value = ADC_Read(2);
     temp_value = temp_value*1168;
     tempinC = temp_value/1000;
     tempinC = tempinC*10;
     tempinF = 9*tempinC/5 + 3200;
     Display_Temperature();
     Delay_ms(1000); // Temperature sampling at 1 sec interval
     } 
     while(1);
    }
    Merci d'avance

    -----

  2. #2
    DAUDET78

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Bonjour mconf et bienvenue sur FUTURA
    C'est toi qui a choisi le LM35 ou ça t'est imposé ?
    J'aime pas le Grec

  3. #3
    gabuzo

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Prendre des bouts de code à droite et à gauche et tenter de les assembler ça ne fonctionne jamais ! Pour la configuration des registres pas de secret, faut se taper la DS.

    PS : Tu es sûre de la référence du PIC ?
    Je suis Charlie

  4. #4
    mconf

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Merci pour vos réponses, nn c moi qu'elle a choisit de travailler ave lm35 puisque c'est le plus facile je pense de plus les erreurs est au niveau de lcd le code m'affiche ces erreurs ;
    TMR3ADC.c: In function 'lcd_delay':
    TMR3ADC.c:30: warning: implicit declaration of function 'mSecDelay'
    TMR3ADC.c: In function 'lcdNibble':
    TMR3ADC.c:36: warning: unused variable 'lcd'
    TMR3ADC.c: In function 'Display_Temperature':
    TMR3ADC.c:120: warning: implicit declaration of function 'Lcd_Out'
    TMR3ADC.c: In function 'main':
    TMR3ADC.c:151: warning: implicit declaration of function 'Delay'
    TMR3ADC.c:162: error: syntax error before 'Delay'
    TMR3ADC.c:165: warning: implicit declaration of function 'Lcd_Chr'
    TMR3ADC.c:172: warning: implicit declaration of function 'ADC_Read'
    TMR3ADC.c:178: warning: implicit declaration of function 'Delay_ms'
    Halting build on first failure as requested

  5. A voir en vidéo sur Futura
  6. #5
    RISC

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Salut,

    Quelle est la taille de ton LCD ?
    Il existe des dizaines d'exemples pour le carte EXPLORER16 qui est basée sur le PIC24FJ128GA010.
    Cette carte possède un afficheur de 2 lignes de 16 caractères.
    Le PIC24FJ256GB110 est compatible broche à broche avec le PIC24FJ128GA010 (sauf les broches USB D+ et D-), il est donc facile d'adapter tous les exemples.
    Tu trouveras beaucoup de ces exemples ici : http://www.microchip.com/codeexamples, tu filtres la 3e colonne pour la famille PIC24F.
    tu trouveras des exemples qui fonctionne sur la carte EXPLORER16 dont le schéma est dans le user manual.

    a+
    Dernière modification par gienas ; 15/10/2014 à 13h42. Motif: Correction de lien

  7. #6
    DAUDET78

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Citation Envoyé par mconf Voir le message
    nn c moi qu'elle a choisit de travailler ave lm35 puisque c'est le plus facile je pense
    Bof .... bof ... faut le dire vite !
    Le LM35 est analogique, donc il faut probablement un ampliOP entre lui et le µC.
    Alors qu'il existe des capteurs de température avec une liaison I²C , OneWire ou SPI qui ont une sortie directe avec le µC
    Voir cette discussion : http://forums.futura-sciences.com/el...ermometre.html
    J'aime pas le Grec

  8. #7
    mconf

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Tout d'abord merci beaucoup pour vos réponses.
    Et si j'ai besoin aussi dans mon projet d'un capteur de courant(-20A,20A) et de tension (0,600V) pour détecter le courant et la tension. Est ce que vous pouvez me conseiller par des capteurs assez précis et qui sont de petites tailles et qui n'ont pas besoin de beaucoup de circuit de conditionnement avec le pic24F.
    Ensuite je voudrais afficher la température, le courant et la tension sur un afficheur lcd (mais quel afficheur lcd?) et même pour lepic24F est ce que vous avez des référence plus adéquate que les autres.
    Merci d'avance

  9. #8
    DAUDET78

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Voir les capteurs LEM (depuis quelques ampères à XXX ampères)
    J'aime pas le Grec

  10. #9
    mconf

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Et pour LCD vous n'avez pas une idée

  11. #10
    gabuzo

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    ben pour le LCD c'est à toi de voir le texte que tu veux afficher, on ne peux pas savoir (choisir) à ta place.
    Je suis Charlie

  12. #11
    RISC

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Salut,

    Concernant le LCD : As-tu regardé le lien que j'ai déjà donné (carte EXPLORER16) ?????

    Il te suffit d'acheter un module LCD similaire (c'est très courant chez Farnell / RS) et tu pourras réutiliser le driver logiciel
    ( 2 lignes de 16 caractères )

    a+

  13. #12
    mconf

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Salut, merci bcp pour vos reponses; J'ai trouvé ces deux exemples sur Microship
    ww1.microchip.com/downloads/en/DeviceDoc/LCD%20with%20PMP.zip
    ww1.microchip.com/downloads/en/DeviceDoc/CE362_Hyperterminal_UART_PMP_L CD.zip
    J'arrive pas à comprendre la difference entre les deux exemples cad dans mon cas est ce que je doit utiliser la liaison UART ou bien j'utlise l premir exemple et c'est quoi PMP
    Merci d'avance

  14. #13
    bobflux

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Citation Envoyé par mconf Voir le message
    Merci pour vos réponses, nn c moi qu'elle a choisit de travailler ave lm35 puisque c'est le plus facile je pense de plus les erreurs est au niveau de lcd le code m'affiche ces erreurs ;
    TMR3ADC.c: In function 'lcd_delay':
    TMR3ADC.c:30: warning: implicit declaration of function 'mSecDelay'
    TMR3ADC.c: In function 'lcdNibble':
    TMR3ADC.c:36: warning: unused variable 'lcd'
    TMR3ADC.c: In function 'Display_Temperature':
    TMR3ADC.c:120: warning: implicit declaration of function 'Lcd_Out'
    TMR3ADC.c: In function 'main':
    TMR3ADC.c:151: warning: implicit declaration of function 'Delay'
    TMR3ADC.c:162: error: syntax error before 'Delay'
    TMR3ADC.c:165: warning: implicit declaration of function 'Lcd_Chr'
    TMR3ADC.c:172: warning: implicit declaration of function 'ADC_Read'
    TMR3ADC.c:178: warning: implicit declaration of function 'Delay_ms'
    Halting build on first failure as requested
    T'as oublié un include...

  15. #14
    mconf

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Le problème avec le pic24F il y a beaucoup es fonctions qui ne sont pas definis et nne contient pas bcp de fichir.h mem pour include lcd.h elle n'existe pas

  16. #15
    RISC

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Salut,
    J'ai l'impression que tu compiles des exemples fait pour d'autres compilateurs....
    Pour info, les exemples en C de Microchip se compilent avec XC16. Si tu trouves des exemples pour les cartes Mikroelektronika il faut impérativement utiliser leur compilateur.
    C'est également vrai pour CCS. Les programmes écrits pour le compilateur CCS ne compilent que sur CCS...
    A toi de faire un choix et de t'y tenir. A moins d'avoir les compétences suffisantes, il n'est pas simple de "convertir/migrer" du code qui utilise des librairies d'un compilateur vers un autre.
    a+

  17. #16
    mconf

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    salut, peut être vous avez raison mais comme j'ai deja dis je suis débutante en tous ce qui est microcontrôleurs et Pic. Mais dans mon cas je suis entrain d'utiliser le compilateur C30 et déjà les exemples qui se trouvent sur Microship sont avec C30http://www.microchip.com/CodeExamplesByFunc.aspx . De plus svp je vais connaitre est ce que il est obligatoire de choisir le PMP (port parallèle maitre) pour la configuration de LCD
    Merci d'avance

  18. #17
    RISC

    Re : Affichage de temperature sur un LCD a l'aide de pic24f

    Salut,

    Je pense malheureusement que en temps que débutante tu démarres avec des applications qui sont pour l'instant trop compliquées...Si tu ne peux pas faire la différence entre les programmes et les compilateurs qu'il faut utiliser avec, tu vas passer un temps infini pour rien sans comprendre à ce que tu fais.
    Il faut commencer par des choses simples...Faire clignoter des leds, lire un bouton poussoir, gérer un clavier...
    Les microcontroleurs c'est pas de la cuisine : il suffit pas de tout mettre dans le plat et de mélanger.
    Il faut adapter le logiciel à chaque microcontroleur et chaque module LCD est différent.
    Pour répondre à ta question, l'utilisation du PMP n'est pas une obligation, tu peux aussi utiliser un ports d'E/S.

    a+

Discussions similaires

  1. Affichage de température
    Par invite16f6e078 dans le forum Électronique
    Réponses: 12
    Dernier message: 30/05/2011, 07h15
  2. Affichage de la température
    Par antoine6 dans le forum Électronique
    Réponses: 3
    Dernier message: 29/06/2009, 20h44
  3. Affichage temperature sur LCD?
    Par invitee25bb931 dans le forum Électronique
    Réponses: 10
    Dernier message: 31/03/2008, 17h38
  4. affichage température
    Par invitead0ca0ba dans le forum Électronique
    Réponses: 14
    Dernier message: 14/06/2006, 08h36
  5. PPE Temperature et affichage.
    Par invited9663e40 dans le forum TPE / TIPE et autres travaux
    Réponses: 2
    Dernier message: 18/12/2005, 11h53
Découvrez nos comparatifs produits sur l'informatique et les technologies.