ik heb een programatje met 2 lookup tables. de eene staat binnen de eerste 255 lijnen code en de 2de staat ergens tussen de 256 lijn en de 512ste lijn. als ik een CALL uitvoer naar de eerste tabel, werkt het maar een CALL naar de 2de tabel werkt niet.
ik weet niet precies of ik hier page bits moet voor gebruiken. ik vind niet veel info hier over in de data sheets.
als iemand mij hierbij kan helpen, alvast bedankt
R
Maledicantur thylie iuxta viam posite
k.p.meinesz
Een schizofreen is nooit alleen!
Op 8 juni 2004 16:24:56 schreef k.p.meinesz:
idd indirect adressing moet je gebruiken ander werk het niet
Volgens mij is dat hier niet van toepassing. Een page bevindt zich in het program memory, niet in het RAM-geheugen; daar spreek je van bank.
Ik denk dat je wat moet knoeien met je program-counter. (afhankelijk van HOE je die lookuptable aanmaakt)
EDIT//
Zie net dat de F84 maar 1 page heeft, dus volgens mij zal het toch gewoon moeten kunnen
//EDIT
[Bericht gewijzigd door DIY op ]
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op 8 juni 2004 16:11:27 schreef R:
Hihi, Pic kopen met groter geheugen...
Groetjes
en Succes met exames morgen
Heeft daar niks mee te maken. Zijn geheugen is groot zat.
Op 8 juni 2004 17:40:53 schreef DIY:
[...]
Volgens mij is dat hier niet van toepassing. Een page bevindt zich in het program memory, niet in het RAM-geheugen; daar spreek je van bank.Ik denk dat je wat moet knoeien met je program-counter. (afhankelijk van HOE je die lookuptable aanmaakt)
EDIT//
Zie net dat de F84 maar 1 page heeft, dus volgens mij zal het toch gewoon moeten kunnen
//EDIT
Het heeft niks te maken met een page of een bank. Zoals je zelf zegt heeft de topicstarter het over zijn ROM (programmageheugen). De banken zijn van toepassing op het RAM, de variabelen en dat geldt hier dus niet.
Op 20 mei 2004 13:05:22 schreef Walby:
ik heb een programatje met 2 lookup tables. de eene staat binnen de eerste 255 lijnen code en de 2de staat ergens tussen de 256 lijn en de 512ste lijn. als ik een CALL uitvoer naar de eerste tabel, werkt het maar een CALL naar de 2de tabel werkt niet.ik weet niet precies of ik hier page bits moet voor gebruiken. ik vind niet veel info hier over in de data sheets.
als iemand mij hierbij kan helpen, alvast bedankt
Het is aan de ene kant heel lastig en de andere kant heel moeilijk. Je hebt namelijk te maken met een beperking qua adressering.
Zoals je waarschijnlijk weet worden jou instructies omgezet naar een code met hex getallen. Als jij doet
CALL einde
Dan zet de assembler dit om naar bijvoorbeeld
A4 E2 60
En die A4 zou dan betekenen CALL, en de E2 60 de sprong die de program counter moet maken om van de huidige regel naar de regel te springen met label "einde".
Nu heeft die ruimte die beschikbaar is voor die sprong een beperking qua grootte. En jij wilt dus een "te grote" sprong maken.
Het geheugen bestaat wel, en je kan er ook bij alleen niet direct met een enkele sprong, want dat zou een te grote sprong zijn.
Nu kun je dat oplossen op een mooie manier en een wat minder mooie manier. De minder mooie manier: Je kan hem namelijk eerst naar een label laten springen wat dichtbij zit. En vanaf dat label laat je hem dan weer naar je uiteindelijke "einde" label springen.
Omdat ik alweer een tijdje niet meer met PIC's heb gewerkt weet ik even niet zo snel hoe exact de nette manier was, dus die kan ik je zo niet vertellen.
Je kan dit "probleem" trouwens wel in de datasheet vinden, alleen niet waar je het verwacht. Want kijk maar eens naar de informatie die staat bij de instructie "CALL". Daar kan je zien hoe die (hex)code, waar ik het eerder over had, tot stand komt. En daar kan je dus zien dat je een probleem hebt met de beschikbare adresseringsgrootte.
Snap je het een beetje? (of een beetje veel
)
Ik denk dat je de subroutine listig moet gebruiken.
De subroutine waar je lookuptable instaat (voor het gemak heet die ook LOOKUPTABLE) ziet er als volgt uit:
LOOKUPTABLE
addwf PC,1
retlw 0xXX (XX is een getal)
retlw 0xXX
retlw oxXX
etc
etc
In je code schrijf je nu hetvolgende:
movlw 0x06 (als je de 6e waarde uit de tafel wilt hebben)
call LOOKUPTABLE
Op 8 juni 2004 17:58:06 schreef Bastiaan:
Het heeft niks te maken met een page of een bank. Zoals je zelf zegt heeft de topicstarter het over zijn ROM (programmageheugen). De banken zijn van toepassing op het RAM, de variabelen en dat geldt hier dus niet.
De pages slaan op ROM, dus dat is wel van toepassing.
Khoop dat je hier wat aan hebt. Volgens mij is het net zoals bastiaan zegt dat de sprong te groot is. En moet het uiteindelijk zoals DIY zegt met RETLW.
Dus vandaar: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&no…
Ps: Niet gaan slaan als ik het niet goed heb
. Ik heb hier nog geen kaas van gegeten.
allemaal al heel fel bedankt voor de help.
deze vraag staat er al een tijdje op, en ik zit nu in het midden van mijn examens, dus ik zal niet veel tijd hebben om er aan verder te werken.
de 18 de heb ik gedaan met examens dan kan ik er terug invliegen met een portie nieuwe moed
als ik het spel aan het draaien krijg zal ik zeker mijn oplossing laten weeten voor de geintereseerde.