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
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
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 | 1 | 00000001 | |
3 | 2 | 00000010 | |
4 | 3 | 00000011 | |
5 | 4 | 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 | 0 | 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).