// 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) ; }