Forum: Mikrocontroller und Digitale Elektronik Banking probleme mit PIC 16f690


von theotigane (Gast)


Lesenswert?

ich hab folgendes problem:
der Speicherplatz der PIC 18F690 ist sehr klein.
wenn ich aber ein paar größere arrays definiere, bekomm ich sofort
eine fehlermeldung, dass mit irgendwelchen 'section' was nicht
stimmt. jetzt hab ich im datenblatt etwas übers 'banking' gefunden,
kann aber damit absolut nichts anfangen.
hat jemand von euch vielleicht auch schon mal dieses problem gehabt?
wie kann ich den speicher als ganzes benutzen und nicht in Banken
unterteilt?

Data space:
    BANK0                used    5Ch (    92) of    60h bytes   ( 95.8%)
    BANK1                used     0h (     0) of    50h bytes   (  0.0%)
    COMBANK              used     1h (     1) of    10h bytes   (  6.3%)

Der BANK1 ist ja  noch frei, wie kann ich daten in BANK1 schreiben.
ich  benutze der HI TECH C Compiler
ich bitte um eure hilfe!
Danke

von Severino R. (severino)


Lesenswert?

Sourcecode (bitte auf's Minimum reduzieren)?
besser noch Projekt posten (gezippt).
Genaue Compiler-Version?

von theotigane (Gast)


Lesenswert?

wenn ich zb diese array declariert txbuffer[64]; bekomme ich diese 
fehlermeldung.
Error   [593] ; . can't find 0x1 words (0x1 withtotal) for psect 
"intsave" in segment "BANK0", ich vermute es gibt keinen platz mehr in 
Bank0 da wenn ich der array auf txbuffer[20] reduziert bekomme ich keine 
fehlermeldung mehr aber der BANK0 ist fast voll
BANK0                used    5Ch (    92) of    60h bytes   ( 95.8%)


und der Bank1 ist noch complete frei
BANK1                used     0h (     0) of    50h bytes   (  0.0%)

gibt es eine möglichkeit daten in Bank1 zu plazieren in c?
ich benutze HI-TECH Software Version 9.60

von Severino R. (severino)


Lesenswert?

Sourcecode (bitte auf's Minimum reduzieren)?
besser noch Projekt posten (gezippt).
Genaue Compiler-Version?

von theotigane (Gast)


Lesenswert?

Compiler version: HI-TECH C Compiler Version 9.60


code

#ifndef MAIN_C
#define MAIN_C

#include "headerfiles.h"

//---------------------------------------------------------------------- 
---
// Defines
#define _CONFIG *(UINT16 *) 0x2007 // Force Config to 0x2007
#define mode RX

//---------------------------------------------------------------------- 
---


//---------------------------------------------------------------------- 
---
//  Global Variables
BYTE  txBuffer[100];
BYTE  rxBuffer[64];
//---------------------------------------------------------------------- 
---


//---------------------------------------------------------------------- 
---
//  void main(void)
//
//  DESCRIPTION:
//
//---------------------------------------------------------------------- 
---
void main (void) {

 UINT8 length = 0;
 UINT8 x = 0x11;
 UINT8 i;



#ifdef FREQ_433_CC1101
// PATABLE (0 dBm output power)
patable[0] = 0xC0;
patableLen = 1;
#endif

Setup(FRQ_CLK1);// Init clock 8MHz
setup_wdt( );//Init WDT 4seconde


   // Set up the crossbar and I/O ports to communicate with cc1101
   IO_INIT();
   Reset_CC1100();

   writeRFSettings();
   halSpiWriteReg(CCxxx0_PATABLE,  patable[0]);//R output power

    // Infinite loop
    while (TRUE)
   {
        switch (mode)
       {

            case TX:

                /* Infinite loop* /
                while (TRUE)
                {

                    halRfSendPacket(txBuffer, sizeof(txBuffer));


                }
                break;

            case RX:
                        /* Infinite loop* /
                  while (TRUE)
                  {

                      length = sizeof(rxBuffer);
                      if (halRfReceivePacket(rxBuffer, &length))
                             {

                             }
                          }
  }

#endif// main.c

von Severino R. (severino)


Lesenswert?

Danke für den Code.

Kannst Du Dir vorstellen, dass ich diesen Code nicht compilieren kann, 
weil:

> #include "headerfiles.h"

???

Funktionen aufgerufen werden, die nichts mit dem Problem zu tun haben 
und die spätestens beim Linken fehlen werden.


Verwendest Du PICC, PICC-Lite, PICC-Pro, im Full- oder Lite-Mode?

Z.B. Build-Output:
1
HI-TECH PICC-Lite COMPILER (Microchip PICmicro)  V9.60PL1
2
Copyright (C) 1984-2007 HI-TECH SOFTWARE
3
Memory Summary:
4
...

von theotigane (Gast)


Lesenswert?

Build-Output:
Using driver C:\Programme\HI-TECH Software\PICC\lite\9.60\bin\picl.exe

laut daten blatt hat der 16f685 nur 255byte ram, ist diese in Bank0 und 
Bank1 geteilt?

von Severino R. (severino)


Lesenswert?

theotigane wrote:
> Build-Output:
> Using driver C:\Programme\HI-TECH Software\PICC\lite\9.60\bin\picl.exe

Jaaaah, und weiter unten, wo neben der Version auch der Patch-Level 
steht?
1
HI-TECH PICC-Lite COMPILER (Microchip PICmicro)  V9.60PL1
2
                                                 ^^^^^^^^

Immerhin ist ersichtlich, dass Du die Lite-Version verwendest.
Die ist meines Wissens für den PIC16F690 auf Bank 0 und 1 limitiert 
(=176 Bytes).

> laut daten blatt hat der 16f685 nur 255byte ram, ist diese in Bank0 und
> Bank1 geteilt?

256 Bytes!

Schau mal im Datenblatt auf page 29 nach... dort ist die Aufteilung 
dargestellt.

Aber Achtung: dieser PIC hat kein SSP Modul. Falls Du SPI verwendest, 
...

Und: Unterstützt Dein Compiler diesen PIC?

von theotigane (Gast)


Lesenswert?

Der spi communikation wird manuel gemacht,
laut output build ist der BANK1 noch complet frei Wie kann ich meine
array[60] auf BANK1 plazieren.

Data space:
    BANK0                used    5Eh (    94) of    60h bytes   ( 97.9%)
    BANK1                used     0h (     0) of    50h bytes   ( 
0.0%)<-
    COMBANK              used     1h (     1) of    10h bytes   (  6.3%)



Summary:
    Program space        used   71Fh (  1823) of   800h words   ( 89.0%)
    Data space           used    5Fh (    95) of    B0h bytes   ( 
54.0%)<-
    EEPROM space         used     0h (     0) of   100h bytes   (  0.0%)
    Configuration bits   used     0h (     0) of     1h word    (  0.0%)
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)

Laut output build habe ich noch 46% frei platz
Danke

von theotigane (Gast)


Lesenswert?

Der spi communikation wird manuel gemacht,
laut output build ist der BANK1 noch complet frei Wie kann ich meine
array[60] auf BANK1 plazieren.

Data space:
    BANK0         used    5Eh (    94) of    60h bytes   ( 97.9%)
    BANK1         used     0h (     0) of    50h bytes   (0.0%)<--
    COMBANK       used     1h (     1) of    10h bytes   (  6.3%)



Summary:
    Program space   used   71Fh (  1823) of   800h words   ( 89.0%)
    Data space      used    5Fh (    95) of    B0h bytes   (54.0%)<--
    EEPROM space    used     0h (     0) of   100h bytes   (  0.0%)
    Configuration bits   used     0h (     0) of     1h word    (  0.0%)
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)

Laut output build habe ich noch 46% frei platz
Danke

von theotigane (Gast)


Lesenswert?

Wie kann ich mit HI-TECH PICC-Lite compiler daten in der Bank1 der 
pic16f690 plazieren, laut build output benutze ich ja nur 54% Ram und 
der BANK0 ist fast voll.

Data space:
    BANK0         used    5Eh (    94) of    60h bytes   ( 97.9%)
    BANK1         used     0h (     0) of    50h bytes   (0.0%)<--
    COMBANK       used     1h (     1) of    10h bytes   (  6.3%)



Summary:
    Program space   used   71Fh (  1823) of   800h words   ( 89.0%)
    Data space      used    5Fh (    95) of    B0h bytes   (54.0%)<--
    EEPROM space    used     0h (     0) of   100h bytes   (  0.0%)
    Configuration bits   used     0h (     0) of     1h word    (  0.0%)
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)

von Chris (Gast)


Lesenswert?

Vor den Variablen das prefix BANK1 setzen, sollte passen.

von theotigane (Gast)


Lesenswert?

so meinen sie: zb  BANK1 array[20];

von theotigane (Gast)


Lesenswert?

UINT8 length = 0;
    UINT8 BANK1 array[20];

geht nicht, ich bekomme eine fehlkermeldung,

Error   [372] D:\WorkSpace-Mplab\FUNK\V2\main.c; 35.13 "," expected

von Chris (Gast)


Lesenswert?

bank1 UINT8 array[20]; // es ist ein Prefix, heißt VOR der Declaration

von theotigane (Gast)


Lesenswert?

Warnnung nach der deklaration
bank1 UINT8 array[20];
Warning [348] D:\WorkSpace-Mplab\FUNK\V2\main.c; 35.22 auto variable 
"array" should not be qualified

und fehler nach der erste initialisierung.
bank1 UINT8 array[20];
array[0]= 1;
Error   [491] ; . can't find 0x8 words for psect "rdata_0" in segment 
"BANK0"
Error   [593] ; . can't find 0x3 words (0x3 withtotal) for psect 
"intsave" in segment "BANK0"
Error   [593] ; . can't find 0x1 words (0x1 withtotal) for psect 
"intsave" in segment "BANK0"
Error   [593] ; . can't find 0x1 words (0x1 withtotal) for psect 
"intsave" in segment "BANK0"
Error   [593] ; . can't find 0x1 words (0x1 withtotal) for psect 
"intsave" in segment "BANK0"
Error   [477] ; . fixup overflow in expression (location 0x956 
(0x94A+12), size 1, value 0xD0)
Error   [477] ; . fixup overflow in expression (location 0x958 
(0x94A+14), size 1, value 0xD0)
Error   [477] ; . fixup overflow in expression (location 0x80 (0x80+0), 
size 1, value 0xD0)
Error   [477] ; . fixup overflow in expression (location 0x80 (0x80+0), 
size 1, value 0xD0)

von schris (Gast)


Lesenswert?

pselect sind 16 bytes, welche Bankübergreifend ohne Banking vorhanden 
sind,
und deshalb für Paramterübergabe sowie für kopieren zwischen Banks
genutzt werden. Im Klartext, du musst dir ein besseres Banking 
überlegen.

von Timo P (Gast)


Lesenswert?

Bitte um Hilfe!

Habe auch die Fehlermeldung:
Error   [593] ; . es fehlen 0x1 Wörter (0x1 insgesamt) für psect 
"intsave" im Segment "BANK0"

kurios ist, dass die Fehlermeldung nicht aus dem Grund erscheint, dass 
ich eine Variable anlege, sondern ausschließlich im code ergänze:

  if((num_of_sent_proto%140) == 0 && periodically == TRUE)
  low_batt();

Was sagt mir die Fehlermeldung??

von Timo P (Gast)


Lesenswert?

Die Fehlermeldung habe ich nun so verstanden:

obwohl man keine zusätzlich variable in der BANK0 anlegt, bezieht sich 
die Fehlermeldung dennoch auf diese. Der Grund ist wohl, dass die Bytes, 
die für Parameterübergaben reserviert sind, NICHT global sind, sondern 
für jede Speicherbank SEPARAT existieren. Wenn nun viele Funktionen 
bestehen, die genutzt werden, kann man weniger Variablen anlegen, als 
wenn man für die Parameterübergabe weniger Speicher nutzt.

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.