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