Interrupt Trap XC167

Gast #1462474
Hi,

Auszug aus dem Datenblatt:
Illegal Word Operand Access Trap
Whenever a word operand read or write access is attempted to an odd byte 
address, the ILLOPA flag in register TFR is set and the CPU enters the 
illegal word operand access
trap routine.

Sprich wenn Du versucht auf einen n*16 Bit-Operanden zuzugreifen, der an 
einer ungeraden Adresse liegt gibt es denn TRAP.

Gruß
OP (Firma: Dilas Diodenlaser GmbH) #1462499
Hallo,

danke schonmal. Ich habe mir auch schon gedanken um dieses Problem 
gemacht, wollte aber nicht gleich meine ganzen Überlegungen hier 
hinschreiben, um eine unabhängige Meinung bzw. Idee zu bekommen.

Ich bin auf der Suche nach der Ursache für diese ungerade 
Speicheradresse.

Ich weiß nicht so recht wie es dazu kommt? Hatte schon überlegt, ob 
vielleicht ein Datentyp falsch ist oder der Speicherplatz falsch 
angelegt ist.

Gruß Patrick
#1462593
Patrick Moll schrieb:
> Ich weiß nicht so recht wie es dazu kommt? Hatte schon überlegt, ob
> vielleicht ein Datentyp falsch ist oder der Speicherplatz falsch
> angelegt ist.
Kann sein, wenn z.B. auf eine ungerade Byte Adresse wortweise 
zugegriffen wird.
Oder anderer häufiger Fehler:
Indirekter Speichzugriff,
MOV R1,[R2]  -> R2 ungerade

Für die Programmentwicklung hifreich ist es, eine Interruptroutine an 
die TRAP Vektoren anzuhängen, die einem auf der seriellen Schnittstelle 
(sofern vorhanden) sämtliche Registerinhalte und den CSP/IP ausgibt, 
dann sind solche Fehler schnell gefunden.

Welche Debugmöglichkeiten bestehen denn?
Gast #1462688
Mit einem Cast bekommt man so einen Fehler leicht hin, wenn man ein Word 
oder eine Struktur mit Words auf eine beliebige Adresse castet.

Fällt dann ein Word auf eine ungerade Adresse, gibt es bei Zugriff einen 
Fehler (interrupt).
OP (Firma: Dilas Diodenlaser GmbH) #1463593
Hallo,

hier ist mal die Funktion, in der der Fehler auftritt.

int GetDataADC(int *piData)
  {
  int i;

  SSC1_CON_EN = 0;
  SSC1_BR = 0x01;  // Baudrate  10Mbit/s
  SSC1_CON = 0xc05f;
  CS_ADC = 0;  // select DAC
  for (i=0; i< 6;i++)
    {
    SSC1_TB = 0x0000;  // sen Anzahl der Nutzdaten
    while(!SSC1_RIC);  // warte bis Ende der Übertragung
    SSC1_RIC = 0;  // Flag zurücksetzen


*(piData+i) = SSC1_RB;   //Hier tritt der Fehler auf !!!!!


    }
  CS_ADC = 1;   // deselect DAC
  Conversionstart_ADC=0;
  CC2_OUT_CC3IO = 0;
  return 0;
  }


Gruß Patrick
Gast #1463698
Hi,

ist doch auch kein Wunder.
Du erhöhst piData im zweiten Schleifendurchlauf um 1. Wenn am Anfang 
eine gerade Adresse drin stand steht da jetzt eine Ungerade. Dann 
greifst Du auf diese Adresse zu und schreibst einen 16 Bit-Wert rein -> 
Du greifst auf einen Word-Operanden an einer ungeraden Adresse zu und 
löst damit den Trap aus.

Gruß
OP (Firma: Dilas Diodenlaser GmbH) #1464286
Hallo,

stimmt guter Hinweis, habe aber herausgefunden, dass pidata schon direkt 
nach dem Aufruf der Funktion eine ungerade Adresse hat. Das kommische 
ist es ist nicht vorhersehbar wann der Fehler auftritt, also ich meine 
er tritt nicht immer dann auf wenn die Funktion jedesmal aufgerufen 
wird, sondern z.B erst nach 3 Stunden.

Gruß Patrick

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.