This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Cant execute ISR second time

hello frens,

i written code for UART0, where ISR execute when data received from serial port.

 void received(void) __irq
        {
                 unsigned char i;
                 i = U0RBR;
                 UART0_SendByte(i+1);
        }

but it only execute only one time. please help me to solve this problem.

regards,
pankaj Jain

Parents
  • 1) Yuo didn't find it too important to specify what processor you have.

    2) You didn't find it too important to look at sample code or processor documentation, and consider to add the code to acknowledge the interrupt before leaving the interrupt handler.

    You will get in a huge number of troubles, unless you learn that programming is about combining manu small steps into suitable sequences to solve specific problems. But that you either need to know - or read up on - the requirements of these smaller building stones you need.

    There are thousands, and thousands, of such small building stones. And besides the more generic building stones, each processor also comes with its own specific building stones. You just have to learn to read the documentation. You will be constantly stuck if you think you can just write a couple of lines randomly and then ask a forum when it doesn't work.

    Programming is about processing documentation, and then create based on the requirements specification and the doumentation for the compiler, the manuals/data sheets for the individual components, ... A developer just have to be a compiler/processor of facts/knowledge. Not a requester for help.

    It's only when you do know the building stones you can start experimenting and see if you can invent new ways to do things. See if it's either possible to combine the building stones in previously unknown patterns, or maybe finding previously unknown building stones. Then you might take the step from developer to inventor.

Reply
  • 1) Yuo didn't find it too important to specify what processor you have.

    2) You didn't find it too important to look at sample code or processor documentation, and consider to add the code to acknowledge the interrupt before leaving the interrupt handler.

    You will get in a huge number of troubles, unless you learn that programming is about combining manu small steps into suitable sequences to solve specific problems. But that you either need to know - or read up on - the requirements of these smaller building stones you need.

    There are thousands, and thousands, of such small building stones. And besides the more generic building stones, each processor also comes with its own specific building stones. You just have to learn to read the documentation. You will be constantly stuck if you think you can just write a couple of lines randomly and then ask a forum when it doesn't work.

    Programming is about processing documentation, and then create based on the requirements specification and the doumentation for the compiler, the manuals/data sheets for the individual components, ... A developer just have to be a compiler/processor of facts/knowledge. Not a requester for help.

    It's only when you do know the building stones you can start experimenting and see if you can invent new ways to do things. See if it's either possible to combine the building stones in previously unknown patterns, or maybe finding previously unknown building stones. Then you might take the step from developer to inventor.

Children
  • Another important step in the process is Debugging.

    When your software doesn't do what you expected, you need to learn how to analyse what it does do, review your expectations and, thence, work out how to fix it.

    For some tips, see: www.8052.com/.../120313 (not specific to 8052)

  • dear fren,
    thanks for reply, i am new be.

    sorry for above short message.

    i give code where i use LCD + UART0 Programming,LCD program is working fine.

    I am using LPC2148. i able to receive data from polling method but when i use interrupt it execute only one time.

    Please help me to solve this problem.

    
    
    
    
    #include  <lpc214x.h>
    
    #define  EN_HI() IO0SET = (1<<18)
    #define  EN_LO() IO0CLR = (1<<18)
    #define  CMD()   IO0CLR = (1<<16)
    #define  DATA()  IO0SET = (1<<16)
    #define  WRITE() IO0CLR = (1<<17)
    #define  READ()  IO0SET = (1<<17)
    #define  LCD_PORT IO0PIN
    #define  SHIFT_HI        15
    #define  SHIFT_LO        19
    
    
    #define Fosc            12000000
    #define Fcclk           (Fosc * 5)
    #define Fcco            (Fcclk * 4)
    #define Fpclk           (Fcclk / 4) * 1
    
    #define  UART_BPS       9600     //Set Baud Rate here
    
    void Serint(void) __irq;
    
    unsigned char str1[] = " SAPCON Instrumets Pvt. Ltd., Indore";
    unsigned char str2[] = " Pankaj Kumar Jain R & D    ";
    
    void DELAY(unsigned char data2)
            {
                    unsigned int j;
                    for(;data2>0;data2--)
                    for(j=0;j<60000;j++);
            }
    
    const unsigned char SEND_STRING[] = "Nex Robotics PVT LTD\nARM7 LPC214x Development Board\nCommunication Test\nSend any character to continue\n";
    const unsigned char SEND_STRING1[] = "Test Passed\n";
    
    
    
    
    
    void  Init_UART0(void)                                  //This function setups UART0
    {
       unsigned int Baud16;
       U0LCR = 0x83;                            // DLAB = 1
       Baud16 = (Fpclk / 16) / UART_BPS;
       U0DLM = Baud16 / 256;
       U0DLL = Baud16 % 256;
       U0LCR = 0x03;
    }
    
    
    void  UART0_SendByte(unsigned char data)           //A function to send a byte on UART0
    {
       U0THR = data;
       while( (U0LSR&0x40)==0 );
    }
    
    
    void  UART0_SendStr(const unsigned char *str)    //A function to send a string on UART0
    {
       while(1)
       {
          if( *str == '\0' ) break;
          UART0_SendByte(*str++);
       }
    }
    
    
    void WRITE_CMD(unsigned char data)
            {
              EN_LO();
              CMD();
              WRITE();
              IO0PIN&=0xFF87FFFF;
              IO0PIN|=(data & 0xF0) << SHIFT_HI;
              EN_HI();
              EN_LO();
              IO0PIN&=0xFF87FFFF;
              IO0PIN|=(data & 0x0F ) << SHIFT_LO;
              EN_HI();
              EN_LO();
              DELAY(1);
            }
    
    void WRITE_DATA(unsigned char data)
            {
    
              EN_LO();
              DATA();
              WRITE();
              IO0PIN&=0xFF87FFFF;
              IO0PIN|=(data & 0xF0) << SHIFT_HI;
              EN_HI();
              EN_LO();
              IO0PIN&=0xFF87FFFF;
              IO0PIN|=((data & 0x0F)  << SHIFT_LO);
              EN_HI();
              EN_LO();
              DELAY(1);
            }
    
    void Init_LCD(void)
            {
               WRITE_CMD(0x20);
               WRITE_CMD(0x28);
               WRITE_CMD(0x0C);
               WRITE_CMD(0x06);
    
            }
    
    void INIT_PORT(void)
            {
            PINSEL0 = 0x00000005 ;
            PINSEL1 = 0x00000000 ;
            IO0DIR  = 0x007F0000 ;
            PINSEL2 = 0x00000000 ;
            IO1DIR  = 0x00000000 ;
            }
    
    void LCD_STR(unsigned char *data1)
            {
             while(*data1){ WRITE_DATA(*data1); data1++;}
            }
    
    
    
    
    
    int main(void)
            {
    
                     VICIntEnable = 0x40;                           // Enable UART0 Interrupt
                     VICIntSelect = 0x00;                           // Set UART0 is IRQ  all interrupt's are IRQ categary
                     VICVectCntl0 = 0x26;                           // Set SLOT0 for UART Interrupt
                                                                                            // i.e. set highest priority in IRQ
                     VICVectAddr0  = (unsigned int)Serint;//0x1E8;                          // Set interrupt vector
    
                     U0IER = 0x01;                                          // Enable Transmit interrupt and
                                                                                    // Recieve line status interrupts
                    INIT_PORT();
                    Init_LCD();
                    Init_UART0();
                WRITE_CMD(0x01);
                    WRITE_CMD(0x80);
                    LCD_STR(&str2[0]);
                    WRITE_CMD(0xC0);
                    LCD_STR(&str1[0]);
                    DELAY(20);
    
                    UART0_SendStr("hi dear");
    
                    while(1)
                            {
                                    WRITE_CMD(0x18);
                                    DELAY(150);
                            }
            }
    
    void Serint(void) __irq
            {
                     unsigned char i;
                     i = U0RBR;
                     UART0_SendStr("\n\n\n");
                     UART0_SendByte(i+1);
    
            }
    
    
    
    

  • Did you look at any sample code yet? Or checked the user manual for the processor about how to acknowledge interrupts? You still haven't tried to acknowledge the interrupt before returning from the interrupt handler.

    Maybe you should download the code package available for your specific processor from NXP and really spend some time looking at that code. Yes, the quality isn't so good. But it does contain the magic lines you seem to have forgotten.

    How much of the documentation available at:
    ics.nxp.com/.../
    have you looked at?