Forum: Mikrocontroller und Digitale Elektronik PIC18 Ein Array mit mehr als 256


von Klatec (Gast)


Lesenswert?

Hallo Zusammen
Wie kann ich ein Array mit mehr als 256 Speicherlätze erreichen.

ucTestPuf[1024] geht nicht.

Bitte. Danke.

Lg.
Johann K.

von Coder (Gast)


Lesenswert?

Ohne Angabe der Fehlermeldung spekuliere ich auf nicht genug RAM.

von Klatec (Gast)


Lesenswert?

Hallo

PIC18F46K80
Die Fehlermeldung lautet:
Error - section 'dSerPufOutProt' can not fit the absolute section. 
Section 'dSerPufOutProt' start=0x00000400, length=0x00000101
Errors    : 1

Es ist sicher genügend Speicher vorhanden, es ist nur ein kleiner Teil 
belegt.

von Coder (Gast)


Lesenswert?

Section 'dSerPufOutProt' größer machen?
Soweit reichen meine PIC Kenntnisse nicht. Da muss Dir jemand anders 
helfen.

von pic (Gast)


Lesenswert?

Das Problem ist, daß das Array nicht in eine section reinpasst.
Wenn du dir mal ein std. Linkerfile ansiehst wirst du feststellen, daß
die sections max 256 bytes sind. Dies hat mit einer Compilerschwäche zu
tun, bzw der HW. Deshalb muss auch in bestimmten Codestellen ein Pointer
anstelle des Array verwendet werden. Und so geht es:

  #pragma udata DATA
  unsigned int ucTestPuf[1024];
  #pragma udata
  unsigned int *ucTestPuf_ptr = &ucTestPuf[0];

und im Linkerfile, kommentier die gpr4-12 aus (oder andere)

DATABANK   NAME=data      START=0x400          END=0xCFF 
PROTECTED
SECTION    NAME=DATA      RAM=data

von pic (Gast)


Lesenswert?

Natürlich nicht das orginale Linkerfile ändern, sondern eine lokal Kopie 
und diese dann zum Linken verwenden.

von Klatec (Gast)


Lesenswert?

Danke
Werde ich versuchen.

Lg.
Johann K

von Kein Name (Gast)


Lesenswert?

In der Doku zum C18 findet sich ein Beispiel.
-> C18 Toolchain
-> MPLAB C Compiler for PIC18 MCUs
-> Examples
-> Application: Creating Large Data Objects and the USART

von Klatec (Gast)


Lesenswert?

Hallo Pic

Ich habe es versucht aber immer nur eine Fehlermeldung erhalten. 
Nachfolgend der Inhalt der Datei 18f46k80.lkr, kannst du die Änderung 
vornehmen. Bitte Danke.

Lg.
Johann K.


**************************

// File: 18f46k80.lkr
// Generic linker script for the PIC18F46K80 processor

#DEFINE _CODEEND _DEBUGCODESTART - 1
#DEFINE _CEND _CODEEND + _DEBUGCODELEN
#DEFINE _DATAEND _DEBUGDATASTART - 1
#DEFINE _DEND _DATAEND + _DEBUGDATALEN

LIBPATH .

#IFDEF _CRUNTIME
  #IFDEF _EXTENDEDMODE
    FILES c018i_e.o
    FILES clib_e.lib
    FILES p18f46k80_e.lib

  #ELSE
    FILES c018i.o
    FILES clib.lib
    FILES p18f46k80.lib
  #FI

#FI

#IFDEF _DEBUGCODESTART
  CODEPAGE   NAME=page       START=0x0               END=_CODEEND
  CODEPAGE   NAME=debug      START=_DEBUGCODESTART   END=_CEND 
PROTECTED
#ELSE
  CODEPAGE   NAME=page       START=0x0               END=0xFFFF
#FI

CODEPAGE   NAME=idlocs     START=0x200000          END=0x200007 
PROTECTED
CODEPAGE   NAME=config     START=0x300000          END=0x30000D 
PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE          END=0x3FFFFF 
PROTECTED
CODEPAGE   NAME=eedata     START=0xF00000          END=0xF003FF 
PROTECTED

#IFDEF _EXTENDEDMODE
  DATABANK   NAME=gpr0       START=0x0               END=0xFF
#ELSE
  ACCESSBANK NAME=accessram  START=0x0               END=0x5F
  DATABANK   NAME=gpr0       START=0x60              END=0xFF
#FI

DATABANK   NAME=gpr1       START=0x100             END=0x1FF
DATABANK   NAME=gpr2       START=0x200             END=0x2FF
DATABANK   NAME=gpr3       START=0x300             END=0x3FF
DATABANK   NAME=gpr4       START=0x400             END=0x4FF
DATABANK   NAME=gpr5       START=0x500             END=0x5FF
DATABANK   NAME=gpr6       START=0x600             END=0x6FF
DATABANK   NAME=gpr7       START=0x700             END=0x7FF
DATABANK   NAME=gpr8       START=0x800             END=0x8FF
DATABANK   NAME=gpr9       START=0x900             END=0x9FF
DATABANK   NAME=gpr10      START=0xA00             END=0xAFF
DATABANK   NAME=gpr11      START=0xB00             END=0xBFF

#IFDEF _DEBUGDATASTART
  DATABANK   NAME=gpr12      START=0xC00             END=_DATAEND
  DATABANK   NAME=dbgspr     START=_DEBUGDATASTART   END=_DEND 
PROTECTED
#ELSE //no debug
  DATABANK   NAME=gpr12      START=0xC00             END=0xCFF
#FI

DATABANK   NAME=sfr13      START=0xD00             END=0xDFF 
PROTECTED
DATABANK   NAME=sfr14      START=0xE00             END=0xEFF 
PROTECTED
DATABANK   NAME=sfr15      START=0xF00             END=0xF5F 
PROTECTED
ACCESSBANK NAME=accesssfr  START=0xF60             END=0xFFF 
PROTECTED

#IFDEF _CRUNTIME
  SECTION    NAME=CONFIG     ROM=config
  #IFDEF _DEBUGDATASTART
    STACK SIZE=0x100 RAM=gpr11
  #ELSE
    STACK SIZE=0x100 RAM=gpr12
  #FI
#FI

von Chris (Gast)


Lesenswert?

Hier wird eine section von 2Kbyte bereitgestellt, mit namen DATA.
Das Ram reduziert sich, gpr12 wird noch beibehalten, da ev. für 
debugging
relevant. Welche Fehlermeldung hast du bekommen, was hast du anders 
gemacht.

DATABANK   NAME=gpr1       START=0x100             END=0x1FF
DATABANK   NAME=gpr2       START=0x200             END=0x2FF
DATABANK   NAME=gpr3       START=0x300             END=0x3FF
#if 1
DATABANK   NAME=data      START=0x400          END=0xBFF PROTECTED
SECTION    NAME=DATA      RAM=data
#else
DATABANK   NAME=gpr4       START=0x400             END=0x4FF
DATABANK   NAME=gpr5       START=0x500             END=0x5FF
DATABANK   NAME=gpr6       START=0x600             END=0x6FF
DATABANK   NAME=gpr7       START=0x700             END=0x7FF
DATABANK   NAME=gpr8       START=0x800             END=0x8FF
DATABANK   NAME=gpr9       START=0x900             END=0x9FF
DATABANK   NAME=gpr10      START=0xA00             END=0xAFF
DATABANK   NAME=gpr11      START=0xB00             END=0xBFF
#endif

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.