Выбрать главу

//

void Text_To_Usart(unsigned char *m) {

 unsigned char i;

 i = 0;

 while(m[i] != 0) { // Send TEXT to serial port

  Usart_Write(m[i]);

  i++;

 }

}

//

// This function reads the temperature from analog input AN0

//

void Get_Temperature() {

 unsigned long Vin, Vdec,Vfrac;

 unsigned char op[12];

 unsigned char i,j;

 Vin = Adc_Read(0);   // Read from channel 0 (AN0)

 Vin = 488*Vin;       // Scale up the result

 Vin = Vin /10;       // Convert to temperature in C

  Vdec = Vin / 100;   // Decimal part

  Vfrac = Vin % 100;  // Fractional part

  LongToStr(Vdec,op); // Convert Vdec to string in op

 //

 // Remove leading blanks

 //

 j=0;

 for(i=0;i<=11;i++) {

  if(op[i] != ' ')        // If a blank

  {

   temperature[j]=op[i];

   j++;

  }

 }

 temperature[j] = '.';    // Add “.”

 ch1 = Vfrac / 10;        // fractional part

 ch2 = Vfrac % 10;

 j++;

 temperature[j] = 48+ch1; // Add fractional part

 j++;

 temperature[j] = 48+ch2;

 j++;

 temperature[j] = 0x0D;   // Add carriage-return

 j++;

 temperature[j] = 0x0A;   // Add line-feed

 j++;

 temperature[j]='\0';

}

//

// Start of MAIN program

//

void main() {

 rec_size = 0;

 //

 // Configure A/D converter

 //

 TRISA = 0xFF;

 ADCON1 = 0x80;

 // Use AN0, Vref = +5V

 //

 // Configure the serial port

 //

 Usart_Init(2400);

 //

 // Initialize the SPI bus

 //

 Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE,

  CLK_IDLE_LOW, LOW_2_HIGH);

 //

 // Initialize the SD card bus

 //

 while(Mmc_Init(&PORTC,2));

 //

 // Initialize the FAT file system

 //

 while(Mmc_Fat_Init(&PORTC,2));

 //

 // Display the MENU and get user choice

 //

 Newline();

 Text_To_Usart("TEMPERATURE DATA LOGGER");

 Newline();

 Newline();

 Text_To_Usart("1. Send temperature data to the PC");

 Newline();

 Text_To_Usart("2. Save temperature data in a new file");

 Newline();

 Text_To_Usart("3. Append temperature data to an existing file");

 Newline();

 Newline();

 Text_To_Usart("Choice ? ");

 //

 // Read a character from the PC keyboard

 //

 flag = 0;

 do {

  if (Usart_Data_Ready()) // If data received

  {

   choice = Usart_Read(); // Read the received data

   Usart_Write(choice);   // Echo received data

   flag = 1;

  }

 } while (!flag);

 Newline();

 Newline();

 //

 // Now process user choice

 //

 switch(choice) {

 case '1':

  ret_status = Mmc_Fat_Assign(&filename,1);

  if (!ret_status) {

   Text_To_Usart("File does not exist..No saved data...");

   Newline();

   Text_To_Usart("Restart the program and save data to the file...");

   Newline();

   for(;;);

  } else {

   //

   // Read the data and send to UART

   //

   Text_To_Usart("Sending saved data to the PC...");

   Newline();

   Mmc_Fat_Reset(&file_size);

   for(i=0; i<file_size; i++) {

    Mmc_Fat_Read(&character);

    Usart_Write(character);

   }

   Newline();

   text_To_Usart("End of data...");

   Newline();

   for(;;);

  }

 case '2':

  //

  // Start the A/D converter, get temperature readings every

  // 10 seconds, and then save in a NEW file

  //

  Text_To_Usart("Saving data in a NEW file...");

  Newline();

  Mmc_Fat_Assign(&filename, 0x80); // Assign the file

  Mmc_Fat_Rewrite(); // Clear

  Mmc_Fat_Write("TEMPERATURE DATA - SAVED EVERY 10 SECONDS\r\n", 43);

  //

  // Read the temperature from A/D converter, format and save

  //

  for(;;) {

   Mmc_Fat_Append();

   Get_Temperature();

   Mmc_Fat_Write(temperature,9);

   rec_size++;

   LongToStr(rec_size,txt);

   Newline();

   Text_To_Usart("Saving record:");

   Text_To_Usart(txt);

   Delay_ms(10000);

  }

  break;

 case '3':

  //

  // Start the A/D converter, get temperature readings every

  // 10 seconds, and then APPEND to the existing file

  //

  Text_To_Usart("Appending data to the existing file...");

  Newline();

  ret_status = Mmc_Fat_Assign(&filename,1); // Assign the file

  if (!ret_status) {

   Text_To_Usart("File does not exist - can not append...");

   Newline();