www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik das erste Byte der seriellen Schnittstelle ist stets falsch


Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Michael Schikora (schiko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Owen Senmeis schrieb:
>
> void ASC0_vSendData_LCD(unsigned char *lcd_data, unsigned char
> lcd_number)
>   {
>   ASC0_vSendData(lcd_data[0]);
>   rest_number = lcd_number - 1;
>   }
> 

willst Du nicht rest_number lieber schon setzen,
bevor Deine ASC0_vSendData_LCD von irgendeinem Interrupt
unterbrochen werden kann?

Autor: Namenlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und ausserdem: Warum nicht gleich das erste
Byte aus dem Interupt senden?


Namenlos

Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...entsprechendes interrupt request bit per sw setzen, und schon wird 
der tx-interrupt ausgelöst ;o).
vorher aber ggf. abtesten, ob der uart tx-seitig leer ist ;o).

gutt lack, tom.

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Owen Senmeis schrieb:
>
> void ASC0_vSendData(uword uwData)
> {
>   ASC0_TBUF    = uwData;   //  load transmit buffer register
> }
mach mal aus dem uword was sinnvolles mit 8-Bit!

Sascha

Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun wird das erste Byte aus dem Interrupt gesendet. Das scheint 
funktioniert zu sein, aber ich verstehe den alten Fehler immer noch 
nicht.
void ASC0_vSendData_LCD(unsigned char *lcd_data, unsigned char lcd_number)
  {
  //ASC0_vSendData(lcd_data[0]);
  //rest_number = lcd_number - 1;
  ASC0_TIC_IR = 1;
  rest_number = lcd_number;
  }

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

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
siehe mein Post vom 27.02.

wenn du beim Aufruf deiner "ASC0_vSendData()" ein Byte übergibst und 
dieses der Word-Vaiable uwData zuweist, dann landet das Byte in den 
unteren 8-Bit.
Bei der Übergabe des 16-Bit-Werts an ASC0_TBUF das ja wieder nur 8-Bit 
breit ist kommen dort warscheinlich die oberen 8-Bit von uwData an. 
Dort müsstest du dan schon einen Typecast machen (ASC0_TBUF = 
(char)uwData;) oder uwData als char deklarieren.

Sascha

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.