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!!!
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.
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)
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?
Du must den Debugger einmal bei "Debug" in Projektsettings einstellen und zum Programmieren auch noch unter "Utilities->Use Target Driver for Flash Programming"
Muss man noch Jumper entfernen oder setzen? Die grüne LED blinkt ständig. Die anderen LED RUN und COM sind immer aus.
eigentlich nicht. edit: Kannst aber mal den BSL-Jumper offen lassen.
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?
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 ?
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?
Eigentlich müsste man das Interrupt Pending Register gar nicht zurücksetzen.
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.
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?
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.
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.