OK, då ska vi se.
Först en liten detalj:
> Koden som främst är Sodjans HD44780 exempel som är omskriven till 16f690.
Notera också HD44780 filerna som ligger här :
http://jescab2.dyndns.org/pub_docs/.
Det är i och för sig ganska små ändringar mellan 886 och 690, men i alla fall...
Men till det fenomen som du har åkt på. Det är egentligen ganska enkelt.
När man förstår vad som händer.
Du behöver sannolikt en kopia av databladet (41262E.PDF) öppnat för att hänga med.
Och gärna en kopia av MPASM manualen (33014K.PDF) också...
Först tar vi minnesmappen i en PIC16F690.
Se sidan 31 med "FIGURE 2-8: PIC16F690 SPECIAL FUNCTION REGISTERS".
Notera hur GPR'erna (General Purpose Registers) ser ut. Notera speciellt de sista
16 registren mellan 70h - 7Fh ! Som du ser så är det samma 16 register som
ligger mappade över alla 4 minnesbankerna. Detta områda kallas "shared memory"
eller ibland "unbanked memory). Nu ser du kanske också var "_SHR" kommer från i
UDATA_SHR. Alltså "User data in shared memory" ! OK ?
Fördelen med detta område är att man inte behöver bry sig om vilken bank som
för tillfället är vald (via t.ex BANKSEL), de är alltid tillgängliga. Alltså till skillnad
från de 80 bytes som ligger direkt innan i bank 0, 1 och 2.
Frågor så långt ?
Men, detta minnesområde är alltså bara *16* bytes och ska primärt användas till de
variabler som man vill ha snabb access till (man slipper BANKSEL). Eller om applikationen
inte har fler än 16 variabler, så kan man ju låta allt ligga där. Samt ett par variabler
som *måste* ligga i "shared memory", men det tar vi inte här...
Men man kan alltså aldrig allokera mer är *16* bytes med UDATA_SHR !
För minne utöver detta måste man använda UDATA. Detta allokerar
minne från "banked memory", alltså från de 3 x 80 bytes som ligger ovanför
70h i bank 0, 1 eller 2. Man har inte (och vill/behöver inte) ha någon kontroll
över vilken bank varje variabel hamnar i. Dock så allokeras alltid en hel "section"
(d.v.s allt som ligger under samma användning av UDATA, i samma bank, så en
viss styrningar har man i alla fall.
Så ditt exempel skulle kunna se ut så här t.ex :
Kod: Markera allt
UNBANKED_VAR UDATA_SHR
; Här allokerar vi dels de variabler som *måste* ligga i shared memory,
; d.v.s de tre *_temp variablerna (varför det är så går vi inte in på här,
; men det har med hanteringen vid avbrott/interrupt att göra) men även
; andra variabler som vi vill ha snabbst möjliga access till (d.v.s utan BANKSEL).
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving
pclath_temp RES 1 ; variable used for context saving
tmr0_count res 1 ;Tilläggs räknare till TMR0 för att öka tiden
TIME_VARS UDATA
; En section med data till tid/klock hanteringen.
; Eftersom hela TIME_VARS kommer att allokeras från samma bank, så
; behöver man inte BANKSEL så länge som man bara hanterar dessa.
sec res 1 ;Råvärdet för sec, min hour, 2 siffror
min res 1
hour res 1
sec_one res 1 ;Entalet i sekunderna, minuterna och timmarna
sec_ten res 1 ;Tiotalet i sekunderna, minuterna och timmarna
min_one res 1
min_ten res 1
hour_one res 1
hour_ten res 1
DIVERSE_VARS UDATA
; Dessa variabler kommer kanske att allokeras från samma bank som
; TIME_VARS eller kanske från en annan bank. Det bestämmer MPLINK.
t1 res 1
w2 res 1
getones res 1
VARL res 1
VAR res 1
Ovanstående är ett exempel. Nu är det ju inte fler varabler (d.v.s mindre än 80 st)
så du behöver så klart bara en UDATA. Och om det är så att man bedömmer att
klock-variablerna behövs ofta (och snabbt) så kan de ju också läggas i UDATA_SHR.
Se även kodexempel under "4.62 udata..." i MPASM manualen. Notera hur CLRF används
mot båda varablerna i samma UDATA section utan extra BANKSEL, eftersom de ändå alltid
kommer att ligga i samma bank.
> Jag är säker på att detta är en sådan sak som man kan hitta i Databladet men jag hittade inget där förutom detta:
När det gäller detaljer i MPASM så är det "MPASM/MPLINK User's Guide" du ska använda.
Om du t.ex tittar i kapitlet för "udata_shr", så står det bl.a :
This directive is used to declare variables that are allocated in RAM that is shared
across all RAM banks (i.e. unbanked RAM).
Ser du kopplingen från det till de sista 16 bytesen i minnes mappen ?
Summering:
-----------
1. Du kan aldrig allokera mer än 16 bytes med UDATA_SHR.
2. Använd UDATA för övriga variabler (och använd BANKSEL där det behövs).