Probleme mit Mikrocontroller XC886

Gast #572642
Lesenswert?

Guten Abend,

ich habe mir von Infineon das Starter-Kid mit dem Mikricontroller XC886 
und einen Emulator (USB-Wiggler) geholt. Ich habe dann gleich alle Tool 
installiert (DAVE,Keil usw). Wenn wenn ich das Tool XC800_FLOAD.exe 
ausführe und dann auf den Button "Find Device" drücke, dann wird das 
Gerät nicht erkannt. In der Liste sehe ich nur den COM1. Das ist ja 
meine serielle Schnittstelle. In uVision bekomme ich auch keine 
Verbindung zustande.
Bin jetzt ratlos!!!
Gast #572655
Lesenswert?

Hast du daran gedacht den BSL Jumper zu setzen bevor du "Find Device " 
drückst? Und sobald XC800 das Device sucht musst du den Resettaster 
drücken.

So funktioniert es zumindest beim XC866 Starterkit, und hier wird es das 
gleiche sein.
Gast #572755
Lesenswert?

Gestern Nacht, habe ich es geschafft, ein HEX File mit dem Tool 
XC800_FLOAD.exe auf den Mikrocontroller zu laden. Ich habe nur das USB 
Kabel zwischen PC und Starter-Kid angeschlossen.
Mit dem Emulator USB-WIGGLER habe ich noch so meine Probleme. Unter 
uVision habe ich das ganze für den USB-Emulator eingerichtet. Wenn ich 
das Projekt comiliere und anschließend auf LOAD gehe, dann wird der 
EMULATOR gar nicht erkannt. Ich habe dann keine Verbindung. Was muss man 
bei dem EMULATOR alles beachten? Vielleicht habe ich noch ein paar 
Einstellungsfeher?
Gast #573134
Lesenswert?

Ok ich lade jetzt die HEX Dateien immer mit dem Tool XC800_FLOAD auf den 
Mikrocontroller. Das tut jetzt! Mit dem Starter-Kid bin ich gerade dabei 
eine CAN Verbindung zu dem CAN Dongle von der Firma PeakTech zu 
realisieren.
Als Baudrate verwende ich 500kBit/s. Mit einem zweiten CAN Dongle habe 
ich die CAN verbindung zu meinem anderen CAN Dongle getestet. Das tut 
auch.
Ich habe mit DAVE eine CAN Kommunikation für den Controller 
eingerichtet.
Ich sehe auf meinem PC keine Botschaften vom Mikrocontroller.
Hat jemand schon mal eine CAN Verbindung mit dem Mikrocontroller 
realisert?
Angehängte Dateien:
Gast #580614
Lesenswert?

Hallo,

ich habe mir einen FIFO-Puffer mit 3 Message Objekten gebildet, um 
CAN-Pakete zu Empfangen und zu einem späteren Zeitpunkt zu bearbeiten.

Objekt Liste von CAN Node 1 sieht folgendermassen aus:

Message Object 0-1 => FIFO-Puffer Objekte
Message Object 2 => FIFO Base Object

Ich nutze die von Dave generierte Funktion CAN_ubReadFIFO um aktuelle
Nachrichten aus dem FIFO-Puffer zu laden und dann zu bearbeiten.

main(void)
{
 ...
 while(1)
   {
    CAN_ubReadFIFO(2,&receive);
    wait(500); // Verzögerung
    P3_DATA = receive.datenByte1;
   }
}

Leider gibt die Funktion CAN_ubReadFIFO nur das erste CAN Paket (über
den als Paramter übergebenen Zeiger) das ankommt zurück (Rückgabewert
der Funktion ist 1, was dafür steht, dass ein neues CAN-Pakete über den
Zeiger zurückgegeben wurde). Bei jedem weiteren gibt die Funktion den
Wert 0 zurück, was laut Funktionsbeschreibung aussagt, dass keine neuen
Pakete vorliegen.

Nun weiss ich leider nicht ob das Problem an der Funktion liegt oder das
angekommene Paket gar nicht erst in den FIFO-Puffer eingetragen wurde
und deshalb die Funktion nichts zurück liefert.

Muss ich noch etwas beachten, evtl. in DAVE ?
Angehängte Dateien:
Gast #619910
Lesenswert?

1
void SHINT_viXINTR5Isr(void) interrupt XINTR5INT
2
{
3
  CAN_pushAMRegs();  // Push the CAN Access Mediator Registers
4
  IRCON2 &= ~(ubyte)0x01;   // Clear CANSRC0
5

6
  CAN_vWriteCANAddress(CAN_MSPND0);   //Addressing CAN_MSPND0
7
  CAN_DATA0 = ~(0x01);       // clear message pending register
8
  CAN_vWriteEN(D0_VALID);    // bitposition 0 ( message object 0 )
9

10
  CAN_vWriteCANAddress(CAN_MOCTR0);   // Addressing CAN_MOCTR0
11
  CAN_DATA0 = 0x09;   // Reset RxPND and NEWDAT flag for object 0
12
  CAN_vWriteEN(D0_VALID);
13
  CAN_vWriteCANAddress(CAN_MODATAL0);
14
  CAN_vReadEN();
15
  P3_DATA = CAN_DATA0;
16

17
  CAN_popAMRegs();      // restore the CAN Access Mediator Registers
18
}  //  End of function SHINT_viXINTR5Isr

Wofür ist das Register MSPND eigentlich gut? Das was im Datenblatt 
darüber steht, verstehe ich nicht. Warum muss dieses Bit wieder 
zurückgesetzt werden?

Wenn ich in der ISR die Funktion CAN_vGetMsgObj verwende, muss ich doch 
auch das entsprechende Bit vom MSPND Register sowie MOCTR Register 
zurücksetzen oder?
#620108
Lesenswert?

Wenn ein Interrupt des CAN-Moduls erzeugt werden soll wird ein Bit im 
Pending-Register gesetzt. Anhand von diesen Bits wird ein Interrupt 
ausgelöst. Man geht über das Pending-Register, weil es deutlich mehr 
Interruptquellen als Vektoren gibt und irgendwie muss man ja entscheiden 
können wer den Interrupt ausgelöst hat (auch für Priorisierung der 
Interrupts wichtig). Wenn man diese Bits nicht zurück setzt, dann meint 
der µC dass dauernd ein Interrupt verlangt wird.
Gast #620115
Lesenswert?

Die bedeutet ich kann in der ISR mit einer IF Bedingung das MSPND 
Register prüfen. Wenn z.B. Bit 2 auf 1 liegt, dann kann ich die Funktion 
CAN_vGetMsgObj ausführen. Anschließend muss man dieses Bit im MSPND 
Register wieder löschen. Stimmt dies so?
Gast #620119
Lesenswert?

Bei mir greifen mehrere Message Objekte (Receive) auf eine ISR zu.
Dies bedeutet ich muss ja prüfen, welcher Message Objekt gerade die 
Nachricht empfängt. Da kann man ja das MSPND Register gut dazu 
verwenden.
Gast #620602
Lesenswert?

In der ISR kann ich maximal 3 Message Objekte empfangen. Dies hab ich so 
konfiguriert.

void SHINT_viXINTR5Isr(void) interrupt XINTR5INT
{
  CAN_pushAMRegs();  // Push the CAN Access Mediator Registers
  IRCON2 &= ~(ubyte)0x01;   // Clear CANSRC0

  CAN_vWriteCANAddress(CAN_MSPND0);   //Addressing CAN_MSPND0
  CAN_DATA0 = ~(0x2E);       // clear message pending register
  CAN_vWriteEN(D0_VALID);    // bitposition ? ( message object 1  2  5 
)

  CAN_vWriteCANAddress(CAN_MOCTR1);   // Addressing CAN_MOCTR1
  CAN_DATA0 = 0x09;   // Reset RxPND and NEWDAT flag for object 1
  CAN_vWriteEN(D0_VALID);

  CAN_vWriteCANAddress(CAN_MOCTR2);   // Addressing CAN_MOCTR2
  CAN_DATA0 = 0x09;   // Reset RxPND and NEWDAT flag for object 2
  CAN_vWriteEN(D0_VALID);

  CAN_vWriteCANAddress(CAN_MOCTR5);   // Addressing CAN_MOCTR5
  CAN_DATA0 = 0x09;   // Reset RxPND and NEWDAT flag for object 5
  CAN_vWriteEN(D0_VALID);


  CAN_popAMRegs();      // restore the CAN Access Mediator Registers

  CAN_vGetMsgObj(1,&stCAN);
  ....
  CAN_vGetMsgObj(2,stCAN);
  ...
  CAN_vGetMsgObj(5,stCAN);
  ...
}  //  End of function SHINT_viXINTR5Isr

Muss ich überhaupt in diesem Fall das Message Pending Register 
zurücksetzen oder nicht? Wenn ja woher weiss ich welches Bit ich genau 
zurücksetzen sollte? Das RxPND und das NEWDAT Flag sollte man ja 
definitiv immer wieder zurücksetzen.
Gast #620883
Lesenswert?

Egal ob ich in der ISR das MSPND Register lösche oder auch nicht,
das Empfangen der Nachrichten wird davon nicht beeinträchtigt.
Also ich kann da auch nichts feststellen. Der ISR wird immer ausgelöst, 
sobald ich eine entsprechende CAN Nachricht auf den CANBUS gebe.

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