Grunnleggende programmering
Her skal jeg prøve å forklare noen grunnleggende ting innen assembler programmering.
Assembler programmering er nesten det laveste nivået man kommer innen programmering,
her behandler man en og en byte og en og en bit.
Instruksjonssettet består bare av 35 instruksjoner og de er lette å huske etterhvert.
Skriving av program
Når man skriver et program så er første kolonne avsatt til 'merker' ( label ), neste kolonne er avsatt til
instruksjonene, neste kolonne er avsatt til konstanter og registre, neste kolonne bruks til kommentarer.
Man kan skrive programmet i Notepad da bruker man tabulatoren til å flytte seg mellom kolonnene.
Når man skriver en kommentar er det viktig å ha semikolon foran kommentaren.
Her er et eksempel.
LOOP |
DECFSZ |
10,1 |
;Trekker fra 1 i reg.10 Hvis reg 10 er 0 så hopp over neste instruksjon |
|
GOTO |
LOOP |
;Gå til linjen merket LOOP |
F - registere
PIC prosessoren har flere registre, f- registerene er områder i RAM som har adresse fra 00 hex til 4F hex,
et f- register kan også være en utgang eller inngang.
Adressene fra 00 hex til 0B hex er registerer som har spesielle oppgaver, adressene fra 0C hex til 4F hex er ledige
plasser som kan brukes til hva som helst.
Tall systemer
Tall kan skrives på forskjellige måter, heksadesimalt, binært og desimalt.
Heksadesimalt skrives slik : 0x5F
Binært skrives slik : b'01011111'
Desimalt skrives slik ; .95
Skrives tallet uten noe foran, blir dette tolket som en hex verdi.
Tallet 95 blir tolket som 0x95 og er ikke det samme som .95 som er desimalt.
W - registeret
W -registeret er et mellomlager som man må bruke i forbindelse med de fleste instruksjoner.
Å kopiere noe fra et f- register til et annet f- register går ikke uten videre, verdien må mellomlagres
først, dette gjør man i w- registeret.
Kommandoene under kopierer inneholdet av register 0C hex til 0D hex.
0 etter komma i den første instruksjonen bestemmer hvor inneholdet skal lagres, 0 til w- register og 1 til f- register.
|
MOVF |
0C,0 |
;Kopierer innholdet i 0C til w |
|
MOVWF |
0D |
;Kopierer innholdet i w til 0D |
PIC 16F84 Instruksjoner
ã
Atle Hillestad
BYTE ORIENTERTE
ADDWF f.d Adderer innholdet i W-registeret med innholdet i f- registeret. Hvis d.
= 0. Blir svaret plassert i W-Registeret, hvis d. = 1. Blir svaret plassert tilbake i f-registeret.
ANDWF f,d OG'er innholdet I W-registeret med innholdet I f-registeret. Hvis f. = 0
blir svaret plassert I W-registeret. Hvis d. = 1. Blir svaret plassert tilbake i f-registeret.
CLRF f Innholdet i f. blir satt til 0 (clearet) og Z -bit blir satt.
CLRW Innholdet i W. blir satt til 0 (clearet) og Z -bit blir satt.
COMF f,d Innholdet i f-registeret blir komplementert ( invertert ). Hvis d. = 0.blir
resultatet Plassert i W-registeret. Hvis d. = 1. Blir resultatet plassert tilbake I f- Registeret.
DECF f,d Minker innholdet i f-registeret med 1. Hvis d. = 0.blir resultatet
plassert i W-registeret. Hvis d. = 1. Blir resultatet plassert tilbake i f-Registeret.
DECFSZ f,d Minker innholdet i f-registeret med 1. Hvis d. = 0.blir resultatet
plassert i W-registeret. Hvis d. = i. Blir resultatet plassert tilbake i f-Registeret.
Hvis resultatet = 1. Blir neste instruksjon utført. Hvis resultatet =
0.vil den neste instruksjon ikke bli utført, isteden vil PC hoppe 2-cycler.
INCF f,d Innholdet i f-registeret økes med 1. . Hvis d. = 0.blir resultatet
Plassert i W-registeret. Hvis d. = 1. Blir resultatet plassert tilbake i f- Registeret.
INCFSZ f,d Innholdet i f-registeret økes med 1. . Hvis d. = 0.blir resultatet
plassert i W-registeret. Hvis d. = 1. Blir resultatet plassert tilbake i f- Registeret.
Hvis resultatet = 1. Blir neste instruksjon utført. Hvis resultatet =0.
vil den neste instruksjon ikke bli utført, isteden vil PC hoppe 2-cycler.
IORWF f,d Innclusiv OR'er W-registeret med f-registeret. . Hvis d. = 0.blir
resultatet plassert i W-registeret. Hvis d. = 1. Blir resultatet plassert tilbake i f-Registeret.
MOVF f,d Innholdet i f-registeret blir flyttet. Avhengig av d. Hvis d = 0.
er destinasjonen W-registeret. Hvis d.= 1.er destinasjonen f-registeret.
d = 1. Er nyttig å bruke for å teste et f-register fordi status flagget Z
blir påvirket.
MOVWF f Flytter innholdet i W-registeret til f-registeret.
NOP No operation, brukes som en kort tidsforsinkelse.
RLF f,d Innholdet i f-registeret roteres en bit til venstre.(trough carry)
Hvis d. = 0.blir resultat plassert i W-registeret. Hvis d. = 1. Blir resultatet plassert tilbake i f-Registeret.
RRF f,d Innholdet i f-registeret roteres en bit til høyere.(trough carry)
Hvis d. = 0.blir resultat plassert i W-registeret. Hvis d. = 1. Blir resultatet plassert tilbake i f-Registeret.
SUBWF f,d Trekker W-registerets innhold fra f-registerets innhold. ( F - W )
Hvis d. = 0.blir resultat Plassert i W-registeret. Hvis d. = 1. Blir resultatet plassert tilbake i f-Registeret.
SWAPF f,d De 4 øverste og nederste bit'ene i f-registeret blir byttet om.(skifter plass)
Hvis d. = 0.blir resultat plassert i W-registeret. Hvis d. = 1. Blir resultatet plassert tilbake i f-Registeret.
XORWF f,d Exlusiv Or'er innholdet i W-registeret med f-registeret. Hvis d. = 0.blir
resultat plassert i W-register Hvis d. = 1. Blir resultatet plassert tilbake i f-Registeret.
BIT ORIENTERTE FILINSTRUKSJONER
BCF f,b Bit b. i f-registeret er satt til 0.
BSF f,b Bit b. i f-registeret er satt til 1.
BTFSC f,b Hvis bit b.i f-registeret = 1. Blir neste instruksjon utført. Hvis bit = 0.vil
den neste instruksjon ikke bli utført.
BTFSS f,b Hvis bit b.i f-registeret = 0. Blir neste instruksjon utført. Hvis bit = 1.vil
den neste instruksjon ikke bli utført.
KONTROLL INSTRUKSJONER
ADDLW k Innholdet i W-registeret blir addert med konstanten k. og resultatet blir
plassert i W-registeret.
ANDLW k Innholdet i W-registeret blir OG'et med konstanten k og resultatet blir
plassert i W-registeret.
CALL k Kaller opp subrutine.
CLRWDT Clear Watchdog Timer.
GOTO k Går til et sted i programmet, bestemt av konstanten k
IORLW k IOR'er W-registeret med konstanten k. Resultatet blir
Plassert i W-registeret.
MOVLW k Konstanten k. blir plassert i W-registeret.
RETFIE Returner fra en Interupt rutine.
RETLW k Returnerer fra en subrutine med konstanten k i w register, denne brukes
ofte i forbindelse med tabeller.
RETURN Returnerer fra en subrutine.
SLEEP Prosessor blir satt i sleep-mode.
SUBLW k W-registeret blir trekt fra konstanten k.
XORLW k Innholdet I W-registeret blir XOR'et med konstanten k.
Resultatet bli plassert i W-rgisteret.
Forklaringer til instruksjonssettet
Bokstaven f angir hvilket register instruksjonen skal gjøre noe med.
Bokstaven ,d angir hvor resultatet av instruksjonen skal lagres, er d = 0 så lagres resultatet i w -registeret,
er d = 1 så lagres resultatet i f -registeret.
Hvis man ikke skriver noe inn for d så settes den automatisk til 1, dvs. resultat lagres i f -register.
|
ADDWF |
10,1 |
;Adderer w og register 10 svar legges i register 10 |
|
ADDWF |
10,0 |
;Adderer w og register 10 svar legges i w -register |
|
ADDWF |
10 |
;Adderer w og register 10 svar legges i register 10 |
Bokstaven b angir hvilket bit instruksjonen skal gjøre noe med.
|
BSF |
10,3 |
;Setter bit 3 i register 10 til 1 |
Bokstaven k betyr konstant, dvs. at konstanten er et tall man skriver inn i programmet som
alltid vil stå der for eks.
|
ADDLW |
.5 |
;Adderer tallet 5 til w -registeret |
|
GOTO |
LOOP |
;Gå til linjen merket LOOP |
Equate
F -registerene har heksadesimale adresser, disse kan være vanskelige å holde styr på når det
blir mange av dem.
Vi kan gi registerene navn slik at det blir lettere å skille dem fra hveradre.
Dette gjøres i begynnelsen av programmet.
Register 10 vil vi kalle "teller", register 5 vil vi kalle porta og register 6 vil vi kalle portb :
teller |
EQU |
10 |
;Register 10 kalles teller |
porta |
EQU |
05 |
;Register 5 kalles porta |
portb |
EQU |
06 |
;Register 6 kalles portb |
På denne måten er det lettere skrive programmet.
|
BSF |
05,3 |
;Setter bit 3 på porta til 1 ( pinne 2 ) |
|
BSF |
porta,3 |
;Setter bit 3 på porta til 1 ( pinne 2 ) |
Klikk her for å laste ned databladet med instruksjonssettet ( 1,1 M byte )