-         

Ergebnis 1 bis 5 von 5

Thema: das erste Byte der seriellen Schnittstelle ist stets falsch

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

    das erste Byte der seriellen Schnittstelle ist stets falsch

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,

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

    Die Sendefunktion sieht wie folgt aus:
    Code:
    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:
    Code:
    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:
    Code:
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    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

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von steveLB
    Registriert seit
    24.10.2005
    Beiträge
    481
    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] ?
    [X] <-- Nail here for new Monitor

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    08.03.2010
    Beiträge
    20
    Sorry, ich habe vergessen, die Methode "ASC0_vSendData()" hier zu posten:
    Code:
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    okay ihc hab da jetzt nur etwas gesehen dass mich verwirrt, aber ich weis nicht obs hilft, aber bei
    Code:
    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?
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Berechtigungen

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