Thermometre USB v2

// LCD module connections
sbit LCD_RS at LATB0_bit;
sbit LCD_EN at LATB1_bit;
sbit LCD_D4 at LATB2_bit;
sbit LCD_D5 at LATB3_bit;
sbit LCD_D6 at LATB4_bit;
sbit LCD_D7 at LATB5_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;
// End LCD module connections

#include "USBdsc.c"
#define TAILLE_BUFFER  64
#define TAILLE_MOYENNE 10
#define PE             5.
#define N              1024.
#define ALPHA          0.0039
#define E              5.
#define VOIE_OFFSET    2
#define VOIE_PT500     1
#define VOIE_LM35      0
#define GAIN_INA126    5

#define TMR0_PRECHARGE 28036

#define name           "Thermometre USB"
#define soft_rev       "1.1.0"
#define hard_rev       "1.0"
#define mcu            "PIC18F4550"
#define clk            "48MHz"
#define developper     "Amaury LAURENT"
#define release_date   "03/11/2012"

char ReadBuffer[TAILLE_BUFFER] absolute 0x500;
char WriteBuffer[TAILLE_BUFFER] absolute 0x540;

int GetSample (int channel);
char toogle = 0;

void Vider_Buffer(char * Buffer)
{
     char i;
     for (i=0;i<TAILLE_BUFFER;i++) Buffer[i]=0;
}

void interrupt()
{
    float value;
    float offset;
    float temp_pt500 = 0;

    char ligne1[17];
    char ligne2[17];
    
    if (PIR2.USBIF == 1)
    {
      INTCON.TMR0IE = 0;
      USB_Interrupt_Proc();

      if (HID_Read() != 0) {
        Vider_Buffer(WriteBuffer);
        if (strstr(ReadBuffer, "LM35?") != 0) {
           value = GetSample(VOIE_LM35) * PE / N;
           sprintf(WriteBuffer, "%2.1f",value/0.01);
        }
        else if (strstr(ReadBuffer, "MAX35?") != 0) {
           value = 4.99;
           sprintf(WriteBuffer, "%2.1f",value/0.01);
        }
        else if (strstr(ReadBuffer, "MIN35?") != 0) {
           value = 0.0;
           sprintf(WriteBuffer, "%2.1f",value/0.01);
        }
        else if (strstr(ReadBuffer, "PT500?") != 0) {
           offset =  (GetSample(VOIE_OFFSET) * PE / N);
           value = ((GetSample(VOIE_PT500) * PE / N) - offset)/GAIN_INA126;
           temp_pt500 = (4. * value) / (ALPHA * (2.*value + E));
           sprintf(WriteBuffer, "%2.1f",temp_pt500);
        }
        else if (strstr(ReadBuffer, "MAX500?") != 0) {
           offset =  (GetSample(VOIE_OFFSET) * PE / N);
           value = (4.99 - offset)/GAIN_INA126;
           temp_pt500 = (4. * value) / (ALPHA * (2.*value + E));
           sprintf(WriteBuffer, "%2.1f",temp_pt500);
        }
        else if (strstr(ReadBuffer, "MIN500?") != 0) {
           offset =  (GetSample(VOIE_OFFSET) * PE / N);
           value = (0.0 - offset)/GAIN_INA126;
           temp_pt500 = (4. * value) / (ALPHA * (2.*value + E));
           sprintf(WriteBuffer, "%2.1f",temp_pt500);
        }
        else if (strstr(ReadBuffer, "*IDN?") != 0) {
           strcpy(WriteBuffer, name);
        }
        else if (strstr(ReadBuffer, "*SREV?") != 0) {
           strcpy(WriteBuffer, soft_rev);
        }
        else if (strstr(ReadBuffer, "*HREV?") != 0) {
           strcpy(WriteBuffer, hard_rev);
        }
        else if (strstr(ReadBuffer, "*MCU?") != 0) {
           strcpy(WriteBuffer, mcu);
        }
        else if (strstr(ReadBuffer, "*CLK?") != 0) {
           strcpy(WriteBuffer, clk);
        }
        else if (strstr(ReadBuffer, "*AGE?") != 0) {
           strcpy(WriteBuffer, release_date);
        }
        else if (strstr(ReadBuffer, "*DEV?") != 0) {
           strcpy(WriteBuffer, developper);
        }
        else {
             strcpy(WriteBuffer, "Unknown command");
        }
        while(!HID_Write(&WriteBuffer, TAILLE_BUFFER));
        /*
        Lcd_Out(1,1,ReadBuffer);
        Lcd_Out(2,1,WriteBuffer);
        */
        Vider_Buffer(ReadBuffer);
      }

      INTCON.TMR0IE = 1;
    }

    if (INTCON.TMR0IF == 1) {
       PIE2.USBIE = 0;
       TMR0L = TMR0_PRECHARGE % 256;
       TMR0H = TMR0_PRECHARGE / 256;
       
       if (toogle == 0) {
          Lcd_Init();
          Lcd_Cmd(_LCD_CLEAR);
          Lcd_Cmd(_LCD_CURSOR_OFF);
          toogle = 1;
       }

       value = GetSample(VOIE_LM35) * PE / N;
       sprintf(ligne2, "LM35: %2.1f °C  ",value/0.01);
       Lcd_Out(2,1,ligne2);

       offset =  (GetSample(VOIE_OFFSET) * PE / N);
       value = ((GetSample(VOIE_PT500) * PE / N) - offset)/GAIN_INA126;
       temp_pt500 = (4. * value) / (ALPHA * (2.*value + E));
       sprintf(ligne1, "Pt500: %2.1f °C  ",temp_pt500);
       Lcd_Out(1,1,ligne1);

       INTCON.TMR0IF = 0;
       PIE2.USBIE = 1;
    }
}

void InitPic() {
     ADCON1=0b1011;
     CMCON = 7;
     TRISB = 0;
     TRISD.f0 = 0;
     TRISD.f1 = 0;
     
     LATD.f0 = 1;
     LATD.f1 = 1;
     
     //------ Display Timer IT -------
    INTCON.GIE = 1;
    INTCON.PEIE = 1;
    INTCON.TMR0IE = 1;
    PIE2.TMR1IE = 1;

    TMR0L = TMR0_PRECHARGE % 256;
    TMR0H = TMR0_PRECHARGE / 256;
    T0CON = 0b110000100; // PS = 32
     
    //------------- USB -------------
    TRISC.f4=1;  //D-
    TRISC.f5=1;  //D+
    HID_Enable(&ReadBuffer,&WriteBuffer);
}

int GetSample (int channel) {
    int i;
    int mean;
    
    mean = 0;
    
    for (i=0; i<TAILLE_MOYENNE; i++)
    {
      mean += ADC_Read(channel);
    }
    mean /= TAILLE_MOYENNE;
    return mean;
}

void main() {
     
     InitPic();

     while(1) ;
}