Controller restart while reading a string though uart.

OP #1173860
Hi All,

         Currently I'm working on LPC2148 based GSM System.Now what
happening I send a AT command to GSM Modem & waits for a response of
that command which is in format
"<CR><LF><RESPONSE><CR><LF><CR><LF><RESPONSE><CR><LF>......." like
this.For these purpose I wrote a code which reads a no. of responses and
buffered it in one array.
Its working well.
But the main problem is I want use a Time out for this and I used Timer1
for this,
What I had done is, before calling function I just enabled the timer1
and waits for responses and after reading string I disabled that Timer1.
but when ever modem responses late my controller is 'Restart'.
I attaching code Please go through and help me out..

//Function to read modem response
//OT is time out in seconds TimeOut i incremented in ISR Routine
//Amit Chatre

void rDataWTO(unsigned char OT)
{
  int gData=0;
  TimeOut = 0;

  dlay(100);

  enable_timer1();
  do
  {
    if(( gData = uart1Getch() ) >= 0)
    {
      if((gData == '\r') || (gData == '\n'))
      {
        gFlag=0;
        if(gRcount == gRn)
        {
          gCn++;
          gArr[gRn-1][gCn]=0;
          break;
        }
      }else
      {
        if(gFlag == 0)
        {
          gFlag = 1;
          gRn++;
          gCn=0;
          gArr[gRn-1][gCn]=gData;
        }else
        {
          if(gFlag == 1)
          {
            gCn++;
            gArr[gRn-1][gCn]=gData;
          }
        }
      }
    }
  }while(TimeOut < OT);
  disable_timer1();
}



Waiting for reply..........
Amit Chatre
+919923297274
Moderator
Amit Chatre wrote:

>//OT is time out in seconds TimeOut i incremented in ISR Routine
volatile?

There should be some index-checking before doing this:
>           gArr[gRn-1][gCn]=0;
and this
>           gArr[gRn-1][gCn]=gData;
and this
>           gArr[gRn-1][gCn]=gData;


>   disable_timer1();
Implementation?

Is a default interrupt-handler implemented and configured in the VIC?
OP
Martin Thomas wrote:
> Amit Chatre wrote:
>
>>//OT is time out in seconds TimeOut i incremented in ISR Routine
> volatile?
 They were not volatile, ok I'll do that.

>
This code is working well but it not includes the timeout functinality.
before calling this function we have to set these parameters

//gRcount=3; no of response expected
//gRn=0; row count
//gCn=0; colomn count

void rDataWt(void)
{
  int gData=0;

  while(1)
  {
    if(( gData = uart1Getch() ) >= 0)
    {
      if((gData == '\r') || (gData == '\n'))
      {
        gFlag=0;
        if(gRcount == gRn)
        {
          gCn++;
          gArr[gRn-1][gCn]=0;
          break;
        }
      }else
      {
        if(gFlag == 0)
        {
          gFlag = 1;
          gRn++;
          gCn=0;
          gArr[gRn-1][gCn]=gData;
        }else
        {
          if(gFlag == 1)
          {
            gCn++;
            gArr[gRn-1][gCn]=gData;
          }
        }
      }
    }
  }
}

> There should be some index-checking before doing this:
>>           gArr[gRn-1][gCn]=0;
> and this
>>           gArr[gRn-1][gCn]=gData;
> and this
>>           gArr[gRn-1][gCn]=gData;
>
>

>>   disable_timer1();
> Implementation?
>
void initTimer1(void)
{
  T1TCR = TCR_RESET;           // reset & disable timer 1
  T1PR = T0_PCLK_DIV - 1;     // set the prescale divider
  T1MR0 = ONE_SEC;
  T1MCR = 3;                   // disable match registers
//  T1TCR = TCR_ENABLE;          // enable timer 1
}

void enable_timer1(void)
{
  T1TCR = 0x01;
}
void disable_timer1(void)
{
  T1TCR = 0x02;
}
void timer1_ISR_Setup(void)
{
  VICIntSelect &= ~VIC_BIT(VIC_TIMER1);  // UART1 selected as IRQ
  VICIntEnable = VIC_BIT(VIC_TIMER1);    // UART1 interrupt enabled
  VICVectCntl3 = VIC_ENABLE | VIC_TIMER1;
  VICVectAddr3 = (uint32_t)tc1_isr;    // address of the ISR
}
void tc1_isr(void)
{
    ISR_ENTRY();
    T1IR = 0xFF;
    Timer1_IntFlag = 0x01;
    TimeOut++;
    VICSoftIntClear = VIC_BIT(VIC_TIMER1);
    VICVectAddr = 0x00000000;
    ISR_EXIT();
}

> Is a default interrupt-handler implemented and configured in the VIC?
No I have not implimented a default interrupt-handler,
 I dont have any idea about that so please tell me how to
impliment,configure default interrupt-handler.
Moderator
Amit Chatre wrote:
> Martin Thomas wrote:
>> Amit Chatre wrote:
>>
>>>//OT is time out in seconds TimeOut i incremented in ISR Routine
>> volatile?
>  They were not volatile, ok I'll do that.

And read a good C-book to understand why it should be volatile. There
are also some articels on embedded.com which explain this.

>void tc1_isr(void)
>{
>    ISR_ENTRY();
>[...]
>   VICSoftIntClear = VIC_BIT(VIC_TIMER1); // why?
>[...]
>    ISR_EXIT();
>}

How is tc1_isr declared (with nacked attribut)? Show the definition of
the macros ISR_ENTRY()/_EXIT(). Is a IRQ-wrapper assembler-code used?

>> Is a default interrupt-handler implemented and configured in the VIC?
> No I have not implimented a default interrupt-handler,
>  I dont have any idea about that so please tell me how to
> impliment,configure default interrupt-handler.

Read NXP application-note AN10414.

You may try this (not the best solution but worth a test):

// somewhere in startup before any IRQ is configured in the VIC:
   VICDefVectAddr=(uint32_t)default_handler;

// handler:
void default_handler(void) __attribute__((naked));
void default_handler(void)
{
    ISR_ENTRY();
#if 1
    T1IR = ( 1UL << 0);
    VICVectAddr = 0x00000000;
#endif
    ISR_EXIT();
}
OP
Martin Thomas wrote:
> Amit Chatre wrote:
>> Martin Thomas wrote:
>>> Amit Chatre wrote:
>>>
>>>>//OT is time out in seconds TimeOut i incremented in ISR Routine
>>> volatile?
>>  They were not volatile, ok I'll do that.
>
> And read a good C-book to understand why it should be volatile. There
> are also some articels on embedded.com which explain this.
>
>>void tc1_isr(void)
>>{
>>    ISR_ENTRY();
>>[...]
>>   VICSoftIntClear = VIC_BIT(VIC_TIMER1); // why?
>>[...]
>>    ISR_EXIT();
>>}
>
> How is tc1_isr declared (with nacked attribut)? Show the definition of
> the macros ISR_ENTRY()/_EXIT(). Is a IRQ-wrapper assembler-code used?
>
 In this way i decleared a interrupt isr routine.
 void tc1_isr(void) __attribute__((naked));

 Yes, this is code for Entry and Exit for ISR.

#define ISR_ENTRY() asm volatile(" sub   lr, lr,#4\n" \
                                 " stmfd sp!,{r0-r12,lr}\n" \
                                 " mrs   r1, spsr\n" \
                                 " stmfd sp!,{r1}")

#define ISR_EXIT()  asm volatile(" ldmfd sp!,{r1}\n" \
                                 " msr   spsr_c,r1\n" \
                                 " ldmfd sp!,{r0-r12,pc}^")


>>> Is a default interrupt-handler implemented and configured in the VIC?
>> No I have not implimented a default interrupt-handler,
>>  I dont have any idea about that so please tell me how to
>> impliment,configure default interrupt-handler.
>
> Read NXP application-note AN10414.
>
> You may try this (not the best solution but worth a test):
>
> // somewhere in startup before any IRQ is configured in the VIC:
>    VICDefVectAddr=(uint32_t)default_handler;
>
> // handler:
> void default_handler(void) __attribute__((naked));
> void default_handler(void)
> {
>     ISR_ENTRY();
> #if 1
>     T1IR = ( 1UL << 0);
>     VICVectAddr = 0x00000000;
> #endif
>     ISR_EXIT();
> }

Ok I'll try this

Reply

A question of your own? This thread is over 18 years old. Ask it in a thread of its own – more people read along there, and it gets answered more often and sooner.

Start a new thread

A fix, an addition or feedback on this thread? Then reply here.

Formatting
  • [c]C-Code[/c]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.