Hallo,
ich versuche gerade die 1K-Grenze bei dem angegebenen Compiler zu
umgehen. Ich habe ein Programm, dass eine Nachricht über die serielle
Schnittstelle an den PC sendet. In einem Modul funktioniert es. Wenn ich
jedoch eine Funktion in ein anderes Modul auslagere, kommt am PC nichts
an. Vor dem senden soll die eine Pause-Funktion von 4 Sekunden
aufgerufen werden, die in einem anderen Modul liegt:
void delay100(bank1 char t)
{
uns16 ms;
uns8 i;
for (i = 0; i < 100; i++)
{
ms = 5*t; // Die Funktion ist für 4MHz Takt gedacht. Bei
20MHz muss
// die Pause mit einem Faktor von 5
multipliziert werden
while(ms) // Schleife verlassen, wenn ms=0 ist
{
OPTION = 2; // Vorteiler auf 8 einstellen
TMR0 = 131; // 125 * 8 = 1000 (= 1 ms)
while (TMR0); // Abwarten einer Millisekunde
ms--; // "ms" mit jeder Millisekunde erniedrigen
}
}
}
Die gemeinsame include-Datei sieht wie folgt aus:
// delay.c
extern page0 void delay100(char t);
Das Linker script:
// Sample linker command file for 16F873
// $Id: 16f873.lkr,v 1.5.16.1 2005/11/30 15:15:29 curtiss Exp $
LIBPATH .
CODEPAGE NAME=vectors START=0x0 END=0x3 PROTECTED
//CODEPAGE NAME=page0 START=0x4 END=0x7FF
INCLUDE main.lkr // change to right module/script file name
CODEPAGE NAME=page1 START=0x800 END=0xFFF
CODEPAGE NAME=.idlocs START=0x2000 END=0x2003 PROTECTED
CODEPAGE NAME=.config START=0x2007 END=0x2007 PROTECTED
CODEPAGE NAME=eedata START=0x2100 END=0x217F PROTECTED
DATABANK NAME=sfr0 START=0x0 END=0x1F PROTECTED
DATABANK NAME=sfr1 START=0x80 END=0x9F PROTECTED
DATABANK NAME=sfr2 START=0x100 END=0x10F PROTECTED
DATABANK NAME=sfr3 START=0x180 END=0x18F PROTECTED
SHAREBANK NAME=gpr0 START=0x20 END=0x7F
SHAREBANK NAME=gpr0 START=0x120 END=0x17F
SHAREBANK NAME=gpr1 START=0xA0 END=0xFF
SHAREBANK NAME=gpr1 START=0x1A0 END=0x1FF
SECTION NAME=STARTUP ROM=vectors // Reset and interrupt vectors
SECTION NAME=ISERVER ROM=intserv // Interrupt routine
SECTION NAME=PROG1 ROM=page0 // ROM code space - page0
SECTION NAME=PROG2 ROM=page1 // ROM code space - page1
SECTION NAME=IDLOCS ROM=.idlocs // ID locations
SECTION NAME=DEEPROM ROM=eedata // Data EEPROM
SECTION NAME=BANK0 RAM=sfr0 // RAM bank 0
SECTION NAME=BANK1 RAM=sfr1 // RAM bank 1
SECTION NAME=BANK2 RAM=sfr2 // RAM bank 1
SECTION NAME=BANK3 RAM=sfr3 // RAM bank 1
Also irgendwie scheint der PIC bei dieser Funktion hängen zu bleiben.
Beim compilieren bekomme ich auch mehrmals folgende Fehlermeldung:
Register in operand not in bank 0. Ensure that bank bits are correct.
Damit kann ich aber nichts anfangen.
mfg
Sebastian
Der Link ist mir bekannt und genauso habe ich es ja auch probiert. Aber irgendwie scheint das bei mir nicht klappen zu wollen.
Vielleicht helfen Dir die folgenden Beiträge Beitrag "PIC 16F877 EEPROM / CC5X" Beitrag "cc5x und PIC 16F628 / 88 problem" Oder meine Erkenntnisse auf meiner Homepage http://www.stefan-buchgeher.info/elektronik/cc5x/cc5x.html Stefan B. (Linz, Österreich)
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.