FIFO-Konzept der ASC0-Schnittstelle vom XC16x

OP #2021436
Lesenswert?
• ▲
▼
Hi,

ich möchte das FIFO-Konzept der ASC0-Schnittstelle vom XC16x einsetzen. 
Die Grundidee sieht etwa so aus (in der Anlage ist die Anleitung zu 
lesen): Es gibt 8 FIFO und einen Interrupt "Transmit Buffer Interrupt". 
Diese ISR wird aufgerufen wenn die aktuelle Anzahl der besetzten FIFO 
einen bestimmten Wert erreicht, der vorher eingestellt werden muss, z.B. 
3. Wenn der Interrupt kommt, soll das FIFO weiter mit Daten gefüllt 
werden.

Im folgenden Code werden zwei Methoden dargestellt.
1
ASC0_vSendData_LCD(): Sendefunktion
2
ASC0_viTxBuffer(): ISR
Weiter gilt: Triggerniveau = 3

Globale Variablen:
1
unsigned char rest_number;  //how many bytes must still be sent.
2
unsigned char *lcd_data;    // data bytes
Die Methode ASC0_vSendData_LCD() wird so aufgerufen:
1
unsigned char buf1[] = {0xAA, 0x55, 0x00, 0x00, 0x00, 0x00, 0x41, 0xCC, 0x33, 0xC3, 0x3C};
2
lcd_data = &buf1[0];
3
ASC0_vSendData_LCD(lcd_data, 11);
und die ISR wird automatisch einbezogen falls Datenbytes > 8.

Ich möchte wissen, ob potentielle Gefahr steht, z.B. Daten werden 
verloren usw.
1
void ASC0_vSendData_LCD(unsigned char *lcd_data, unsigned char lcd_number)
2
{
3
  unsigned char i = 0;
4
  // no ISR needed if data bytes <= 8
5
  if (lcd_number <= 8)
6
  {
7
    for (i = 0; i < lcd_number; i++)
8
      ASC0_vSendData(lcd_data[i]);
9
  }
10
  // the first 8 bytes are sent
11
  else
12
  {
13
    for (i = 0; i < 8; i++)
14
      ASC0_vSendData(lcd_data[i]);
15
    rest_number = lcd_number - 8;
16
  }
17
}
18

19
void ASC0_viTxBuffer(void) interrupt ASC0_TBINT using RB_LEVEL15
20
{
21
    static unsigned char times;  // how many times is this ISR called
22
  unsigned char i = 0;
23
  // leave ISR if no more data bytes
24
  if(rest_number == 0)
25
    return;
26
  // all the data bytes can be sent if they are less than 5
27
  if (rest_number <= 5)
28
  {
29
    for (i = 0; i < rest_number; i++)
30
      ASC0_vSendData(lcd_data[8 + 5*times + i]);  // the position of data bytes
31
    rest_number = 0;
32
    times = 0;
33
  }
34
  // this ISR shall be called again because too many data bytes (> 5)
35
  else
36
  {
37
    for (i = 0; i < 5; i++)
38
      ASC0_vSendData(lcd_data[8 + 5*times + i]);
39
    rest_number -= 5;
40
    times++;
41
  }
42
} //  End of function ASC0_viTxBuffer
Vielen Dank im Voraus
Senmeis
Angehängte Dateien:

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.