Formatteren van een tabel met EDATA

Soms is het nodig om een data tabel te creëren met een bekende formattering voor de waarden.
Zo kan het bijvoorbeeld zijn dat alle waarden 4 bytes EEPROM ruimte nodig hebben, ook al is voor de default waarde in EDATA maar een 1 of 2 bytes waarde opgegeven.

EDATA 100000, 10000, 1000, 100, 10, 1

Zoals de programmaregel hierboven is geschreven zullen de gegevens in een oneven volgorde in de EEPROM worden geplaatst, omdat de verschillende waarden elk zo zijn eigen grootte heeft.
De waarde 100.000 is een DWORD en zal dus als een 4 bytes waarde worden ingedeeld (neemt dus 4 opeenvolgende EEPROM adressen in).
De waarden 10.000 en 1000 zijn WORD waarden en krijgen daarom elk 2 adressen toegewezen en de waarden 100, 10 en 1 zijn BYTE waarden en krijgen daarom alle drie maar 1 EEPROM adres toegewezen.

Het teruglezen van deze waarden met EREAD kan problemen opleveren omdat niet uit te zoeken is waar een waarde begint en eindigt.
De oplossing is het gebruik van formatters zodat een waarde, opgegeven in EDATA, altijd een vast aantal adressen inneemt.

De formatters zijn: BYTE
WORD
DWORD
FLOAT

Om een vast aantal bytes (oftewel adressen) te forceren plaats je één van deze formatters vóór de waarde.
Door bijvoorbeeld vóór alle waarden de formatter DWORD te plaatsen, krijgen de waarden die erachter staan sowieso 4 bytes toegedeeld, ongeacht de grootte van die waarde:

EDATA DWORD 100000, DWORD 10000, DWORD 1000,_
      DWORD 100,    DWORD 10,    DWORD 1

Moeten alle waarden dezelfde aantal bytes krijgen toebedeeld, zoals hierboven allen DWORD zijn, dan kan het nog eenvoudiger:

EDATA AS DWORD 100000, 10000, 1000, 100, 10, 1

Ook nu krijgt elke opgegeven getal 4 bytes EEPROM ruimte toegewezen.
(Let op de tussenvoeging van het keyword AS).


Stel dat je in een programma een WORD waarde wilt opslaan in het EEPROM, maar bij het programmeren van de PIC moet een default waarde van bijvoorbeeld 100 worden opgeslagen.
EDATA 100 maakt dan maar één adres vrij, omdat 100 maar 1 byte nodig heeft, terwijl er later een WORD waarde in moet passen.
Door daar nu de formatter WORD vóór te zetten worden er toch 2 adressen vrij gemaakt, dus:
EDATA WORD
100

Bijvoorbeeld een oventhermostaat, die ingesteld kan worden van 0°C t/m 400°C.
De temperatuur moet in een WORD, want past niet in een BYTE, omdat de temperatuur hoger kan worden ingesteld dan 255°C.
Dus zijn er hiervoor twee EEPROM adressen nodig.
Als er voor deze WORD echter met EDATA voor de default een waarde kleiner dan 256 wordt opgegeven (bijvoorbeeld voor 15°C), dan zou de daaropvolgende waarde in de EDATA lijst op het adres komen van het MSB van de oventemperatuur, waardoor de default waarde van de oventhermostaat verminkt wordt.
Door de fabrieksinstelling van 15°C te schrijven inclusief formatter WORD, dus EDATA WORD 15 worden er tóch twee EEPROM adressen gereserveerd voor de oventemperatuur.

BYTE  zal een waarde in het EEPROM forceren van maar 1 byte, ongeacht de grootte van die waarde.
Van elke waarde boven 255 zal alleen het LSB worden opgeslagen.
WORD  zal een waarde in het EEPROM forceren van maar 2 bytes, ongeacht de grootte van die waarde.
Van elke waarde boven 65535 zullen alleen de twee LSB's worden opgeslagen.
Een waarde onder 255 zal worden opgevuld tot 2 bytes.
DWORD  zal een waarde in het EEPROM forceren van 4 bytes, ongeacht de grootte van die waarde.
Een waarde van 65535 of lager zal worden opgevuld tot 4 bytes.
FLOAT  zal een waarde met drijvende komma in het EEPROM forceren, dat altijd 4 bytes geheugenruimte in de EEPROM inneemt.
 

Je mag de getallen achter EDATA ook van een naam voorzien met behulp van SYMBOL:

;Algemene constanten
SYMBOL AndereNaam  = %10100101
SYMBOL KlaasJan    = 512
SYMBOL Letter      = "M"
SYMBOL Temperatuur = 22

;Plaats constanten in EEPROM geheugen van de PIC
EDATA  Temperatuur, $FF, KlaasJan, AndereNaam, "ABC", Letter 

De waarden van bovenstaand voorbeeld komen als volgt in de EEPROM:

0
00010110
22
1
11111111
$FF
2
00000000
LSB van 512
3
00000010
MSB van 512
4
10100101
%10100101
 5
01000001
letter "A"
6
01000010
letter "B"
 7
01000011
letter "C"
 8
01001101
letter "M"

Ook deze manier neemt geen programmageheugen van de PIC in (alleen EEPROM geheugen).


Maar je kunt ook gewoon getallen in blijven voeren en dan door middel van REM regels erachter duidelijk maken waar de getalswaarden voor staan:

EDATA   14,_   ;Nachttemperatuur in graden Celsius
        20,_   ;Dagtemperatuur   in graden Celsius
1, 2, 3, 4,_   ;4 cijferig pincode van de gebruiker (default = 1234)
 WORD   31,_   ;Waarde is kleiner dan 256, door "WORD" toch 2 EEPROM adressen gereserveerd
 WORD 1250,_   ;
      1750,_   ;Geen "WORD" formatter, maar waarde is groter dan 255, dus toch 2 adressen
DWORD   15,_   ;Waarde is kleiner dan 256, door "DWORD" toch 4 EEPROM adressen gereserveerd 
         0,_   ;
 BYTE  260     ;Waarde groter dan 255, door "BYTE" toch maar 1 EPROM adres (alleen LSB)

Door een underscore ( _ ) (een onderliggend streepje) direct na de komma te plaatsen, kun je verder op de volgende regel, maar ziet de compiler dit als 1 data regel (ook bij de LITE versie).
Meer info underscore

De waarden van bovenstaand voorbeeld worden als volgt in de interne EEPROM geschreven tijdens PIC programmeren:

Adres Decimaal Binair
0 14  00001110
1 20  00010100
2 00000001
3 00000010
4 00000011
5 00000100
6 31  00001111 31 +
(0 × 256)
7 00000000
8 1250  11100010 226 +
(4 × 256)
9 00000100
10 1750  11010110 214 +
(6 × 256)
11 00000110
12 15  00001111 15 +
(0 × 256) +
(0 × 65536) +
(0 × 16777216)
13 00000000
14 00000000
15 00000000
16 00000000
17 260  00000100 Alleen LSB

Achttien adressen (0 ... 17) in totaal dus.
En zo kun je bij de 16F628A op 128 adressen (0 + 1 t/m 127) een byte bewaren.


De overeenkomst tussen EDATA en EWRITE is dat ze allebei waarden naar de interne EEPROM toe schrijven.
EDATA doet dat echter maar één keer, en dat is alleen tijdens het programmeren van de PIC zelf.
De waarden achter EDATA worden dan ook door de PIC programmer in de EEPROM geschreven en niet door de PIC.
EWRITE schrijft naar het EEPROM als de PIC zijn programma uitvoert.
De waarden van EWRITE worden door de PIC zelf in zijn EEPROM geschreven.

Je kunt niet aan het begin van een programma EWRITE gebruiken om de EEPROM op een default waarde in te stellen, want steeds als je dan de PIC opnieuw start, zal opnieuw de default waarde worden ingesteld.
EDATA doet dat niet.
Alleen de eerste keer, tijdens het PIC programmeren, zal de default waarde worden ingesteld.
Als het programma in de PIC later deze waarde wijzigt, blijft het deze nieuwe waarde behouden en zal niet meer door EDATA worden overschreven, ook niet als je de PIC opnieuw opstart of reset.

(Later misschien meer over EDATA).