mikrocontroller.net

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


Autor: Siegfried Saueressig (dieleena)
Datum:

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

Autor: rtfm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außer in den Kommentaren ist da nirgendwo von Adressen die Rede ?

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Siegfried Saueressig (dieleena)
Datum:

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

Autor: rtfm (Gast)
Datum:

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

Autor: A. K. (prx)
Datum:

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

Autor: Siegfried Saueressig (dieleena)
Datum:

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

Autor: Siegfried Saueressig (dieleena)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und jetzt fehlen noch die Mapfiles für beide Fälle.

Autor: Siegfried Saueressig (dieleena)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
anbei die nach.map
Siegfried

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
und hier die vor.map
Gruß Siegfried

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

Autor: Siegfried Saueressig (dieleena)
Datum:

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

Autor: A. K. (prx)
Datum:

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

Autor: Siegfried Saueressig (dieleena)
Datum:

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

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.