Forum: Mikrocontroller und Digitale Elektronik PIC C18 ein ganz gemeiner Fehler


von Siegfried S. (dieleena)


Lesenswert?

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

von rtfm (Gast)


Lesenswert?

Außer in den Kommentaren ist da nirgendwo von Adressen die Rede ?

von Peter D. (peda)


Lesenswert?

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

von Siegfried S. (dieleena)


Lesenswert?

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

von rtfm (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Siegfried S. (dieleena)


Lesenswert?

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

von Siegfried S. (dieleena)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Und jetzt fehlen noch die Mapfiles für beide Fälle.

von Siegfried S. (dieleena)


Angehängte Dateien:

Lesenswert?

Hallo,
anbei die nach.map
Siegfried

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
und hier die vor.map
Gruß Siegfried

ups...
bekomme die Datei nicht hochgeladen
versuche es nocheinmal

von Siegfried S. (dieleena)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Siegfried S. (dieleena)


Lesenswert?

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
Noch kein Account? Hier anmelden.