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.
Hi John,
You can find the information in the peripheral users manual. Look in the ASC section under interrupts.
TBIR is activated when data is moved from TBUF to the transmit shift register.
TIR is activated before the last bit of an asynchronous frame is transmitted, or after the last bit of a synchronous frame has been transmitted
So if you are sending a stream of data generally you would use the TBIR as this could keep the transmission to appear to be contiguous. It allows the register to be loaded while still sending a value.
You generally would use the TIR interrupt if you need to perform software handshaking.
Hope that helps. -Chris
Sorry, I didn't read your last post correctly.
ASC0_TBIC_IR is the interrupt flag in the special function register (SFR) ASC0_TBIC that would get set when the transmit buffer is able to accept another word.
It is automatically cleared when you vector its interrupt handler. Alternatively you can clear it by software.
Look at both the system and peripheral users manuals for information about interrupts.
I have understood the reply and it's been important. One more thing. Could you give me a program that is similar to transmission interrupt, but in this case using reveive interrupt? Thank you very much, Chris.
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