High-Voltage
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
Hoi allemaal 
Ik ben al lang aan het zeggen dat ik met ASM ga beginnen om mn PIC's te proggen. Die PIC Basic die ik op dit moment gebruik is zo rot als iets. Hiermee bedoel ik gewoon dat ie erg inefficient is. Dus ik hoop het beter te doen in ASM.
Kheb al wat code bekeken en de instructies eens doorgebladerd, dat komt wel in orde.
Of toch niet helemaal??
Ik heb twee vragen:
1) De registers zijn ingedeeld in vier banken. In de tut die ik aan het lezen ben zeggen ze dat ik eerst een bank moet selecteren en er vervolgens naartoe moet schrijven (of lezen). Neem ik dan een stukje uit de help van Microchip dan zie ik dat ze gewoon rechtstreeks naar het register schrijven (zonder van bank te wisseen). Nu hierbij moet wel in gedachten gehouden worden dat de tut gaat over een 16F84 terwijl de help van Microchip het heeft over een 18F8722. Mogelijk dat tussen deze controllertjes een klein verschil zit.
Maar wat ik niet begrijp is waarom heeft elk register een uniek adres als je het toch in banken gaat stoppen?? Dan zijn die banken toch totaal overbodig. Of vergis ik mij radicaal??
Zelf wil ik beginnen in een 16F628A. Deze is cheap en heeft een ingebouwde osci. Dus als ik zo eentje opstook door programmeerfouten (lijkt me straf, maar kom) dan kan dat nog niet zo een kwaad. En een ingebouwde osci is altijd handig 
2) Microchip heeft templates ter beschikking gesteld zodat interrupts etc juist afgehandeld worden. Nu zit daar een stukje in om een context restore te doen na het verwerken van de interrupts.
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interruptBij het optreden van een interrupt worden zowel het w register als het status register afgevangen in een variabele. Op het einde wordt het status register teruggezet. Tot daar begrijp ik het nog. Maar dan gaan ze ineens met die w_temp lopen swappen en ik weet totaal niet waarom! Daarbij komt nog eens dat ze hem twee keer swappen zodat het netto resultaat eigenijk gewoon nul is. Kon men niet gewoon rechtstreeks movf w_temp,w doen??
Dit stukje is me dus niet helemaal bijster... Kan iemand het soms verklaren?
Hartelijk dank 
Hopelijk heb ik nog voor het donker is mijn eerste led aan het knipperen.
Grtz
H-V
Edit:
Ik heb al wat ervaring met PIC's, het is niet zo dat ik vandaag voor het eerst een PIC ter hand neem. Ik heb tot nu toe altijd in PIC Basic gewerkt en daar moest je je niet zo druk maken over de adressen, dat werd allemaal afgehandeld door de compiler.
[Bericht gewijzigd door High-Voltage op (10%)]
Als ik bij picbasic in een asm file kijk zie ik dat ze het status register wel gebruiken om van banken te verwisselen (bcf status, 5)
Je kan het voor de zekerheid altijd doen. Je kan ook een simpel programmatje schrijven en kijken of het zonder ook werkt.
High-Voltage
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
Als ik in de INC file kijk zie ik staan:
TRISA EQU H'0085'
TRISB EQU H'0086'
Het adres verwijst dus wel degelijk rechtstreeks naar de tweede bank (bank 1). Ik zou inderdaad eens kunnen proberen door rechtstreeks naar het adres te schrijven, kijken wat dat oplevert!
Gaat niet werken, maar je mag altijd proberen, dat is de beste manier om iets te onthouden 
Je moet echt eerst je bank selecteren via het status-register,
en dan pas kan je naar de adressen van die bank schrijven.
Vergeet zeker ook nadien niet terug naar bank0 te gaan, heb al vaak genoeg uren zitten zoeken naar dergelijke vreemde fouten.
MPLAB geeft zelfs speciaal waarschuwingen om je te helpen zoeken naar bank-fouten!
-Toine
[Bericht gewijzigd door Twabi2 op (30%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Kon men niet gewoon rechtstreeks movf w_temp,w doen??
Nee. Een MOVF heeft invloed op de Z(ero)-flag in het STATUS register. Als je dus eerst STATUS restored, en daarna met MOVF het W register, dan wordt de Z-flag geset/gereset al naar gelang de inhoud van W. Dat mag natuurlijk niet.
Daarom wordt SWAPF gebruikt. Deze instructie heeft geen invloed op de Z-flag.
High-Voltage
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
@Twabi2:
Ok, dan weet ik dat ook weer. Ik geloof je graag, maar ik begrijp niet helemaal waarom die zooi in banken is ingedeeld als er overal rechtstreekse adressen staan. Maarja, dat zal dan wel aan mij liggen.
Verder is dit de voorbeeldcode van Microchip:
clrf WREG
movwf PORTC ; clear PORTC
movwf TRISC ; configure PORTC as all outputsBlijkbaar is dat "bank-issue" in de 18F8722 'verholpen'. Dat maakt het m.i. stukken makkelijker dan altijd maar dat bank wisselen.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Blijkbaar is dat "bank-issue" in de 18F8722 'verholpen'
Nee, de 18F hebben nog steends banken. (Via het Bank Select Register. Werkt wel wat makkelijker.
High-Voltage
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
@Arco:
Bedankt! Dat zal inderdaad de reden zijn dat dat zo omslachtig opgelost wordt. Maar waar wordt die zero bit ergens voor gebruikt? Ik zie dat die bit hoog wordt als de uitkomst van een arithmetische berekening nul is en laag als de uitkomst niet nul is, maar ik kan me niet zo direct bedenken waar dat nodig is.
Overigens krijg ik bij het compilen een foutmelding:
Error - section '.udata_acs' can not fit the section. Section '.udata_acs' length=0x00000003
Waarschijnlijk omdat ik niet weet wat ik aan het doen ben... Ik heb drie variabelen aangemaakt en ik probeer die in het Access RAM te zetten als volgt:
UDATA_ACS
COUNT1 RES 1
COUNT2 RES 1
COUNT3 RES 1Ik veronderstel dat hij nu gewoon van voor af begint met adressen uit te delen?
Heeft er misschien iemand nog een goede tut? Want ik volg hier halvelings een tut en halvelings de help file van Microchip. In de tut die ik lees maken ze variabelen aan de hand van de EQU instructie.
Op 15 augustus 2008 14:58:15 schreef Arco:
[...]
Nee, de 18F hebben nog steends banken. (Via het Bank Select Register. Werkt wel wat makkelijker.
Dan wil dat zeggen dat die voorbeeldcode van Microchip voor geen meter gaat werken 
[Bericht gewijzigd door High-Voltage op (14%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Maar waar wordt die zero bit ergens voor gebruikt?
Voor testen of een geheugenplaats '0' is:
MOVF TEST,F ;Z-flag is geset als test '0' is. Voor testen of een geheugenplaats gelijk is aan een waarde:
MOVLW d'123' ;Vergelijk TEST met '123'
XORWF TEST,W ;Z-flag geset als TEST = '123'
In de tut die ik lees maken ze variabelen aan de hand van de EQU instructie.
EQU is geen instructie maar een compiler/assembly directive.
EQU wordt gebruikt bij absolute code, RES bij relocatable code
[Bericht gewijzigd door Arco op (22%)]
High-Voltage
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
Ja ok EQU is geen instructie voor de PIC maar zorgt ervoor dat de compiler adressen matcht met een string zodat het proggen wat handiger wordt.
Bij EQU verwijs je naar een vast adres bv 04h, maar op welke manier werkt die RES dan? Dat is gewoon relatieve adressering? Je geeft een beginadres en al de rest volgt hierop?
Al die variabelen komen in een sectie genaamd "UDATA". Hier zijn echter vier mogelijkheden voor: UDATA, UDATA_ACS, UDATA_OVR en UDATA_SHR. Op dit moment heb ik alles in SHR staan (shared), want als ik het in ACS probeer te zetten dan krijg ik de eerder vernoemde foutmelding. Wat is juist het verschil tussen al deze datablokken?
In de datasheet vind ik hier totaal niets van terug.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ja,
Je geeft op in welk geheugenblok de betreffende variabelen moeten zitten, en de linker vervangt dan tijdens het linken de RES directives door vaste adressen.
In de datasheet vind ik hier totaal niets van terug.
Dat klopt. Daarvoor moet je ook in de MPAsm helpfile zijn...
[Bericht gewijzigd door Arco op (29%)]
High-Voltage
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
Gevonden 
udata_shr - Uninitialized shared data. This data section is used for variables that will be placed in RAM of PIC12/16 devices that is unbanked or shared across all banks.
udata_acs - Uninitialized access data. This data section is used for variables that will be placed in access RAM of PIC18 devices. Access RAM is used as quick data access for specified instructions.
Nu alleen nog eens uitvogelen wat dat unbanken of sharen across all banks inhoudt. Dat lijkt me namelijk een optie om van dat bankgezeur af te zijn...
Ik ga in ieder geval mijn eerste ASM constructie eens in een PIC vlammen.
Edit:
Zonder banken te wisselen doe ie het niet, met banken wisselen doet ie het wel.
Straks of morgen eens zien of we wat PWM geprogd krijgen.
Hartelijk dank iedereen om mee te denken!
[Bericht gewijzigd door High-Voltage op (13%)]
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
Op 15 augustus 2008 15:41:00 schreef High-Voltage:
Nu alleen nog eens uitvogelen wat dat unbanken of sharen across all banks inhoudt. Dat lijkt me namelijk een optie om van dat bankgezeur af te zijn...
Een andere optie is PICBasic blijven gebruiken 
Al die variabelen komen in een sectie genaamd "UDATA". Hier zijn echter vier mogelijkheden voor: UDATA, UDATA_ACS, UDATA_OVR en UDATA_SHR. Op dit moment heb ik alles in SHR staan (shared), want als ik het in ACS probeer te zetten dan krijg ik de eerder vernoemde foutmelding. Wat is juist het verschil tussen al deze datablokken?
In de datasheet vind ik hier totaal niets van terug.
De verschillen worden in de help-file uitgelegd. Het ACCESS-geheugen is een stukje geheugen (registerfile) dat zonder banking kan worden aangesproken. In de datasheet van de PIC staat of die chip zoiets heeft en hoe groot het is (bv. 18F4550 de eerste 96 bytes). Ga je daarbuiten dan pikt de compiler dat niet en krijg je dus zo'n foutmelding.
De compiler zoekt ook zelf uit of registers banked of access zijn, als je dat niet in de instructie aangeeft.