PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : das erste Byte der seriellen Schnittstelle ist stets falsch



senmeis
25.02.2011, 09:01
Hallo,

man möchte die serielle Schnittstelle ASC0 vom XC16x verwenden, und zwar mit dem Transmit Interrupt.

Die Sendefunktion sieht wie folgt aus:


void ASC0_vSendData_LCD(unsigned char *lcd_data, unsigned char lcd_number)
{
ASC0_vSendData(lcd_data[0]);
rest_number = lcd_number - 1;
}

Diese soll nur das erste Byte senden. Danach wird die folgende ISR automatisch aufgerufen:


void ASC0_viTx(void) interrupt ASC0_TINT using RB_LEVEL15
{
static unsigned char i = 1;
if (i <= rest_number)
{
ASC0_TBUF = lcd_data[i];
i++;
}
else
{
i = 1;
}
}

Das Problem ist, das erste Byte ist immer falsch, ab dem zweiten ist alles OK.

Beispiel:


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};

unsigned char *lcd_data = &lcd_text1[0];
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

askazo
25.02.2011, 10:22
Hi,

um Dir helfen zu können wäre noch interessant
- wie die Funktion ASC0_vSendData() aussieht
- warum Du das erste Byte nicht auch im Interrupt überträgst

Gruß,
askazo

steveLB
26.02.2011, 11:25
ist in dem lcd_data [0] auch immer das drinn was du erwartest ? beschreibst du es irgendwo mit AA ? oder nimmt der µC immer was im Speicher steht an der stelle lcd_data[0] ?

senmeis
27.02.2011, 06:53
Sorry, ich habe vergessen, die Methode "ASC0_vSendData()" hier zu posten:


void ASC0_vSendData(uword uwData)
{
ASC0_TBUF = uwData; // load transmit buffer register
}

Ist es möglich, das erste Byte aus dem Interrupt zu senden? Eigentlich wird die Methode "ASC0_vSendData()" eingesetzt, um weitere Senden zu triggern. Die Methode wird aus dem Tool "Dave" generiert mit der Beschreibung:

This function writes a send data initialization word into the transmit buffer register.

Ich interessiere mich sehr für das erste Senden aus dem Interrupt.

Cu
Senmeis

Ceos
06.03.2011, 22:46
okay ihc hab da jetzt nur etwas gesehen dass mich verwirrt, aber ich weis nicht obs hilft, aber bei

static unsigned char i = 1;
if (i <= rest_number)
{
ASC0_TBUF = lcd_data[i];


startest du den lcd index mit 1 obwohl arrays bei 0 anfangen, kanns sein dass das erste byte nur zufällig mit irgendwas initialisiert ist und du vergisst das erste byte zu adressieren?