Forum: Mikrocontroller und Digitale Elektronik Interrupt Trap XC167


von Patrick M. (Firma: Dilas Diodenlaser GmbH) (moll)


Lesenswert?

Hallo,

was für Ursachen kann denn ein Interrupt TRAP der Art Illegal Word 
Operrant haben?

Gruß Patrick

von Ampfing (Gast)


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ß

von Patrick M. (Firma: Dilas Diodenlaser GmbH) (moll)


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

von B. J. (bjue)


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?

von Patrick M. (Firma: Dilas Diodenlaser GmbH) (moll)


Lesenswert?

Die Entwicklungsumgebung ist Keil µ Vision 3

von mafrmt00 (Gast)


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).

von Patrick M. (Firma: Dilas Diodenlaser GmbH) (moll)


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

von Ampfing (Gast)


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ß

von Patrick M. (Firma: Dilas Diodenlaser GmbH) (moll)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.