LCD HD44780 probleme affichage suite operation depuis 18B20.
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

LCD HD44780 probleme affichage suite operation depuis 18B20.



  1. #1
    inviteac751535

    LCD HD44780 probleme affichage suite operation depuis 18B20.


    ------

    Bonsoir a tous,

    Sur mon LCD HD44780 1602L je viens de rencontrer un probleme concernant l'affichage d'une temperature apres traitement.
    En, effet sur mon PIC 18F4550 a 4Mhz je recupere 2 octets d'une sonde 18B20.5jusque la pas de soucis).
    Cependant par la suite je traite ces 2 octets pour en tirer un affichage ex: "+22.75 C" ce qui correspond aux octets
    Octet L= 0011 0110 et Octet H=1000 0000.
    ce qui me donne normalement apres traitement une chaine --> char chaine={0x2D,50,50,0x2E,55,53, 0x20,0x43,'\0'}

    voici le code (dans l'algo de traitement temeprature on peut avoir une positive et une negative)
    Code:
    #include <p18f4550.h>
    #include <delays.h>
    #include <stdio.h>
    #include "xlcd.h"
    #include "project.h"   
    
    #pragma config WDT = OFF	//watchdog OFF
    #pragma config FOSC = HS
    
    //definition des variables globales
    
    unsigned char sondeT[5]={0xFE,0x07,0xFE,0x07};
    char temp1 [15] = "";//variable affichage temperature
    	
    //*******************************************************************
    //					Fonction Main									*
    //*******************************************************************
    
    void main (void)
    {
    
    ADCON0=0;
    ADCON1=0x0f;
    
    //initialisation hardware
    LcdInit();
    
    
                  while(1) //boucle infinie du programme vide car uniquement interruptions
                 {
                 //*********partie non traitee pour essai***************
                 //sondes DS18B20
    	//Delay10TCYx(10);
    	//Sonde_Reset();
    	//Sonde_Write(0xCC);
    	//Sonde_Write(0x44);
    	//Delay10KTCYx(100); 
    	//Sonde_Reset();
    	//Sonde_Write(0xCC);
    	//Sonde_Write(0xBE);
    	//Sonde_Readbyte(sondeT,0);
    	//Sonde_Readbyte(sondeT,1);
    	//**********************************************
    	
    	Temp_String (temp1,sondeT[0],sondeT[1]);//conversion temperature en chaine de caractere pour affichage LCD
    	
                 SetDDRamAddr(0x80);//debut 1ere ligne
    	putsXLCD(temp1);//affichage de l'heure
    	while( BusyXLCD() );
    	
                 }//fin de la boucle
    
    }//fin du main
    
    
    
    //*******************************************************************
    //					Fonctions d'Initialisation						*
    //*******************************************************************
    
    void LcdInit(void) // initalisation du LCD sur PORTD (D0-D6)
    {
    PORTD=0x00; 
    TRISD=0x00;    
    LATD=0x00;
    
    OpenXLCD( FOUR_BIT & LINES_5X7 );
    while( BusyXLCD() );
    WriteCmdXLCD( FOUR_BIT & LINES_5X7 );
    while( BusyXLCD() );
    WriteCmdXLCD( DON & BLINK_OFF);
    while( BusyXLCD() );
    }
    
    //*******************************************************************
    //					Fonctions de temporisation						*
    //					pour les fonctions LCD							*
    //*******************************************************************
    
    void DelayFor18TCY( void ) //50micro
    {
    Delay10TCYx(6);
    return;
    }
    void DelayPORXLCD(void)//15ms
    {
    Delay1KTCYx(16); 
    return;
    }
    void DelayXLCD(void)//5ms
    {
    Delay1KTCYx(6); 
    return;
    }
    
    //*********************************************************
    //             fonction traitement des octets hauts et bas                          *
    //*********************************************************
    
    void Temp_String (char * buffer,unsigned char byteL,unsigned char byteH)
    {
    	static unsigned int decimales;static unsigned char result;
    
    	if((byteH&0xF8)==0xF8) // temperature negative
    	{
    	//la virgule
    	decimales =(((0xFF-byteL)+1)&0x0F)*625;
    	//les entiers
    	result=(((0xFF-byteL)+1)>>4)|(((0xFF-byteH)&0x07)<<4);
    	//------>if (result>9)sprintf (buffer, "-%d.%3u C",result,decimales);
    	//------>else sprintf (buffer, "-0%d.%3u C",result,decimales);
    	buffer[0]=0x2D;
    	buffer[1]=((result/10)+48);
    	buffer[2]=((result-((buffer[1]-48)*10))+48);
    	buffer[3]=0x2E;
    	buffer[4]=((decimales/1000)+48);
    	buffer[5]=(((decimales-((buffer[4]-48)*1000))/100)+48);
    	buffer[6]=0x20;
    	buffer[7]=0x43;
    	buffer[8]='\0';
    	}
    	
    	else
    	{
    	//la virgule
    	decimales =(byteL&0x0F)*625;
    	//les entiers
    	result=(byteL>>4)|((byteH&0x07)<<4);
    	//en string
    	//---------->if (result>9)sprintf (buffer, "+%d.%3u C",result,decimales);
    	//---------->else sprintf (buffer, "+0%d.%3u C",result,decimales);
    	buffer[0]=0x2B;
    	buffer[1]=((result/10)+48);
    	buffer[2]=((result-((buffer[1]-48)*10))+48);
    	buffer[3]=0x2E;
    	buffer[4]=((decimales/1000)+48);
    	buffer[5]=(((decimales-((buffer[4]-48)*1000))/100)+48);
    	buffer[6]=0x20;
    	buffer[7]=0x43;
    	buffer[8]='\0';
    	
    	}
    	
    }
    vous l'aurez compris c'est juste une conversion en ajoutant le '0' ascii soit "48".
    mais l'ideal pour moi aurait été d'utiliser la fonction Sprintf de Stdio.h mais la impossible malgre quelques aide nottement le fameux que je n'ai pas reussi a le faire fonctionner sur mon LCD
    Code:
    stdout=_H_USER; //dans le main
    
    int _user_putc(char c)
    {
    putcXLCD(c);
    }
    
    fprintf (_H_USER,"ecriture sur LCD");
    Pour mon code il semblerait que ce soir le traitement qui donne ces resultats bizarre --->"+/ .LL C"
    j'ai essayer de mettre directement dans la fonction de triatement les valeurs "0x2D,50,50,0x2E,55,53,0x20,0x 43,'\0'". et ca marche bien (juste pour voir si ca venait du pointeur).

    bref si vous avez une idee pour mon probleme merci car la je ne comprends plus et ce LCD me tue...juste pour un foutu affichage!!!!

    au fait quel est le meilleur moyen d'alimenter un LCD pour ne pas qui claque apres plusieurs on/off...le mien vient de s'affaiblir le retroeclairage est tres tres faible.

    merci a tous

    -----

  2. #2
    inviteac751535

    Re : LCD HD44780 probleme affichage suite operation depuis 18B20.

    au fait pour l'essai et que je veux avoir 22.75 degrees je mets sondeT={0x6C,0x01,00,00}
    juste pour preciser
    merci

  3. #3
    inviteac751535

    Re : LCD HD44780 probleme affichage suite operation depuis 18B20.

    Une autre chose...encore une fois, ca marche tres bien sur isis....je sais c'est pas "la vrai vie" la sim mais ca marche nickel.

Discussions similaires

  1. Petite question sur LCD 2*16 Chipset HD44780
    Par invitea682ef93 dans le forum Électronique
    Réponses: 6
    Dernier message: 26/06/2010, 14h06
  2. Pb avec LCD 20x2 GB-1494-0 (HD44780+T6961A)
    Par invite6cb8b74b dans le forum Électronique
    Réponses: 13
    Dernier message: 13/07/2009, 14h49
  3. LCD hd44780
    Par invite310d6b50 dans le forum Électronique
    Réponses: 7
    Dernier message: 06/12/2007, 09h06
  4. lcd HD44780 4x20
    Par invitefc1671e3 dans le forum Électronique
    Réponses: 11
    Dernier message: 27/11/2006, 11h50
  5. LCD HD44780 ---> programme C
    Par invitea093086b dans le forum Électronique
    Réponses: 3
    Dernier message: 16/02/2005, 15h24
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...