www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Mikrocontroller XC886


Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Carsten St. (carsten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du auch die USB-Treiber für den USB-UART-Chip installiert? Schau 
mal in deiner Systemsteuerung ob das Board richtig erkann wird. (Unknown 
USB-Device ist schlecht, z.B. COM8 ist gut)

Wieso nutzt du den BSL und nicht den USB-Wiggler? (nehme an ULINK oder 
Tantino von Hitex)

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Carsten St. (carsten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du must den Debugger einmal bei "Debug" in Projektsettings einstellen 
und zum Programmieren auch noch unter "Utilities->Use Target Driver for 
Flash Programming"

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss man noch Jumper entfernen oder setzen? Die grüne LED blinkt 
ständig.
Die anderen LED RUN und COM sind immer aus.

Autor: Carsten St. (carsten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eigentlich nicht.

edit: Kannst aber mal den BSL-Jumper offen lassen.

Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 = ~(0x01);       // clear message pending register
  CAN_vWriteEN(D0_VALID);    // bitposition 0 ( message object 0 )

  CAN_vWriteCANAddress(CAN_MOCTR0);   // Addressing CAN_MOCTR0
  CAN_DATA0 = 0x09;   // Reset RxPND and NEWDAT flag for object 0
  CAN_vWriteEN(D0_VALID);
  CAN_vWriteCANAddress(CAN_MODATAL0);
  CAN_vReadEN();
  P3_DATA = CAN_DATA0;

  CAN_popAMRegs();      // restore the CAN Access Mediator Registers
}  //  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?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich müsste man das Interrupt Pending Register gar nicht 
zurücksetzen.

Autor: Carsten St. (carsten)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich finde es macht hier in diesem Fall nicht sehr viel Sinn. 
Wichtig ist doch blos, dass das PxPND und NEWDTA Flag wieder 
zurückgesetzt werden.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es in diesem Forum jemand der sehr gute Erfahrungen hat mit dem 
XC888?
Mich würde dies interessieren ob ich trotz all dem in der ISR das MSPND 
Register dementsprechend löschen muss.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.