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;