comp.lang.ada
 help / color / mirror / Atom feed
From: "Vo, Anh \(US SSA\)" <anh.vo@baesystems.com>
To: "Cesar Rabak" <csrabak@yahoo.com.br>, <comp.lang.ada@ada-france.org>
Subject: RE: Translating an embedded C algorithm
Date: Tue, 16 Jan 2007 19:00:51 -0800
Date: 2007-01-17T06:55:06+01:00	[thread overview]
Message-ID: <mailman.25.1169002876.18371.comp.lang.ada@ada-france.org> (raw)
In-Reply-To: <eoisct$imo$1@aioe.org>

-----Original Message-----
From: comp.lang.ada-bounces@ada-france.org [mailto:comp.lang.ada-bounces@ada-france.org] On Behalf Of Cesar Rabak

Vo, Anh (US SSA) escreveu:
> -----Original Message-----
[snipped]
A suggestion for the OP:

<    MINIMUM_ADC_COUNT : constant := Integer'Last;
<    MAXIMUM_ADC_COUNT : constant := Integer'Last;
<    SPACING : constant := 1;
..
 >    MINIMUM_ADC_COUNT : constant := 220;
 >    MAXIMUM_ADC_COUNT : constant := 468;
 >    SPACING : constant := 8;

The values 220 and 468 come from its Table 1 (PDF file). Also SPACING is 
described as being 8.

Thanks for pointing these values out. I did it in hurry. So, I did not read the PDF file in details. Today I attempted to find out where ReadEEPROM table or function is defined. I did not see it. In addition, I did ask for its definition. However, it was left out. Again, here it is.

   function ReadEEPROM (Temp : in Integer) return Integer is
   begin
      return Temp; -- for now
   end ReadEEPROM;

I assume ReadEEPROM is a function. Whether it is a table or a function, it needs to be defined. Assume that ReadEEPROM is defined, here is the updated version of it. Thanks to Christoph Grein for his correction.

------------------------------------------------------------------------
--| MeasureTemperature
--|
--| Calculates the temperature in ºC given the ADC count by lookup
--| table and linear interpolation of the diode circuit characteristic.
--|
--| Parameters:
--| AdcCount Raw ADC count.
--|
--| Returns:
--| Temperature in ºC x 10. INVALID_TEMPERATURE if out of range.
--| 
--| Note: GNAT-GPL-2006 compiler on Windows was used
-------------------------------------------------------------------------
function Measure_Temperature (Adc_Count : in Integer) return Integer is

   Index : Integer := 0;
   InterpolationDistance : Integer := 0;
   TempDiff : Integer := 0;
   TempCalOffset : Integer := 0;
   Temperature : Integer := 0;
   
   TEMPERATURE_TABLE_NUM_ENTRIES : constant := 32;
   Table : constant array (0 .. TEMPERATURE_TABLE_NUM_ENTRIES - 1) of Integer :=
                               (1171, 1116, 1061, 1006, 952,   899,  846,  793,
                                 741,  689,  638,  588, 537,   488,  438,  389,
                                 341,  293,  246,  199, 152,   106,   61,   16,
                                 -29,  -73, -116, -160, -202, -244, -286, -327);

   MINIMUM_ADC_COUNT : constant := 220;
   MAXIMUM_ADC_COUNT : constant := 246;
   SPACING : constant := 8; 
   TEMPERATURE_CAL_VALUE : constant := 0;

   -- *** Important Note: 
   -- The algorithm of the following function needs to be defined.
   function ReadEEPROM (Temp : in Integer) return Integer is
   begin
      return Temp; -- for now
   end ReadEEPROM;
   -----------------------------------------------------------
   
begin
   
   -- Index is the index into the table. Each table entry is 8 ADC
   -- counts higher than the last one, so subtract the offset and
   -- divide by 8 to find the table index. InterpolationDistance
   -- is the linear distance between the the table entry ADC cou nt
   -- and the actual ADC count.
   -- Check range of Adc_Count and saturate index if out of range.
   if (Adc_Count < MINIMUM_ADC_COUNT) then
      -- Underflow of ADC - saturate at minimum value
      Index := 0;
   elsif (Adc_Count > MAXIMUM_ADC_COUNT) then
      -- Overflow of ADC - saturate at maximum value
      Index := TEMPERATURE_TABLE_NUM_ENTRIES - 1;
   else
      -- Find the index of the table entry just below the ADC value
      Index := (Adc_Count - MINIMUM_ADC_COUNT) / SPACING;
   end if;
   
   -- Calculate the interpolation between the table entries either side of
   -- the ADC value. This is the remainder of the difference between the
   -- ADC count and the minimum temperature ADC count divided by the
   -- spacing between table entries. Since the spacing is a power of 2,
   -- this can be achieved by simply masking all but the bottom 3 bits.
   InterpolationDistance := (Adc_Count - MINIMUM_ADC_COUNT) mod (SPACING - 1);
   TempDiff := (Table(Index) - Table (Index+1));
   
   -- The temperature is then the base temperature minus the amount
   -- calculated by linear interpolation. The compiler is clever enough
   -- to know that dividing by 8 is a right shift of three bits.
   Temperature := Table(Index) - ((TempDiff * InterpolationDistance) / SPACING);
   
   -- To this is then added the calibration offset to the temperature table.
   TempCalOffset := ReadEeprom (TEMPERATURE_CAL_VALUE);
   Temperature := Temperature + TempCalOffset;
   
   return Temperature;
        
end Measure_Temperature;
         



  reply	other threads:[~2007-01-17  3:00 UTC|newest]

Thread overview: 102+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-15 14:36 Translating an embedded C algorithm Talulah
2007-01-16  0:06 ` Jeffrey Carter
2007-01-16  1:10   ` Marc A. Criley
2007-01-16  2:21   ` Cesar Rabak
2007-01-16 10:40     ` Markus E Leypold
2007-01-16 14:48       ` Larry Kilgallen
2007-01-16 17:32     ` Jeffrey Carter
2007-01-16 18:04       ` Cesar Rabak
2007-01-17  0:09         ` Jeffrey Carter
2007-01-17  1:07           ` Cesar Rabak
2007-01-16  4:37   ` Alexander E. Kopilovich
2007-01-16 13:37     ` Cesar Rabak
2007-01-16 23:47     ` Simon Wright
2007-01-17  1:02       ` Cesar Rabak
2007-01-16  3:50 ` Vo, Anh (US SSA)
2007-01-16 12:15   ` Niklas Holsti
2007-01-16 23:50     ` Simon Wright
2007-01-18 16:17     ` Niklas Holsti
2007-01-18 16:41       ` Ludovic Brenta
2007-01-18 20:02         ` Niklas Holsti
2007-01-18 22:25         ` Cesar Rabak
2007-01-19  8:32           ` Niklas Holsti
2007-01-19 19:15             ` Cesar Rabak
2007-01-19 20:49             ` Simon Wright
2007-01-18 16:55       ` Robert A Duff
2007-01-18 18:54         ` Jeffrey Carter
2007-01-19  0:45           ` Robert A Duff
2007-01-18 21:25         ` Niklas Holsti
2007-01-19  0:50           ` Robert A Duff
2007-01-19  4:43           ` Jeffrey Carter
2007-01-18 18:43       ` Jeffrey Carter
2007-01-18 20:19         ` Niklas Holsti
2007-01-18 20:30       ` Niklas Holsti
2007-01-18 23:34       ` Cesar Rabak
2007-01-19  8:57         ` Niklas Holsti
2007-01-19  2:11       ` Steve Whalen
2007-01-19 10:27         ` Niklas Holsti
2007-01-16 13:32   ` Cesar Rabak
2007-01-16 14:47   ` Gautier
2007-01-16 15:15     ` Cesar Rabak
2007-01-16 15:16     ` Jean-Pierre Rosen
2007-01-16 16:12       ` Ludovic Brenta
2007-01-16 17:10         ` Georg Bauhaus
2007-01-16 22:32           ` Ludovic Brenta
2007-01-17 20:22             ` Georg Bauhaus
2007-01-18  9:23               ` Ludovic Brenta
2007-01-16 17:12         ` Cesar Rabak
2007-01-16 17:20           ` Frank J. Lhota
2007-01-16 18:09             ` Cesar Rabak
2007-01-16 17:36           ` Dmitry A. Kazakov
2007-01-16 18:08             ` Cesar Rabak
2007-01-16 18:48               ` Dmitry A. Kazakov
2007-01-16 20:03                 ` Cesar Rabak
2007-01-18 19:33                   ` Björn Persson
2007-01-18 22:32                     ` Cesar Rabak
2007-01-19 20:26                       ` Björn Persson
2007-01-19 23:25                         ` Cesar Rabak
2007-01-19  7:15                     ` Maciej Sobczak
2007-01-19 20:27                       ` Björn Persson
2007-01-19 20:34                         ` Robert A Duff
2007-01-17 13:48           ` Maciej Sobczak
2007-01-17 23:32             ` Translating an embedded C algorithm -- OT Cesar Rabak
2007-01-18  8:56               ` Talulah
2007-01-18 22:05                 ` Cesar Rabak
2007-01-18  9:03               ` Maciej Sobczak
2007-01-18 10:22                 ` Alex R. Mosteo
2007-01-18 18:34                 ` Jeffrey Carter
2007-01-18 22:26                   ` Cesar Rabak
2007-01-19  4:45                     ` Jeffrey Carter
2007-01-18 22:18                 ` Cesar Rabak
2007-01-19 20:53                   ` Simon Wright
2007-01-16 15:55   ` Translating an embedded C algorithm Cesar Rabak
2007-01-17  3:00     ` Vo, Anh (US SSA) [this message]
2007-01-17 10:48       ` Cesar Rabak
2007-01-17 11:44       ` Niklas Holsti
2007-01-17 13:31         ` Talulah
2007-01-17 19:20           ` Jeffrey Carter
2007-01-18 14:19             ` Talulah
2007-01-18 15:28               ` Jean-Pierre Rosen
2007-01-18 23:27                 ` Cesar Rabak
2007-01-18 18:51               ` Jeffrey Carter
2007-01-18 22:30                 ` Cesar Rabak
2007-01-19  4:48                   ` Jeffrey Carter
2007-01-19 19:13                     ` Cesar Rabak
2007-01-20 20:56                       ` Jeffrey Carter
2007-01-19  2:21                 ` Alexander E. Kopilovich
2007-01-19  3:25                   ` Larry Kilgallen
2007-01-20  0:46                     ` Alexander E. Kopilovich
2007-01-20 13:03                       ` Larry Kilgallen
2007-01-20 16:54                         ` Alexander E. Kopilovich
2007-01-20 23:53                           ` Larry Kilgallen
2007-01-20 21:02                         ` Jeffrey Carter
2007-01-25 21:59                     ` Markus E Leypold
2007-01-26  4:06                       ` Larry Kilgallen
2007-01-26 11:26                         ` Markus E Leypold
2007-01-26 12:25                           ` Cesar Rabak
2007-01-19  4:52                   ` Jeffrey Carter
2007-01-19 10:13                   ` Warner BRUNS
2007-01-19 14:54                   ` Robert A Duff
2007-01-19  4:08 ` Steve
2007-01-19 20:41   ` Simon Wright
  -- strict thread matches above, loose matches on Subject: below --
2007-01-17  7:07 AW: " Grein, Christoph (Fa. ESG)
2007-01-17 10:26 ` Ludovic Brenta
2007-01-17 16:44   ` Markus E Leypold
2007-01-18  8:49     ` Ludovic Brenta
2007-01-19  9:33       ` Stephen Leake
2007-01-19 19:23         ` Cesar Rabak
2007-01-19 20:27           ` Robert A Duff
2007-01-20  9:54             ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox