Hallo, MPLAP mit C18 Compiler, PIC 18F4550 unsigned char BusSpiOutput[128]; unsigned char BusSpiInput[128]; möchte zwei Array anlegen mit einer Größe von je 128 Byte Bekomme aber eine Fehlermeldung. MPLINK 3.90, Linker Copyright (c) 2004 Microchip Technology Inc. Error - section '.udata_UsbBusSpiTransfer.o' can not fit the section. Section '.udata_UsbBusSpiTransfer.o' length=0x0000010f Errors : 1 Wenn ich das eine Array mit 64 Bytes und das andere mit 128 anlege, funktioniert es. Gruß Siegfried
Der RAM ist endlich. Dein IC hat scheinbar keine 256 Byte RAM. Ein bisschen braucht auch der Stack, kann man einstellen, irgendwo. MFG Falk
Hallo, habe Memory Usage Gauge aufgerufen. Programm 16384 / 882 Data 2048 / 453 "Dein IC hat scheinbar keine 256 Byte RAM." kann doch nicht beim 18 F4550 sein? Der Stack benötigt doch nicht ca 80% vom Data Memory? Gruß Siegfried
Der uC hat 2kByte RAM, nur am RAM allein kanns also nicht liegen... Welche Linker-Direktiven sind im Makefile vorgegeben? Wie sind die Sections eingestellt? Was ist das für eine Variable UsbBusSpiTransfer? Sind die Arrays global oder lokal? Sourcecode?
Hat der Pic nicht diese Memory-Page Krankheit? Und hat evtl. dein Compiler noch die Dumme Idee gehabt, alle Variablen aus einem .c File in einem Page unterzubringen? Versuch mal, entweder den "Verbesserten" Modus des 18Fs zu aktivieren (Geht über so ein Config-Bit), oder leg das zweite Array mal in einem Seperatem .c-File an, das danach dazugelinkt wird.
ups, kann zu allem keine Antwort geben. So genau kenne ich mich nicht aus. das erstellte Makefile habe ich als Anhang beigefügt. UsbBusSpiTransfer ist der Name des Sourcecode. Array ist lokal. Fehler erscheint alleine schon beim anlegen der Array. Die Zeilen zum löschen des Array ist nicht nötig, um beschriebenen Fehler zu erhalten. for ( AdrCount = 0; AdrCount <= (MaxBusSpiInOut-1); AdrCount ++ ) { BusSpiOutput[AdrCount] = 0; BusSpiInput[AdrCount] = 0; } für Infos zum Einstellen bin ich dankbar. Gruß Siegfried
hallo, habe eine weitere *.c erzeugt und eingebunden das geht unsigned char BusSpi_Output[128]; unsigned char BusSpi_Input[128]; dieses nicht mehr unsigned char BusSpi_Output[128]; unsigned char BusSpi_Input[256]; welche Bit's sind das? Versuch mal, entweder den "Verbesserten" Modus des 18Fs zu aktivieren (Geht über so ein Config-Bit) gruß Siegfried
Siegfried Saueressig wrote: > Array ist lokal. > Lokal zu was? Der Funktion, dem File, dem Namespace, der Schleife? Zeig doch mal deinen Quelltext, zumindest den Teil wo die Arrays angelegt werden, mit etwas Kontext. > dieses nicht mehr > unsigned char BusSpi_Output[128]; > unsigned char BusSpi_Input[256]; Klar. Mit dem Pic im "Kompatibilitäts"-Modus kann der Compiler keine Arrays > 256 Bytes anlegen. Exakt 256 müssten gehen, aber dann muss das nochmal in ein getrenntes File (Scheint ein recht seltsamer Kompiler zu sein...) Mit der Fausregel "Maximal 256Bytes Ram pro .c - Datei" solltest du dein Projekt so aufspalten können, dass es passt.
hallo, Arbeite mit MPLAP mit C18 Compiler, PIC 18F4550 Welche Macken der C Compiler von Microchip hat, weis ich noch nicht. Eine habe ich ja zu spüren bekommen. in seperaten File funkioniert es wie folgt. das geht unsigned char BusSpi_Output[128]; unsigned char BusSpi_Input[128]; dieses nicht mehr unsigned char BusSpi_Output[128]; unsigned char BusSpi_Input[256]; "length=0x0000010f" kann unter Umstände die Anzahl/Länge der Übeschreidung von den 256 Bytes pro c File sein. ------------- Source Code ------------ ob der Code in den Schleifen richtig funktioniert, weiß ich noch nicht. //--------------------------------------------------------------------- // Projekt: StellpultUsbPc.mcs // // File: InitUsbBusSpi.c // // PIC: 18F4550 // // //--------------------------------------------------------------------- #include <p18f4550.h> // Register definitions #include <stdlib.h> #include <string.h> #include <timers.h> // Timer library functions #include <delays.h> // Timer library functions #include <spi.h> #include "UsbPcGlobal.h" #include "PortModul.h" //--------------------------------------------------------------------- // Variable declarations //--------------------------------------------------------------------- unsigned int AdrCount; unsigned int BusSpiCount_1; unsigned int BusSpiCount_2; unsigned int BusSpiCount_3; unsigned int BusSpiCount_4; // unsigned char BusSpiOutput[64]; unsigned char BusSpiInput[64]; unsigned int MaxBusSpiInOut = 8; unsigned int MaxBusSpiModule = 8; unsigned int MaxBusSpiBytes = 8; //--------------------------------------------------------------------- // Function Prototypes //--------------------------------------------------------------------- void InitUsbBusSpi(void); // initialize USB Bus SPI void ConnectUsbBusSpi(void); // Connect USB Bus SPI void RunUsbBusSpi(void); // Run USB Bus SPI void AdrUsbBusSpi(void); // Adresse USB Bus SPI void DeleteUsbBusSpi(void); // lösche Register //--------------------------------------------------------------------- // externe Function Prototypes //--------------------------------------------------------------------- #pragma code /* ******************************************************************* */ // ConnectUsbBusSpi() Run USB Bus SPI // void ConnectUsbBusSpi(void) { // AdrCount = 0; AdrUsbBusSpi(); ProzessStatus SET_BIT BIT_1; // bit 76543210 SSPSTAT = 0b01000000; // bit 76543210 SSPCON1 = 0b00100010; // SPI0_EN = 1; SPI0_EN = 0; BusSpiCount_3 = 0; for ( BusSpiCount_1 = 0; BusSpiCount_1 <= (MaxBusSpiModule-1); BusSpiCount_1 ++ ) { for ( BusSpiCount_2 = 0; BusSpiCount_2 <= (MaxBusSpiBytes-1); BusSpiCount_2 ++ ) { SSPSTATbits.BF = 0; SSPBUF = BusSpiOutput[BusSpiCount_2]; while(SSPSTATbits.BF == 1); SSPSTATbits.BF = 0; BusSpiInput[BusSpiCount_3] = SSPBUF; BusSpiCount_3 ++; } } SPI0_EN = 1; // BusSpiCount_3 = 0; for ( BusSpiCount_1 = 0; BusSpiCount_1 <= (MaxBusSpiModule-1); BusSpiCount_1 ++ ) { for ( BusSpiCount_2 = 0; BusSpiCount_2 <= (MaxBusSpiBytes-1); BusSpiCount_2 ++ ) { if (BusSpiOutput[BusSpiCount_2] == BusSpiInput[BusSpiCount_3]) { BusSpiCount_4 ++; } BusSpiCount_3 ++; } } SPI0_EN = 1; } /* ********** END ConnectUsbBusSpi() */ gruß Siegfried
Hallo, Habe eine eigne C Datei angelegt. Damit funktioniert es. Wie kann ich dieses umgehen ? " Mit der Fausregel "Maximal 256Bytes Ram pro .c - Datei" solltest du dein Projekt so aufspalten können, dass es passt. " Tritt diese auch bei anderen Compiler z.B. CCS auf ? Gruß 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.