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

Trying to transmit with interrupt in XC164CS

Hi everybody,
I am learning to program with MCUs and now i have got the SK-XC164 board.I am trying to transmit via ASC0 a message. This message has 6 equal bytes and I must do it with transmit interrupt. Has anyone a simple program to practise??. The message I would like to see the message through Hyperterminal on PC. Thanks to everyone.

  • There is the "Hello" example that is included in the examples directory of Keil toolchain. It does what you are asking, so I would suggest to look at this first.

    ..Keil\C166\Examples\XC16x Devices\HELLO

  • Thanks Chris for reply.
    I tested this example but what i really want is another example without the use of "printf" and using a transmit interrupt routine.
    Another thing: I try to search the ASC0_TIR register into the XC164CS datasheet and i dont find it. Can anybody explain me a little? The interrupt routine is very important to me.
    Tnank you very much.

  • This is my code (@ -> BYTE (Unsigned char))

    #include <AR166.h>
    #include <XC164.h>
    #include "NewType.h"
    #include "Central.h"
    
    #define TASK1      1
    
    void    InitHardware                    (void);
    void    CCU6_vInit                              (void);
    void    Init_P9                                 (void);
    void    ASC0_vInit                              (void);
    
    
    OS_TID id1;
    
    void main (void)
    {
            InitHardware();
            os_sys_init (TASK1);
    }
    
    /////////////////////////////////////////////////////////////////////////////////////
    void    InitHardware                    (void)
    {
       //CCU6_vInit();    // initializes the Capture / Compare Unit 6 (CCU6)
       Init_P9();
       ASC0_vInit();
       PSW_IEN        =  1; //   globally enable interrupts
    }
    /////////////////////////////////////////////////////////////////////////////////////
    
    /////////////////////////////////////////////////////////////////////////////////////
    void    Init_P9                                 (void)
    {
      ODP9           =  0x0000;      // load open-drain register
      P9             =  0x0000;      // load data register
      ALTSEL0P9      =  0x0000;      // load alternate output function select
                                     // register 0
      ALTSEL1P9      =  0x0000;      // load alternate output function select
                                     // register 1
      POCON9         =  0x0000;      // load output control register
      DP9            =  0x0010;      // load direction register
    }
    /////////////////////////////////////////////////////////////////////////////////////
    void            ASC0_vInit                      (void)
    {
      ///  -----------------------------------------------------------------------
      ///  Configuration of the ASC0 Baudrate Generator:
      ///  -----------------------------------------------------------------------
      ///  - additionally reduce serial clock to 2
      ///  - required baud rate = 19,200 kbaud
      ///  - real baud rate     = 19,200 kbaud
      ///  - deviation          = 0,000 %
    
      ASC0_BG        =  0x0011;      // load ASC0 baud rate time reload register
    
      ///  -----------------------------------------------------------------------
      ///  Configuration of the ASC0 Operation Mode:
      ///  -----------------------------------------------------------------------
      ///  - 8-bit data asychronous operation with one stop bit
      ///  - receiver is enabled
    
      ASC0_CON       =  0x0011;      // load ASC0 control register
    
      ///  -----------------------------------------------------------------------
      ///  Configuration of the used ASC0 Port Pins:
      ///  -----------------------------------------------------------------------
      ///  - P3.10 is used for ASC0 Transmit Data Output (TxDA0)
      ///  - P3.11 is used for ASC0 Receive data Input (RxDA0)
    
      ALTSEL0P3     |=  0x0400;      // select alternate output function
      P3   |= 0x0400;    //set data register
      DP3  |= 0x0400;    //set direction register
    
      ///  -----------------------------------------------------------------------
      ///  Configuration of the used ASC0 Interrupts:
      ///  -----------------------------------------------------------------------
      ///  Tx service request node configuration:
      ///  - Tx interrupt priority level (ILVL) = 14
      ///  - Tx interrupt group level (GLVL) = 1
      ///  - Tx group priority extension (GPX) = 0
    
      ASC0_TIC       =  0x0080;
    
      ///  Use PEC channel 1 for ASC0 Tx INT:
      ///  - normal interrupt
      ///  - pointers are not modified
      ///  - transfer a word
      ///  - service End of PEC interrrupt by a EOP interrupt node is disabled
      ///  - channel link mode is disabled
    
      PECC1          =  0x0000;      // load PECC1 control register
    
    
      ///  TxBuffer service request node configuration:
      //// - TxBuffer interrupt is enabled but NO INTERRUPT WILL BE GENERATED
      ////   because priority level is 0
    
      ASC0_TBIC      =  0x0040;
    
      ///  Rx service request node configuration:
      ///  - Rx interrupt priority level (ILVL) = 15
      ///  - Rx interrupt group level (GLVL) = 1
      ///  - Rx group priority extension (GPX) = 0
    
      ASC0_RIC       =  0x007D;
    
      ///  Use PEC channel 5 for ASC0 Rx INT:
      ///  - normal interrupt
      ///  - pointers are not modified
      ///  - transfer a word
      ///  - service End of PEC interrrupt by a EOP interrupt node is disabled
      ///  - channel link mode is disabled
    
      PECC5          =  0x0000;      // load PECC5 control register
      ASC0_CON      |=  0x8000;      // enable baud rate generator
    }
    /////////////////////////////////////////////////////////////////////////////////////
    void TASK_1 (void) _task_       TASK1
    {
                    id1 = os_tsk_self ();
                    ASC0_TBUF = '@';
    
    }
    /////////////////////////////////////////////////////////////////////////////////////
    void ASC0_viTx(void) interrupt ASC0_TINT
    {
    int     i;
            for (i=0; i<6; i++)
            {
                    ASC0_TBUF = '@';
            }
    }
    

  • In this program, only transmit the firt @ (TASK1) but the "for loop" of the interrupt routine doesn't work

  • You normally don't use a for loop in the interrupt handler. You might possibly make use of one if using a UART with a FIFO, since it will then be possible to fill upp the transmit FIFO with multiple of characters on every interrupt.

  • I'm not interested in using FIFO for a reason. I only want to know the necessary code to enter into interrupt routine

  • you can generate your code using 'Dave', downloadable for free from http://www.infineon.com

  • Part of the code that is written above is made with DaVe

  • what is the problem actually? your transmit interrupt is not invoked?

  • The problem is that doesn't enter in the interrupt routine. For the system this routine doesn't exist, doesn't make it run.

  • John,
    I don't know the 164 so I cannot quickly comment about your code. however, please check the following:
    * if your TX interrupt bit enabled?
    * if so, if its priority is 0, no interrupt will be generated.
    * make sure it has a unique group/level setting.

  • also note that Dave generates a report indicating problems related to the peripherals after code generation. it includes warnings about interrupts that will not be invoked!

  • Ok you have a problem to set the interrupt levels.

    Anyway I stripped down some previous code to show a bare minimum if this helps you.

    #include <xc164.h>
    #include <intrins.h>
    
    unsigned int  cnt;
    unsigned int  txSendCount;
    unsigned char *txTailptr;
    unsigned char txBuf[] = {"Hello"};
    
    /*****************************************************/
    void main(void) {
      ASC0_CON =  0x0011;
      ASC0_BG  =  0x0011;
    
      ALTSEL0P3 |= 0x0400;       /* select alternate output function   */
      _bfld_(P3,0x0C00,0x0400);  /* P3.10 (Tx) and P3.11 (Rx) are used */
      _bfld_(DP3,0x0C00,0x0400); /* P3.10 (Tx) and P3.11 (Rx) are used */
    
      ASC0_TXFCON = 0x0100;  /* transmit FIFO is disabled  */
    
      ASC0_TBIC  = 0x0079;
    
      txSendCount = 0;
      txTailptr = &txBuf[0];
    
      ASC0_CON |= 0x8000; /* enable baud rate generator */
    
      PSW_IEN = 1;        /* globally enable interrupts */
    
      txSendCount = 5;    /* set the number of bytes to send */
      ASC0_TBIC_IR = 1;   /* send message */
    
      for(;;) {     /* run forever! */
        cnt++;
      };
    }
    
    /*****************************************************/
    void ASC0_TxBufferIsr (void) interrupt (0x47U) {
    
      if (txSendCount > 0) {
        txSendCount--;
        ASC0_TBUF = *txTailptr++;
      }
    }
    

  • Hello,
    the Dave gives me the following information and I am not sure if this is the mistake:

    ASC0_TIC       =  0x0079;
    
      ///  Use PEC channel 1 for ASC0 Tx INT:
      ///  - normal interrupt
      ///  - pointers are not modified
      ///  - transfer a word
      ///  - service End of PEC interrrupt by a EOP interrupt node is disabled
      ///  - channel link mode is disabled
    

    Do you think wether it may be the problem?

  • Then how in your code did you have...

      ASC0_TIC =  0x0080;