Hallo
Ik ben bezig met de PIC 16f628 programmeren.Nu wil ik een een wat langer programma gaan schijven.En nu vraag ik me af hoe dat nu werkt me de banken.Want van waar loopt nu eigenlijk het geheugen waar het programma instaat?
En op welk moment moet het STATUS,IRP geset worden?
keuninkske
!overload! to much information in this signature!
hoi,
heb ik deze week ook pas aangeleerd, werkt eigenlijk vrij simpel maar is erg vervelend.
bekijk in de datasheet wat allemaal in bank 0 en in bank1 staat van het register.
als je een bepaald register wil lezen of schrijven uit een bepaalde bank moet je de juiste bank geselecteerd hebben met de RP bit
wat frustrerend tijdens het programeren maar eigenlijk simpel en logisch
ik zoek nog even het hoofdstuknummer in de datasheet voor u en plaats hem hier in edit.
edit:
tabel 4-2 toont je hoe je kunt switchen tussen de 4 banken
figuur 4-2 toont je welke registers in welke banken staan.
bank3 en bank2 heb je nooit nodig omdat diezelfde registers ook in de eerste 2 banken staan!
tijdens het programeren is het makkelijk om voor het selecteren van iedere bank een subroutine te schrijven (bsf/bcf status,RP0)
dan hoef je in de code slechts call bank0 te schrijven als je iets wil schrijven of lezen
[Bericht gewijzigd door keuninkske op (34%)]
dit mischien een interesant artikel : http://www.circuitsonline.net/artikelen/view/8
Ik boel niet de banken van het SPECIAL FUNCTION REGISTERS.
Dat gaat idd met PR1,PR0.
Maar de banken waar de code in komt te staan.
movlw a'w'
Maar als ik dat goed begrijp is dit al naar 255 regels?
En hoe zit het met de geheugen die je aanmaakt (hier mee bedoel ik onderstaande code).Moet je hier ook voor switchen tussen de banken?
teller equ 0x20
PS De link had ik al gelezen maar zag het daar niet tussen staan.
keuninkske
!overload! to much information in this signature!
ik ontdekte door het gebruik van pic simulator ide zelf dat dit met dezelfde bankbits geselecteerd wordt.
Fuzzbass
Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com
Programmageheugen banken zijn elk 2000 2048 instructies. Bij de 628 heb je daar duz niets mee te maken, want die heeft maar 2000 2048 geheugenplaatsen in het programmageheugen.
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
t' Is zelfs nog iets 'vicieuzer':
Je programma mag zonder problemen van het ene 2K-blok in het andere lopen, alleen GOTO's, CALL's en RETURN's gaan hopeloos in de fout als ze van het ene blok naar het andere springen omdat de PCLATH counter (high byte van de Program Counter) niet ge-updated wordt.
Dus: In ASM programma's, groter dan 2K, altijd het 'PAGESEL' directive gebruiken bij GOTO's en CALL's!
Het PAGESEL directive checkt of het jump/returnadres al dan niet in dezelfde pagina ligt en past desnoods het PCLATH-register aan.
Voorbeelden:
PAGESEL (subroutine) ; Select Program Memory Page of routine
CALL subroutine
PAGESEL (subroutine) ; Select Program Memory Page of routine
GOTO subroutine
Zelfde probleem voor lookup tables (computed GOTO's) in program memory.
Hier bestaan kleine routines voor (met de HIGH en LOW directives) die testen of het jumpadres al dan niet in een andere bank ligt en de PCLATH aanpassen:
MOVLW LOW TABLE ; Get lower 8 bits of table address
ADDLW 1 ; Add 1 to offset (offset=PCL+1)
ADDWF BCDVAL,W ; Add offset
MOVWF OFFSET ; Store in OFFSET
MOVLW HIGH TABLE ; Get higher 5 bits of table address
BTFSC STATUS,C ; Page crossed?
ADDLW 1 ; Yes, then increment high address
MOVWF PCLATH ; Store high address in PCLATH
MOVF OFFSET,W ; Load computed offset
CALL TABLE ; Get value from TABLE
TABLE
MOVWF PCL
RETLW 0x00
RETLW 0x01
RETLW 0x02
RETLW 0x03
RETLW 0x04
...
RETURN
Vraag me niet hoe ik het weet...
(Dagen, weken heb ik zitten zoeken waarom een PIC programma plots hing of resette)
Update:
Voor banking in RAM bestaat er het BANKSEL directive i.p.v. het BCF/BSF RP0/RP1 bit.
Voorbeeld:
BANKSEL INTCON ; Select Memory Bank of register
Fuzzbass
Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com
Tja, de PIC16 is wat dat betreft echt de minst gebruiksvriendelijke chip die ik ken. En de documentatie van Microchip laat ook erg te wensen over. De 35-instructie RISC kern is VEEL te lang gebruikt door Microchip.
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
Tja, de PIC16 is wat dat betreft echt de minst gebruiksvriendelijke chip die ik ken.
Waarschijnlijk wel, bah, ge moet leren leven met de gebreken, en eens ge ze kent zijn het geen gebreken meer. 
Het worden ook dikwijls 'undocumented features' genoemd (MS Windows zit er vol van) 
En de documentatie van Microchip laat ook erg te wensen over.
De informatie staat er in, ge moet ze alleen vinden (cf. Application Notes!)
De 35-instructie RISC kern is VEEL te lang gebruikt door Microchip.
Heb hier ondertussen al een 20-tal 18F's liggen, nog niet gebruikt.
Zolang de 16F voldoet ga ik eerst mijn stock opgebruiken (nog ca. 100-tal). 
Op 20 december 2009 14:26:16 schreef Fuzzbass:
Tja, de PIC16 is wat dat betreft echt de minst gebruiksvriendelijke chip die ik ken. En de documentatie van Microchip laat ook erg te wensen over. De 35-instructie RISC kern is VEEL te lang gebruikt door Microchip.
*houdt z'n mond over AVR's* 
mm
Ik gebruik de 16f628 dus dat is maar/wel 2k.
Dus eigenlijk komt het er op neer dat ik me geen zorgen hoef te maken
over de banken.Of is dat niet zo?
Hoe zit het nu met het geheugens die je aan maakt vb
teller equ 0xa0
Nu moet er wel toch naar bank één geswitcht worden.
ps In hoger taal weet je niet goed hoe je met je tijd uitkomt.
Toch weer de wet van behoud van ellende.
[Bericht gewijzigd door weerstandje op (15%)]
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
Over de 2KB program memory boundary moet je je inderdaad niks van aan trekken met een 16F628.
Wel de SFR's (Special Function Registers en de GPR's (General Purpose Registers) = RAM geheugen.
Maar waarom zou je variabelen gaan declareren in Bank1? Is Bank 0 niet goed genoeg? 
teller equ 0xa0
GPR's in andere banken gebruik je enkel als je bvb. RAM tekort komt in Bank0.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
GPR in andere banken is totaal geen probleem. Gewoon altijd het BANKSEL directive gebruiken.
(i.p.v. handmatig rommelen met de RPx bits...)