Hallo,
will mit dem uC ATXMega32E5 ein paar byte senden und dann wieder den uC
schlafen legen bis zum nächsten mal.
Nun wurden die Daten nicht richtig übermittelt. Eine Untersuchung hat
dann ergeben, dass die Daten noch nicht gesendet wurden, wenn ich den uC
schlafen gelegt habe.
Zum Test hab ich dann halt mal ein delay eingelegt und dann giengs.
Hab dann einen Ausgang zur Kontrolle eingeschaltet vom senden des ersten
Bytes bis das Flag TXCIF gelöscht wird.
Erstaunlicherweise wird dieses Flag schon gelöscht, drei Byte bevor die
Daten ganz übertragen worden sind!?
Dabei ist es egal, wieviele Bytes übertragen werden, immer drei Byte
bevor die letzten bit gesendet wurden, wird das TXCIF-Bit gelöscht.
Siehe Bilder (erstes Signal: PD5, zweites Signal TxD)
Dabei heisst es doch beim TXCIF im Datenblatt (XMEGA-E Series):
"Bit 6 – TXCIF: Transmit Complete Interrupt Flag
This flag is set when the entire frame in the Transmit Shift Register
has been shifted out and there are no new data
in the transmit buffer (DATA). The TXCIF is automatically cleared when
the transmit complete interrupt vector is
executed. The flag can also be cleared by writing a one to its bit
location."
Und USART_TXCIF_bm ist wirklich eine Bitmaske mit dem 6.bit.
Ist da noch ein versteckter Buffer???
Oder darf ich diese flags nicht verwenden, wenn ich nicht die Interrupts
nicht eingeschalten hab?
1 | int main(void) {
|
2 |
|
3 | #define USART_TXCIF_bm 0x40 /* Transmit Complete Interrupt Flag bit mask. */
|
4 |
|
5 | ...
|
6 |
|
7 | while (1) {
|
8 | PORTD.OUTSET = 0x20;
|
9 | putByte('T');
|
10 | putByte('U');
|
11 | putByte('V');
|
12 | putByte('W');
|
13 | putByte('X');
|
14 | while( !(USARTC0_STATUS & USART_TXCIF_bm) );//Wait until DATA is sendt
|
15 | PORTD.OUTCLR = 0x20;
|
16 | my_delay250kHz((uint16_t)10, 0, 0); // wait 10ms
|
17 | set_sleep_mode(SLEEP_MODE_PWR_SAVE);
|
18 | sleep_mode();
|
19 | }
|
20 |
|
21 | void putByte(uint8_t data) {
|
22 | // Wait until data buffer is empty before putting character to send buffer
|
23 | while( !(USARTC0_STATUS & USART_DREIF_bm) ); //Wait until DATA is empty
|
24 | USARTC0_DATA = data;
|
25 | }
|
26 |
|
27 | }
|