Hallo, PIC 18F8722 & C18 bei mir tritt ein ganz gemeiner Fehler auf. In meiner Routine wollte ich folgende Variable löschen. //--------------------------------------------------------------------- // Variable declarations //--------------------------------------------------------------------- volatile unsigned int BTS_1; volatile unsigned int BTS_2; volatile unsigned int BTS_3; volatile unsigned int BTS_4; volatile unsigned int BTS_5; volatile unsigned int BTS_6; volatile unsigned char BusSpiOutTransfer[MaxBusSpiTransfer]; volatile unsigned char BusSpiInTransfer[MaxBusSpiTransfer]; void init_spi_bus(void) { --> 1: InitBusSpi(); BusSpiOutTransfer[0] = 'C'; BusSpiOutTransfer[1] = 'O'; BusSpiOutTransfer[2] = 'N'; BusSpiOutTransfer[3] = 'N'; BusSpiOutTransfer[4] = 'E'; BusSpiOutTransfer[5] = 'C'; BusSpiOutTransfer[6] = 'T'; BusSpiOutTransfer[7] = '!'; BusSpiOutTransfer[8] = 0x00; BusSpiOutTransfer[9] = 0x00; // --> 2: BTS_1 = 0; // Adresse C00 BTS_2 = 0; // Adresse C02 BTS_3 = 0; // Adresse C04 BTS_4 = 0; // Adresse C06 BTS_5 = 0; // Adresse C08 BTS_6 = 0; // Adresse C0A } wenn ich die Code so nutze, wird Variable BTS_1 bis BTS_6 nicht wie vom Compiler definierter Adresse C00 bis C0A der Wert auf "0" gesetzt, sondern an Adresse D00 bis D0A. Laß ich die Zeilen unter --> 1: weg, funktioniert es. ???? Gruß Siegfried
Außer in den Kommentaren ist da nirgendwo von Adressen die Rede ?
Seit wann interessiert es unter C, an welcher Adresse irgendwelche Objekte liegen? Wenn man nicht spezielle dirty Tricks verwendet, hat der Linker völlige Freiheit alles zu plazieren, wo er lustig ist. Unter C greift man über die Namen auf Objekte zu und der Linker übersetzt dann die Namen in Adressen. Peter
Hallo, natürlich greife ich über die "Namen" zu. aber warum wird z.B. der Wert von >> BTS_1 = 0; << nicht an Adresse C00 auf NULL gesetzt sondern an Adresse D00 ? Siegfried
Weil BTS_1 entgegen deiner Meinung nicht an C00 liegt, sondern auf D00. Wo BTS_1 liegt, ist im Übrigen ziemlich willkürlich, es sei denn, du sagst dem Compiler expliziet etwas anderes. So wie oben jedenfalls IST es willkürlich. Da kannst du noch so viel rätseln und meckern.
Ich nehme an, du willst damit sagen, dass der Compiler die Bankumschaltung vom Dataspace versemmelt. Wenn das Array an Adressen DXX liegt, die BTS-Daten in CXX und der vergisst, nach den Array-Zuweisungen auf Cxx zu schalten. Da könnte ein Blick in der erzeugten Assembler-Code helfen.
Hallo,
Habe jetzt folgendes gemacht.
in Code habe ich folgende Zeile > #pragma code <
Habe die Variable jetzt nach > #pragma code < verschoben, davor war es
vor > #pragma code < . So scheint es zu funktionieren.
volatile unsigned int BTS_1;
volatile unsigned int BTS_2;
volatile unsigned int BTS_3;
volatile unsigned int BTS_4;
volatile unsigned int BTS_5;
volatile unsigned int BTS_6;
> > Wo BTS_1 liegt, ist im Übrigen ziemlich willkürlich,
ist klar, aber mir werden Werte von einer anderer Variablen
überschrieben
möchte dazusagen, das ich immer meine Variable davor habe/hatte.
Siegfried
Hallo, 1. Variable vor > #pragma code < 442: // 443: // ---->>>> ..... 444: BusSpiOutTransfer[0] = 'C'; 001B0 010D MOVLB 0xd 001B2 0E43 MOVLW 0x43 001B4 6F1B MOVWF 0x1b, BANKED 445: BusSpiOutTransfer[1] = 'O'; 001B6 0E4F MOVLW 0x4f 001B8 6F1C MOVWF 0x1c, BANKED 446: BusSpiOutTransfer[2] = 'N'; 001BA 0E4E MOVLW 0x4e 001BC 6F1D MOVWF 0x1d, BANKED 447: BusSpiOutTransfer[3] = 'N'; 001BE 6F1E MOVWF 0x1e, BANKED 448: BusSpiOutTransfer[4] = 'E'; 001C0 0E45 MOVLW 0x45 001C2 6F1F MOVWF 0x1f, BANKED 449: BusSpiOutTransfer[5] = 'C'; 001C4 0E43 MOVLW 0x43 001C6 6F20 MOVWF 0x20, BANKED 450: BusSpiOutTransfer[6] = 'T'; 001C8 0E54 MOVLW 0x54 001CA 6F21 MOVWF 0x21, BANKED 451: BusSpiOutTransfer[7] = '!'; 001CC 0E21 MOVLW 0x21 001CE 6F22 MOVWF 0x22, BANKED 452: BusSpiOutTransfer[8] = 0x00; 001D0 6B23 CLRF 0x23, BANKED 453: BusSpiOutTransfer[9] = 0x00; 001D2 6B24 CLRF 0x24, BANKED 454: // 455: // ---->>>> ..... 456: BTS_1 = 0; 001D4 6B00 CLRF 0, BANKED 001D6 6B01 CLRF 0x1, BANKED 457: BTS_2 = 0; 001D8 6B02 CLRF 0x2, BANKED 001DA 6B03 CLRF 0x3, BANKED 458: BTS_3 = 0; 001DC 6B04 CLRF 0x4, BANKED 001DE 6B05 CLRF 0x5, BANKED 459: BTS_4 = 0; 001E0 6B06 CLRF 0x6, BANKED 001E2 6B07 CLRF 0x7, BANKED 460: BTS_5 = 0; 001E4 6B08 CLRF 0x8, BANKED 001E6 6B09 CLRF 0x9, BANKED 461: BTS_6 = 0; 001E8 6B0A CLRF 0xa, BANKED 001EA 6B0B CLRF 0xb, BANKED 2. Variable nach > #pragma code < 440: // 441: // ---->>>> ..... 442: BusSpiOutTransfer[0] = 'C'; 001B0 010D MOVLB 0xd 001B2 0E43 MOVLW 0x43 001B4 6F0F MOVWF 0xf, BANKED 443: BusSpiOutTransfer[1] = 'O'; 001B6 0E4F MOVLW 0x4f 001B8 6F10 MOVWF 0x10, BANKED 444: BusSpiOutTransfer[2] = 'N'; 001BA 0E4E MOVLW 0x4e 001BC 6F11 MOVWF 0x11, BANKED 445: BusSpiOutTransfer[3] = 'N'; 001BE 6F12 MOVWF 0x12, BANKED 446: BusSpiOutTransfer[4] = 'E'; 001C0 0E45 MOVLW 0x45 001C2 6F13 MOVWF 0x13, BANKED 447: BusSpiOutTransfer[5] = 'C'; 001C4 0E43 MOVLW 0x43 001C6 6F14 MOVWF 0x14, BANKED 448: BusSpiOutTransfer[6] = 'T'; 001C8 0E54 MOVLW 0x54 001CA 6F15 MOVWF 0x15, BANKED 449: BusSpiOutTransfer[7] = '!'; 001CC 0E21 MOVLW 0x21 001CE 6F16 MOVWF 0x16, BANKED 450: BusSpiOutTransfer[8] = 0x00; 001D0 6B17 CLRF 0x17, BANKED 451: BusSpiOutTransfer[9] = 0x00; 001D2 6B18 CLRF 0x18, BANKED 452: // 453: // ---->>>> ..... 454: BTS_1 = 0; 001D4 6B2D CLRF 0x2d, BANKED 001D6 6B2E CLRF 0x2e, BANKED 455: BTS_2 = 0; 001D8 6B2F CLRF 0x2f, BANKED 001DA 6B30 CLRF 0x30, BANKED 456: BTS_3 = 0; 001DC 6B31 CLRF 0x31, BANKED 001DE 6B32 CLRF 0x32, BANKED 457: BTS_4 = 0; 001E0 6B33 CLRF 0x33, BANKED 001E2 6B34 CLRF 0x34, BANKED 458: BTS_5 = 0; 001E4 6B35 CLRF 0x35, BANKED 001E6 6B36 CLRF 0x36, BANKED 459: BTS_6 = 0; 001E8 6B37 CLRF 0x37, BANKED 001EA 6B38 CLRF 0x38, BANKED Siegfried
Hallo, und hier die vor.map Gruß Siegfried ups... bekomme die Datei nicht hochgeladen versuche es nocheinmal
Hallo, ein neuer Versuch Gruß Siegfried Was mache ich beim hochladen falsch ? zumindest das was ich kopiert habe. 1. Variable vor > #pragma code < E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\task.c BTS_1 0x000c00 data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_2 0x000c02 data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_3 0x000c04 data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_4 0x000c06 data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_5 0x000c08 data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_6 0x000c0a data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c 2. Variable nach > #pragma code < E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_1 0x000d2d data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_2 0x000d2f data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_3 0x000d31 data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_4 0x000d33 data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_5 0x000d35 data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c BTS_6 0x000d37 data extern E:\Pic_C_Sourcecode\Stellpult\StellpultController_18F8722\transfer_bus.c
Dann solltest damit mal den Support von Microchip bewerfen (die beissen nicht, ich hatte die auch schon mit einem Bug beim C30 beglückt). Aber schau dass du die aktuelle Version verwendest, denn das ist totsicher die erste Antwort. Der Code setzt vor den Array-Assignments die Bank auf D und bleibt dort, auch als er danach die Variablen setzt. In der zweiten Version sind alle in der gleichen Bank, da passt es.
Hallo, versuche doch nochmal die Datei hochzuladen. muß sehen, wie ich es mit Support von Microchip mache Siegfried PS: Ich programmiere für mein Hobby. Habe es nicht gelernt. Bin auch schon oft auf die Nase gefallen, aber ein gemeiner Fehler hatte ich noch nie. Siegfried
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.