Sari la conținut
ELFORUM - Forumul electronistilor

Cum pot schimba bankul de registri in C?


ramsesrr

Postări Recomandate

  • Răspunsuri 10
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • ramsesrr

    4

  • kit

    3

  • Liviu M

    2

Zile populare

Top autori în acest subiect

De ce vrei sa-l schimbi? Nu e nimic rau ca bank 0 e folosit aproape tot.

Pai am un vector care trebuie sa contina 100 caractere,daca pun mai mult de 65 imi da eroare si imi spune ca nu am depasit dimensiunea bankului 0
Link spre comentariu

poate te descurca asta:

editezi fisierul *.lkr corespunzator:

din:

DATABANK   NAME=gpr0       START=0x60           END=0xFFDATABANK   NAME=gpr1       START=0x100          END=0x1FFDATABANK   NAME=gpr2       START=0x200          END=0x2FFDATABANK   NAME=gpr3       START=0x300          END=0x3FFDATABANK   NAME=usb4       START=0x400          END=0x4FF          PROTECTEDDATABANK   NAME=usb5       START=0x500          END=0x5FF          PROTECTEDDATABANK   NAME=usb6       START=0x600          END=0x6FF          PROTECTEDDATABANK   NAME=usb7       START=0x700          END=0x7FF          PROTECTEDACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF   ...
unesti doua (sau mai multe) bankuri de memorie:

DATABANK   NAME=gpr0       START=0x60           END=0xFFDATABANK   NAME=gpr1       START=0x100          END=0x1FF//DATABANK   NAME=gpr2       START=0x200          END=0x2FFDATABANK   NAME=gpr3       START=0x200          END=0x3FFDATABANK   NAME=usb4       START=0x400          END=0x4FF          PROTECTEDDATABANK   NAME=usb5       START=0x500          END=0x5FF          PROTECTEDDATABANK   NAME=usb6       START=0x600          END=0x6FF          PROTECTEDDATABANK   NAME=usb7       START=0x700          END=0x7FF          PROTECTEDACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF   ...
denumesti apoi sectiunea:

SECTION NAME=BigBank RAM=gpr3
in main.c definesti:

#pragma udata BigBankunsigned char Vector[100];#pragma
asa ceva fac eu pt 18F452 & co, in C18. poate merge si la Hi-Tech

LE: acum am vazut si atasamentul: se observa cu ochiul liber ca Bank0 are doar 0x60 (96 zecimal) de locatii alocate. unesti Bank1 cu 2, denumesti regiunea si vectorul il inghesui acolo... cred ca o sa mearga asa.

tie iti incap doar 65 de locatii ale vectorului probabil pentru ca mai ai si alte variabile care sunt alocate tot in Bank0. asa cred eu, cel putin.

bafta!

Link spre comentariu

pai tot ce vezi in poza aia inclusa de tine in post este descris intr-un fisier. In asm este cu extensia *.lkr, se afla inc:\Program Files\Microchip\MPASM Suite\LKRin C18 are extensia *.lkr si se afla intr-o gramada de locuri, printre altele lac:\MCC18\bin\LKR\in cazul tau, Hi-Tech, trebuie sa vezi care fisier este utilizat, unde se afla si cum il modifici. bag mana in foc ca pe forumul dezvoltatorului exista problema asta, basca si solutia. arunca un ochi si acolo, poate gasesti explicatii mai la obiect, eu stiu cum se rezolva problema doar la modul generic, nu si aplicat la platforma ta de lucru.daca ai descurcat-o, pune si aici solutia, sa fie si pentru altii.bafta!

Link spre comentariu

In cazul picc nu se folosesc fisierele .lkr; picc vine cu propriile biblioteci.

Din cate stiam eu (la picc-lite, versiuni mai vechi), ca sa declari o variabila in alt bank, se foloseste bankx la declarare.

Vezi ca picc vine si cu manual ;) - F11 din mplab sau in directorul docs din calea in care ai instalat picc.

 

Citat din manualul versiunii 9.60pl2 a picc-lite - pag 49:

3.4.9.2 Bank1, Bank2 and Bank3 Type QualifiersThe bank1, bank2 and bank3 type qualifiers are used to place static variables in RAM bank 1,RAM bank2 and RAM bank 3 respectively. Note that there is no bank0 qualifier. Objects default tobeing in bank0 if no other bank qualifier is used. All auto objects are positioned into bank0, alongwith function parameters. Examples of bank qualifier usage:An unsigned char in bank3:static bank3 unsigned char fred;A pointer to an unsigned char in bank2:bank2 unsigned char * ptr;A pointer to an unsigned char in bank3 with the pointer itself residing in bank2:bank3 unsigned char * bank2 ptr2;
Link spre comentariu

pentru versiunea 9.70, in manual, la pag. 58 ai:

3.3.1 Object Size

despre alocarea unui vector mai mare decat dimensiunea bankului de memorie gasesti ceva la

http://www.htsoft.com/support/faqs.php#faq83 (si nu-i deloc incurajator)

ca tine a mai patit si:

http://www.microchip.com/forums/tm.aspx ... arge+array

din ce am gasit eu despre picc, chestiile din C18 pe care le stiu eu se pare ca se regasesc in picc.ini.

cam asa este descris picul tau in respectivul fisier:

[16F877A]MAKE=MICROCHIPARCH=PIC14PROCID=877AROMSIZE=2000BANKS=4RAMBANK=20-7F,A0-EF,110-16F,190-1EFCOMMON=70-7FICD1RAM=70-70,1EB-1EFICD1ROM=1F00-1FFFICD2RAM=70-70,1E5-1F0ICD2ROM=1F00-1FFFDATABANK=2FLASHTYPE=READWRITE_AFLASH_READ=1FLASH_WRITE=4EEPROMSIZE=100
in RAMBANK este definita valoarea maxim admisibila a unui vector. trebuie sa tii cont insa si de ICD, daca il folosesti.

nu cred ca merge metoda propusa de mine mai sus (de fapt sunt sigur). memoria ram la 18fxxxx este organizata complet diferit fata de 16877a al tau (dupa cum se vede la pag 19 din manualul 16f877a). ram-ul tau nu este contiguu (spre deosebire de 18fxxxx), de aia nu poate gestiona vectori mai mari, care sa se labarteze pe mai multe bankuri.

ca urmare iti datorez scuzele de rigoare, in postul anterior visam cu ochii larg inchisi.

poate incerci sa rupi vectorul in 2?

in cazul in care sunt valori fixe, poti lua in considerare sa le faci "hard-coded" adica sa le pui in ROM sau chiar EEPROM...

bafta!

Link spre comentariu

Mama ce complicaciune! :nebunrau: Data vitoare in loc de PIC incearca un microcontroller din familia AVR, alea au memoria continua, fara bancuri.Asta este doar unul dintre motivele pentru care evit sa mai folosesc PIC-uri.Sunt offtopic rau, cer scuze si nu ma mai bag!

Link spre comentariu

Mama ce complicaciune! :nebunrau: Data vitoare in loc de PIC incearca un microcontroller din familia AVR, alea au memoria continua, fara bancuri.Asta este doar unul dintre motivele pentru care evit sa mai folosesc PIC-uri.Sunt offtopic rau, cer scuze si nu ma mai bag!

Am facut deja proiectul pe AVR(atmega32) si am vrut sa il fac si pe PIC,pt a avea costuri mai mici deoarece in ultimul timp AVR-urile s-au scumpit foarte mult,dar cred ca voi renunta.
Link spre comentariu

Pai daca tot e productie nu hobby, poti incerca cu ceva din seria 18 F (18F452, de exemplu).Sunt multe tipuri pin-compatibile cu 16F877, cu mai multa memorie, cu periferice mai destepte si nu mult mai scumpe.Compilatoare gasesti si pentru ele; htsoft are si pentru seria 18F compilator in oferta.Si ca un argument "suprem" - din cate stiu eu, 16F877 sunt cam pe terminate. uChip nu le mai recomada pentru proiecte noi.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări