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