Hallo,
man möchte die serielle Schnittstelle ASC0 vom XC16x verwenden, und zwar
mit dem Transmit Interrupt.
Die Sendefunktion sieht wie folgt aus:
1 | void ASC0_vSendData_LCD(unsigned char *lcd_data, unsigned char lcd_number)
|
2 | {
|
3 | ASC0_vSendData(lcd_data[0]);
|
4 | rest_number = lcd_number - 1;
|
5 | }
|
Diese soll nur das erste Byte senden. Danach wird die folgende ISR
automatisch aufgerufen:
1 | void ASC0_viTx(void) interrupt ASC0_TINT using RB_LEVEL15
|
2 | {
|
3 | static unsigned char i = 1;
|
4 | if (i <= rest_number)
|
5 | {
|
6 | ASC0_TBUF = lcd_data[i];
|
7 | i++;
|
8 | }
|
9 | else
|
10 | {
|
11 | i = 1;
|
12 | }
|
13 | }
|
Das Problem ist, das erste Byte ist immer falsch, ab dem zweiten ist
alles OK.
Beispiel:
1 | static unsigned char lcd_text1[] = {0xAA, 0x55, 0x00, 0x00, 0x00, 0x00, 0xB7, 0xA2, 0xB6, 0xAF, 0xBB, 0xFA, 0xD7, 0xAA, 0xCB, 0xD9, 0xA3, 0xBA, 0xCC, 0x33, 0xC3, 0x3C};
|
2 |
|
3 | unsigned char *lcd_data = &lcd_text1[0];
|
4 | ASC0_vSendData_LCD(lcd_data, 22);
|
Aus der seriellen Schnittstelle wird folgendes abgelesen:
0x54, 0x55, 0x00, 0x00, 0x00, 0x00, 0xB7, 0xA2, 0xB6, 0xAF, 0xBB, 0xFA,
0xD7, 0xAA, 0xCB, 0xD9, 0xA3, 0xBA, 0xCC, 0x33, 0xC3, 0x3C
Woran liegt das?
Cu
Senmeis