Interrupt Trap XC167

Gast #1462474
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren