-
        

Ergebnis 1 bis 1 von 1

Thema: FIFO-Konzept der ASC0-Schnittstelle vom XC16x

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.03.2010
    Beiträge
    20

    FIFO-Konzept der ASC0-Schnittstelle vom XC16x

    Anzeige

    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.

    Code:
    ASC0_vSendData_LCD(): Sendefunktion
    ASC0_viTxBuffer(): ISR
    Weiter gilt: Triggerniveau = 3

    Globale Variablen:
    Code:
    unsigned char rest_number;	//how many bytes must still be sent.
    unsigned char *lcd_data;		// data bytes
    Die Methode ASC0_vSendData_LCD() wird so aufgerufen:
    Code:
    unsigned char buf1[] = {0xAA, 0x55, 0x00, 0x00, 0x00, 0x00, 0x41, 0xCC, 0x33, 0xC3, 0x3C};
    lcd_data = &buf1[0];
    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.
    Code:
    void ASC0_vSendData_LCD(unsigned char *lcd_data, unsigned char lcd_number)
    {
    	unsigned char i = 0;
    	// no ISR needed if data bytes <= 8
    	if (lcd_number <= 8)
    	{
    		for (i = 0; i < lcd_number; i++)
    			ASC0_vSendData(lcd_data[i]);
    	}
    	// the first 8 bytes are sent
    	else
    	{
    		for (i = 0; i < 8; i++)
    			ASC0_vSendData(lcd_data[i]);
    		rest_number = lcd_number - 8;
    	}
    }
    
    void ASC0_viTxBuffer(void) interrupt ASC0_TBINT using RB_LEVEL15
    {
      	static unsigned char times;	// how many times is this ISR called
    	unsigned char i = 0;
    	// leave ISR if no more data bytes
    	if(rest_number == 0)
    		return;
    	// all the data bytes can be sent if they are less than 5
    	if (rest_number <= 5)
    	{
    		for (i = 0; i < rest_number; i++)
    			ASC0_vSendData(lcd_data[8 + 5*times + i]);	// the position of data bytes
    		rest_number = 0;
    		times = 0;
    	}
    	// this ISR shall be called again because too many data bytes (> 5)
    	else
    	{
    		for (i = 0; i < 5; i++)
    			ASC0_vSendData(lcd_data[8 + 5*times + i]);
    		rest_number -= 5;
    		times++;
    	}
    } //  End of function ASC0_viTxBuffer
    Vielen Dank im Voraus
    Senmeis
    Angehängte Dateien Angehängte Dateien

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •