Det finns väl olika anledningar till att använda en lookup-tabell istället
för att köra beräkningen direkt i koden. En kan vara att beräkningen i sig
är så pass komplex att den är svår att koda (vet inte om det är så här).
En annan att det går oerhört mycket snabbare att göra en tabell-slagning
på förberäknade värden än att beräkna dom vid run-time.
Jag har inte lusläst din kod, men den borde göra ungefär detta :
- Lägg startadresen till tabellen i eeadr/eeadrh, borde bli något i stil med:
Kod: Markera allt
banksel eeadr ; byt till rätt bank...
movlw METER_TABLE ; bit 8-15 av adressen till start av tabellen
movwf eeadrh
movlw METER_TABLE ; bit 0-7 av adressen till start av tabellen
movwf eeadr
Nu pekar alltså eeadr/eeadrh mot *första* entryt i din tabell!
Sedan lägg till ditt "index" till eeadr (och öka eeadrh med 1 om du fick en "carry").
Något i stil med (ej testat!):
Kod: Markera allt
addwf eeadr, f ; lägg till "index".
btfsc status, C ; fick vi en "carry" ?
incf eeadrh, f ; Ja, öka höga adressen med 1!
Så, nu ska eeadr/eeadrh peka på rätt värde i din tabell
och du kan köra en läsning "som vanligt" enligt din "get_meter_value".
Du kan inte *bara* lägga till W till eeadr, det finns ju ingen garanti att tabellen börjar
på en jämt 256 byte gräns i minnet ! Den kan börja var som helst. Därför *måste*
du kolla C-flaggan och öka på övre adress-halvan (eeadrh) om det behövs.