EmbDev.net

Forum: ARM programming with GCC/GNU tools Controller restart while reading a string though uart.


von Amit C. (aseem)


Rate this post
useful
not useful
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

von Martin T. (mthomas) (Moderator)


Rate this post
useful
not useful
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?

von Amit C. (aseem)


Rate this post
useful
not useful
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.

von Martin T. (mthomas) (Moderator)


Rate this post
useful
not useful
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();
}

von Amit C. (aseem)


Rate this post
useful
not useful
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

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.