EmbeddedRelated.com
Forums

ADC sequence problem

Started by igal_usa July 28, 2008
I posted a similar question a while ago but didn't post enough info.
I use MSP430F169. I use ADC12 to measure different inputs at a time.
the problem is that the ADC once in a while (which makes it hard to
debug) is stuck and doesn't finish conversion. for example if I expect
the ADC12IFG to be 0xFFFF at the end of the conversion I see that it
is 0xFFFE. during debug if I force '1' at ADC12SC then immediately
ADC12IFG = 0xFFFF.
here is the way I use the ADC throughout the program:

void adc12_init(void)
{
ADC12CTL0 &= ~ENC; // ADC12CTL0 and ADC12CTL1 can be modified only
when ENC = 0.

ADC12CTL0 = SHT1_4 + SHT0_4 + MSC + ADC12ON;
// Sample and Hold for Mem8-15 - 32 ADC12CLK
cycles.
// Sample and Hold for Mem0-7 - 32 ADC12CLK
cycles.
// Multiple Sample&Conversion.
ADC12CTL1 = CSTARTADD_0 + SHS_0 + SHP + CONSEQ_1;

ADC12MCTL0 = SREF_0 + INCH_3; // Memory0 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL1 = SREF_0 + INCH_3; // Memory1 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL2 = SREF_0 + INCH_3; // Memory2 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL3 = SREF_0 + INCH_3; // Memory3 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL4 = SREF_0 + INCH_3; // Memory4 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL5 = SREF_0 + INCH_3; // Memory5 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL6 = SREF_0 + INCH_3; // Memory6 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL7 = SREF_0 + INCH_3; // Memory7 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL8 = SREF_0 + INCH_4; // Memory8 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL9 = SREF_0 + INCH_4; // Memory9 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL10 = SREF_0 + INCH_4; // Memory10 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL11 = SREF_0 + INCH_4; // Memory11 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL12 = SREF_0 + INCH_4; // Memory12 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL13 = SREF_0 + INCH_4; // Memory13 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL14 = SREF_0 + INCH_4; // Memory14 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL15 = EOS + SREF_0 + INCH_4; // Memory15 is sourced by
channel7, Vref = VCC. - IR Power
ADC12CTL0 |= ENC + ADC12SC; // ADC12 ON -
Enable conversion.
}

the above proc. run only once at the initialization stage, it will
start the sequence of conversion.

if (ADC12IFG == 0xFFFF)
Get_A2D_Value(); //starts the sequence of conversion after
getting the last conversion value

the above 2 lines run constantly in the main infinite loop.

void Get_A2D_Value (void)
{
unsigned int a2d_buffer_ch[2];

a2d_buffer_ch[0] = ADC12MEM0; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM1; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM2; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM3; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM4; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM5; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM6; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM7; //A/D reference voltage Value

a2d_buffer_ch[1] = ADC12MEM8; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM9; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM10; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM11; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM12; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM13; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM14; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM15; //A/D reference voltage Value

Red_power.int_data = a2d_buffer_ch[0] >> 3;
IR_power.int_data = a2d_buffer_ch[1] >> 3;
ADC12IFG = 0x00; //Reset the ADC12 interrupt vector
ADC12CTL0 |= ENC + ADC12SC; // ADC12 ON -
Enable conversion.
}

Thank you for your help
Igal

Beginning Microcontrollers with the MSP430

Try 2 things:

1. You rely on EOS in ADC12MCTL15 to terminate the sequence, so wait
until the corresponding IFG bit is set.
So replace:
if (ADC12IFG == 0xFFFF)
with
if (ADC12IFG & 0x8000)

2. Reading an output register (eg ADC12MCTL0) clears the corresponding IFG bit.
So remove the line:
ADC12IFG = 0x00; //Reset the ADC12 interrupt vector

Also be sure that you don't enter LPM3 until a complete sequence of
channels conversion has completed.
Hugh

At 08:47 AM 7/28/2008, you wrote:
I posted a similar question a while ago but didn't post enough info.
I use MSP430F169. I use ADC12 to measure different inputs at a time.
the problem is that the ADC once in a while (which makes it hard to
debug) is stuck and doesn't finish conversion. for example if I expect
the ADC12IFG to be 0xFFFF at the end of the conversion I see that it
is 0xFFFE. during debug if I force '1' at ADC12SC then immediately
ADC12IFG = 0xFFFF.
here is the way I use the ADC throughout the program:

void adc12_init(void)
{
ADC12CTL0 &= ~ENC; // ADC12CTL0 and ADC12CTL1 can be modified only
when ENC = 0.

ADC12CTL0 = SHT1_4 + SHT0_4 + MSC + ADC12ON;
// Sample and Hold for Mem8-15 - 32 ADC12CLK
cycles.
// Sample and Hold for Mem0-7 - 32 ADC12CLK
cycles.
// Multiple Sample&Conversion.
ADC12CTL1 = CSTARTADD_0 + SHS_0 + SHP + CONSEQ_1;

ADC12MCTL0 = SREF_0 + INCH_3; // Memory0 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL1 = SREF_0 + INCH_3; // Memory1 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL2 = SREF_0 + INCH_3; // Memory2 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL3 = SREF_0 + INCH_3; // Memory3 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL4 = SREF_0 + INCH_3; // Memory4 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL5 = SREF_0 + INCH_3; // Memory5 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL6 = SREF_0 + INCH_3; // Memory6 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL7 = SREF_0 + INCH_3; // Memory7 is sourced by channel4,
Vref = VCC. - Red Power
ADC12MCTL8 = SREF_0 + INCH_4; // Memory8 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL9 = SREF_0 + INCH_4; // Memory9 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL10 = SREF_0 + INCH_4; // Memory10 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL11 = SREF_0 + INCH_4; // Memory11 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL12 = SREF_0 + INCH_4; // Memory12 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL13 = SREF_0 + INCH_4; // Memory13 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL14 = SREF_0 + INCH_4; // Memory14 is sourced by channel7,
Vref = VCC. - IR Power
ADC12MCTL15 = EOS + SREF_0 + INCH_4; // Memory15 is sourced by
channel7, Vref = VCC. - IR Power
ADC12CTL0 |= ENC + ADC12SC; // ADC12 ON -
Enable conversion.
}

the above proc. run only once at the initialization stage, it will
start the sequence of conversion.

if (ADC12IFG == 0xFFFF)
Get_A2D_Value(); //starts the sequence of conversion after
getting the last conversion value

the above 2 lines run constantly in the main infinite loop.

void Get_A2D_Value (void)
{
unsigned int a2d_buffer_ch[2];

a2d_buffer_ch[0] = ADC12MEM0; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM1; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM2; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM3; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM4; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM5; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM6; //A/D reference voltage Value
a2d_buffer_ch[0] += ADC12MEM7; //A/D reference voltage Value

a2d_buffer_ch[1] = ADC12MEM8; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM9; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM10; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM11; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM12; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM13; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM14; //A/D reference voltage Value
a2d_buffer_ch[1] += ADC12MEM15; //A/D reference voltage Value

Red_power.int_data = a2d_buffer_ch[0] >> 3;
IR_power.int_data = a2d_buffer_ch[1] >> 3;
ADC12IFG = 0x00; //Reset the ADC12 interrupt vector
ADC12CTL0 |= ENC + ADC12SC; // ADC12 ON -
Enable conversion.
}

Thank you for your help
Igal

I did as you suggested:
if (ADC12IFG & 0x8000)
{
if (ADC12IFG != 0xFFFF)
_NOP();

Get_A2D_Value();
}

I added the second IF just to see if it continues happening, and it
happens every time, only on the FIRST sequence.
any ideas?
ps
I don't get into any low power mode.

thank you
Igal
--- In m..., Hugh Molesworth wrote:
>
> Try 2 things:
>
> 1. You rely on EOS in ADC12MCTL15 to terminate the sequence, so wait
> until the corresponding IFG bit is set.
> So replace:
> if (ADC12IFG == 0xFFFF)
> with
> if (ADC12IFG & 0x8000)
>
> 2. Reading an output register (eg ADC12MCTL0) clears the
corresponding IFG bit.
> So remove the line:
> ADC12IFG = 0x00; //Reset the ADC12 interrupt vector
>
> Also be sure that you don't enter LPM3 until a complete sequence of
> channels conversion has completed.
> Hugh
>
> At 08:47 AM 7/28/2008, you wrote:
> I posted a similar question a while ago but didn't post enough info.
> I use MSP430F169. I use ADC12 to measure different inputs at a time.
> the problem is that the ADC once in a while (which makes it hard to
> debug) is stuck and doesn't finish conversion. for example if I expect
> the ADC12IFG to be 0xFFFF at the end of the conversion I see that it
> is 0xFFFE. during debug if I force '1' at ADC12SC then immediately
> ADC12IFG = 0xFFFF.
> here is the way I use the ADC throughout the program:
>
> void adc12_init(void)
> {
> ADC12CTL0 &= ~ENC; // ADC12CTL0 and ADC12CTL1 can be modified only
> when ENC = 0.
>
> ADC12CTL0 = SHT1_4 + SHT0_4 + MSC + ADC12ON;
> // Sample and Hold for Mem8-15 - 32 ADC12CLK
> cycles.
> // Sample and Hold for Mem0-7 - 32 ADC12CLK
> cycles.
> // Multiple Sample&Conversion.
> ADC12CTL1 = CSTARTADD_0 + SHS_0 + SHP + CONSEQ_1;
>
> ADC12MCTL0 = SREF_0 + INCH_3; // Memory0 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL1 = SREF_0 + INCH_3; // Memory1 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL2 = SREF_0 + INCH_3; // Memory2 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL3 = SREF_0 + INCH_3; // Memory3 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL4 = SREF_0 + INCH_3; // Memory4 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL5 = SREF_0 + INCH_3; // Memory5 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL6 = SREF_0 + INCH_3; // Memory6 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL7 = SREF_0 + INCH_3; // Memory7 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL8 = SREF_0 + INCH_4; // Memory8 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL9 = SREF_0 + INCH_4; // Memory9 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL10 = SREF_0 + INCH_4; // Memory10 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL11 = SREF_0 + INCH_4; // Memory11 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL12 = SREF_0 + INCH_4; // Memory12 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL13 = SREF_0 + INCH_4; // Memory13 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL14 = SREF_0 + INCH_4; // Memory14 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL15 = EOS + SREF_0 + INCH_4; // Memory15 is sourced by
> channel7, Vref = VCC. - IR Power
> ADC12CTL0 |= ENC + ADC12SC; // ADC12 ON -
> Enable conversion.
> }
>
> the above proc. run only once at the initialization stage, it will
> start the sequence of conversion.
>
> if (ADC12IFG == 0xFFFF)
> Get_A2D_Value(); //starts the sequence of conversion after
> getting the last conversion value
>
> the above 2 lines run constantly in the main infinite loop.
>
> void Get_A2D_Value (void)
> {
> unsigned int a2d_buffer_ch[2];
>
> a2d_buffer_ch[0] = ADC12MEM0; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM1; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM2; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM3; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM4; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM5; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM6; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM7; //A/D reference voltage Value
>
> a2d_buffer_ch[1] = ADC12MEM8; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM9; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM10; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM11; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM12; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM13; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM14; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM15; //A/D reference voltage Value
>
> Red_power.int_data = a2d_buffer_ch[0] >> 3;
> IR_power.int_data = a2d_buffer_ch[1] >> 3;
> ADC12IFG = 0x00; //Reset the ADC12 interrupt vector
> ADC12CTL0 |= ENC + ADC12SC; // ADC12 ON -
> Enable conversion.
> }
>
> Thank you for your help
> Igal
>

Try setting ADC12SC after ENC, ie enable then trigger, instead of
setting them together, which is how I have used this part before. In
sequence of channels mode the user manual implies that they can be
set together, but there are a number of timing errata on the ADC12 in
the '149 and it looks like you are losing the very first interrupt.
Even though that first IFG is lost, that doesn't necessarily mean the
data is not valid.

Try replacing:
ADC12CTL0 |= ENC + ADC12SC; // ADC12 ON -
with:
ADC12CTL0 |= ENC; // ADC12 ON -
ADC12CTL0 |= ADC12SC; // ADC12 Start

Hugh

At 11:55 PM 7/28/2008, you wrote:
I did as you suggested:
if (ADC12IFG & 0x8000)
{
if (ADC12IFG != 0xFFFF)
_NOP();

Get_A2D_Value();
}

I added the second IF just to see if it continues happening, and it
happens every time, only on the FIRST sequence.
any ideas?
ps
I don't get into any low power mode.

thank you
Igal
--- In m..., Hugh Molesworth wrote:
>
> Try 2 things:
>
> 1. You rely on EOS in ADC12MCTL15 to terminate the sequence, so wait
> until the corresponding IFG bit is set.
> So replace:
> if (ADC12IFG == 0xFFFF)
> with
> if (ADC12IFG & 0x8000)
>
> 2. Reading an output register (eg ADC12MCTL0) clears the
corresponding IFG bit.
> So remove the line:
> ADC12IFG = 0x00; //Reset the ADC12 interrupt vector
>
> Also be sure that you don't enter LPM3 until a complete sequence of
> channels conversion has completed.
> Hugh
>
> At 08:47 AM 7/28/2008, you wrote:
> I posted a similar question a while ago but didn't post enough info.
> I use MSP430F169. I use ADC12 to measure different inputs at a time.
> the problem is that the ADC once in a while (which makes it hard to
> debug) is stuck and doesn't finish conversion. for example if I expect
> the ADC12IFG to be 0xFFFF at the end of the conversion I see that it
> is 0xFFFE. during debug if I force '1' at ADC12SC then immediately
> ADC12IFG = 0xFFFF.
> here is the way I use the ADC throughout the program:
>
> void adc12_init(void)
> {
> ADC12CTL0 &= ~ENC; // ADC12CTL0 and ADC12CTL1 can be modified only
> when ENC = 0.
>
> ADC12CTL0 = SHT1_4 + SHT0_4 + MSC + ADC12ON;
> // Sample and Hold for Mem8-15 - 32 ADC12CLK
> cycles.
> // Sample and Hold for Mem0-7 - 32 ADC12CLK
> cycles.
> // Multiple Sample&Conversion.
> ADC12CTL1 = CSTARTADD_0 + SHS_0 + SHP + CONSEQ_1;
>
> ADC12MCTL0 = SREF_0 + INCH_3; // Memory0 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL1 = SREF_0 + INCH_3; // Memory1 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL2 = SREF_0 + INCH_3; // Memory2 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL3 = SREF_0 + INCH_3; // Memory3 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL4 = SREF_0 + INCH_3; // Memory4 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL5 = SREF_0 + INCH_3; // Memory5 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL6 = SREF_0 + INCH_3; // Memory6 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL7 = SREF_0 + INCH_3; // Memory7 is sourced by channel4,
> Vref = VCC. - Red Power
> ADC12MCTL8 = SREF_0 + INCH_4; // Memory8 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL9 = SREF_0 + INCH_4; // Memory9 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL10 = SREF_0 + INCH_4; // Memory10 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL11 = SREF_0 + INCH_4; // Memory11 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL12 = SREF_0 + INCH_4; // Memory12 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL13 = SREF_0 + INCH_4; // Memory13 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL14 = SREF_0 + INCH_4; // Memory14 is sourced by channel7,
> Vref = VCC. - IR Power
> ADC12MCTL15 = EOS + SREF_0 + INCH_4; // Memory15 is sourced by
> channel7, Vref = VCC. - IR Power
> ADC12CTL0 |= ENC + ADC12SC; // ADC12 ON -
> Enable conversion.
> }
>
> the above proc. run only once at the initialization stage, it will
> start the sequence of conversion.
>
> if (ADC12IFG == 0xFFFF)
> Get_A2D_Value(); //starts the sequence of conversion after
> getting the last conversion value
>
> the above 2 lines run constantly in the main infinite loop.
>
> void Get_A2D_Value (void)
> {
> unsigned int a2d_buffer_ch[2];
>
> a2d_buffer_ch[0] = ADC12MEM0; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM1; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM2; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM3; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM4; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM5; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM6; //A/D reference voltage Value
> a2d_buffer_ch[0] += ADC12MEM7; //A/D reference voltage Value
>
> a2d_buffer_ch[1] = ADC12MEM8; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM9; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM10; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM11; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM12; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM13; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM14; //A/D reference voltage Value
> a2d_buffer_ch[1] += ADC12MEM15; //A/D reference voltage Value
>
> Red_power.int_data = a2d_buffer_ch[0] >> 3;
> IR_power.int_data = a2d_buffer_ch[1] >> 3;
> ADC12IFG = 0x00; //Reset the ADC12 interrupt vector
> ADC12CTL0 |= ENC + ADC12SC; // ADC12 ON -
> Enable conversion.
> }
>
> Thank you for your help
> Igal
>