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.

Parents Reply Children
  • I have tried sending a "A" character via HyperTerminal to the XC164CS and when it receives, it blinks a LED. I use this code, but it doesn't run correctly.

    #include <AR166.h>
    #include <XC164.h>
    
    unsigned char   mi_sbuf;
    
    void main(void)
    {
         ASC0_CON       =  0x0011;      // load ASC0 control register
         ASC0_BG        =  0x0011;      // load ASC0 baud rate time reload register
      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;
      ASC0_RIC       =  0x007D;
    
      ASC0_CON      |=  0x8000;      // enable baud rate generator
      while (1);
    }
    void ASC0_viRx(void) interrupt ASC0_RINT using RB_LEVEL15
    {
            while (ASC0_RIC_IR);
            mi_sbuf = ASC0_RBUF;
    
            if (mi_sbuf == 'A')
            {
                 if (MY_LED == 0)MY_LED = 1;
                     else MY_LED=0;
                     os_dly_wait (50);
                 if (MY_LED == 0)MY_LED = 1;
                     else MY_LED=0;
                     os_dly_wait (50);
            }
    }
    
    

  • Hello Chris,
    I fixed the problem removing the "os_dly_wait(50)" function (C166 compliler especial function). :D
    Thanks everybody for your attention

  • Hello,
    Could anyone tell me the differences between using transmit interrupt and transmit buffer interrupt? What are the pros and cons of each?
    Thanks.

  • You can get an interrupt when the UART can accept more characters. This allows you to keep it constantly running, where the transmitted characters comes almost immediately after each other.

    You can get an interrupt when the UART runs dry. This allows you to manually toggle handshake signals or turn off power to transceiver chips etc in between characters. But on the other hand, there will be a bit longer pause until you will manage to send one more character.

    If you run a packet-based protocol, you normally want to keep the UART running continuously until the packet ends.

    If you run a char-by-char protocol or have multiple masters connected on a bus, you must be able to immediately detect and react to a bus collision.

  • Hello,
    can anyone help me to initialize the PORT3 for ASC1 pins Tx, Rx?
    Thanks

  • I am exasperated :( . I tried to do the same program that Chis did, but this time using ASC1, and it doesn't work. Probably i have wrong the initialization of ASC1. Can you help me Chris?
    Thank you very much

  • I hope you are using the right vector to handle your communication? that would be required if you changed to ASC1.

  • How do I know if I am using the right handle?
    The ASC0 and ASC1 are supossed to be equal, aren't they?
    Thanks for reply.

  • well, look in your data sheet. I assume each of these peripherals has its own interrupt vector. you need to change the number of your interrupt service routine to handle ASC1 rather than ASC0.

  • There is a difference in what the pins share for the ASC1 concerning other features on the device. For example if you are debugging with JTAG then you have a problem since the JTAG pins are shared with the ASC1 port. So you cannot do both at the same time.

    So here are the pins...
    P3.1/T6OUT/RxD1/TCK
    P3.5/T4IN/TxD1/BRKOUT

    Keil doesn't use the BRKOUT feature so the TxD1 is ok to use for transmitting. However, you have a problem on the receive pin, TCK (JTAG Clock) being shared with the RxD1.

    -Chris

  • For Tamir:
    I have different vector for my interrupt service routine. Look this:

    #define ASC0_TINT    0x2A
    #define ASC0_RINT    0x2B
    #define ASC0_TBINT    0x47
    #define ASC1_TBINT    0x5E
    #define ASC1_RINT    0x49
    
    void ASC1_viRx(void) interrupt ASC1_RINT using RB_LEVEL15
    {
      ...
    }
    

    For Chris:
    I have already taken that into account. At this moment, I'm not using JTAG, therefore this Rx pin is free. Its my opinion :(
    Thanks.

  • did you make sure your ISRs have distinct priorities (group/level, if it is indeed the same as on a C166...)?

  •   ASC1_CON       =  0x0011;      // load ASC1 control register
      ASC1_BG        =  0x0011;      // load ASC1 baud rate time reload register
      ASC1_TXFCON    =  0x0100;      // load ASC1 transmit FIFO control register
      ASC1_RXFCON    =  0x0100;      // load ASC1 receive FIFO control register
      ALTSEL0P3     |=  0x0020;      // select alternate output function
      P3   |= 0x0020;    //set data register
      DP3  |= 0x0020;    //set direction register
      ///  -----------------------------------------------------------------------
      ///  Configuration of the used ASC1 Interrupts:
      ///  -----------------------------------------------------------------------
      ///  TxBuffer service request node configuration:
      ///  - TxBuffer interrupt priority level (ILVL) = 14
      ///  - TxBuffer interrupt group level (GLVL) = 1
      ///  - TxBuffer group priority extension (GPX) = 0
    
      ASC1_TBIC      =  0x0079;
    
      ///  Rx service request node configuration:
      ///  - Rx interrupt priority level (ILVL) = 15
      ///  - Rx interrupt group level (GLVL) = 1
      ///  - Rx group priority extension (GPX) = 0
    
      ASC1_RIC       =  0x007D;
      ASC1_CON      |=  0x8000;      // enable baud rate generator
    

  • Finally, the mistake was that the wire wasn't well connected. The program runs correctly.
    Thanks for your helps