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.
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;
Ups,this can be the problem. I'm going to try.
I've just tested and It doesn't work :(
Thanks Chris, I have just tested your program example and It only sends me 1 "Hello" and not 5.(txSendCount = 5; /* set the number of bytes to send */). What can I do?
How many bytes are in "Hello"?