200 likes | 348 Views
Mikroprotsessorid. PIC16F876A ASSEMBLER. Translaator. Program.asm. Program.hex object code. Translaator. Rakendus. Program.c. Assembler. Assembler kontrollib süntaksi Assembler muudab loetava käskudest teksti objektkoodiks Programm koosneb käskudest ja direktiividest
E N D
Mikroprotsessorid PIC16F876A ASSEMBLER
Translaator Program.asm Program.hexobject code Translaator Rakendus Program.c
Assembler Assembler kontrollib süntaksi Assembler muudab loetava käskudest teksti objektkoodiks Programm koosneb käskudest ja direktiividest Käsud on konkreetse mikrokontrolleri mnemoonika Direktiivid sunnivad Assemblerit transleerimise ajal midagi erilist tegema Tulemuseks on binaarfail, kus igale käsureale vastab täpselt 1 objektkoodi käsk
Kommentaarid ; Kommentaarid eraldatakse semikooloniga
Protsessori tüüp ; Kommentaarid eraldatakse semikooloniga Processor 16F876A ; Protsessori defineerimine
Headeri fail ; Kommentaarid eraldatakse semikooloniga Processor 16F876A ; Protsessori defineerimine #include “P16F876A.INC” ; Header; #include <P16F876A.INC> ; Võib ka nii
Headeri fail ; Kommentaarid eraldatakse semikooloniga Processor 16F876A ; Protsessori defineerimine #include “P16F876A.INC” ; Include fail ; Register Definitions ;=========================== W EQU H'0000' F EQU H'0001' ;----- Register Files------- INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' PORTA EQU H'0005' PORTB EQU H'0006' PORTC EQU H'0007‘.......... ;----- STATUS BitsIRP EQU H'0007' RP1EQU H'0006' RP0EQU H'0005' NOT_TOEQU H'0004' NOT_PDEQU H'0003' ZEQU H'0002' DCEQU H'0001' CEQU H'0000‘........... d=0: dest=W d=1: dest=f
Konfiguratsioonibitid ; Kommentaarid eraldatakse semikooloniga Processor 16F876A ; Protsessori defineerimine #include “P16F876A.INC” ; Include fail __config _HS_OSC & _WDT_OFF & _LVP_OFF ; NB! AND Configuration word 2007h ; P16F876A.INC ...... ; Configuration Bits ;=========================== _BODEN_ON EQU H'3FFF' _BODEN_OFF EQU H'3FBF' _PWRTE_OFF EQU H'3FFF' _PWRTE_ON EQU H'3FF7' _WDT_ON EQU H'3FFF' _WDT_OFF EQU H'3FFB' _LP_OSC EQU H'3FFC' _XT_OSC EQU H'3FFD' _HS_OSC EQU H'3FFE' _RC_OSC EQU H'3FFF'..........
ORG – määra koodi absoluutne aadress ; Kommentaarid eraldatakse semikooloniga Processor 16F876A ; Protsessori defineerimine#include “P16F876A.INC” ; Include fail __config _HS_OSC & _WDT_OFF & _LVP_OFF ; NB! AND ORG 0x00 ; Reset Vector GOTO Algus ; Mine algusse ORG 0x04 ; Interrupt Vector GOTO Katkestus ; Mine katkestust teenindama
Label - Märgend Processor 16F876A ; Protsessori defineerimine#include “P16F876A.INC” ; Include fail __config _HS_OSC & _WDT_OFF & _LVP_OFF ; NB! AND ORG 0x00 ; Reset Vector GOTO Algus ; Mine algusse ORG 0x04 ; Interrupt Vector GOTO Katkestus ; Mine katkestust teenindamaAlgus CLRF STATUS ; STATUS – kõik bitid 0 BSF STATUS,5 ; STATUS – RP0=1 MOVLW 0x00 ; 0 -> registri W kaudu MOVWF TRISB ; registrisse TRISB BCF STATUS,5 ; STATUS – RP0=0 et ; adresseerida Block0Katkestus
Cblock – määra muutujate absoluutsed aadressid mälus CblockRR1=0x20Endc CblockRR1=0x20, RR2=0x21, RR3=0x22Endc CblockRR1=0x20:1RR2=0x21:2Endc
Cblock – määra mälupiirkond Processor 16F876A ; Protsessori defineerimine#include “P16F876A.INC” ; Include fail __config _HS_OSC & _WDT_OFF & _LVP_OFF ; NB! AND Cblock RR1 = 0x20 Endc ORG 0x00 ; Reset Vector GOTO Algus ; Mine algusse ORG 0x04 ; Interrupt Vector GOTO Katkestus ; Mine katkestust teenindamaAlgus CLRF STATUS ; STATUS – kõik bitid 0 BSF STATUS,5 ; STATUS – RP0=1 MOVLW 0x00 ; 0 -> registri W kaudu MOVWF TRISB ; registrisse TRISB BCF STATUS,5 ; STATUS – RP0=0
EQU – defineeri konstant Processor 16F876A ; Protsessori defineerimine#include “P16F876A.INC” ; Include fail __config _HS_OSC & _WDT_OFF & _LVP_OFF ; NB! AND Cblock RR1 = 0x20 Endc ORG 0x00 ; Reset Vector GOTO Algus ; Mine algusse ORG 0x04 ; Interrupt Vector GOTO Katkestus ; Mine katkestust teenindamaAlgus CLRF STATUS ; STATUS – kõik bitid 0 BSF STATUS,5 ; STATUS – RP0=1 MOVLW 0x00 ; 0 -> registri W kaudu MOVWF TRISB ; registrisse TRISB BCF STATUS,5 ; STATUS – RP0=0MOVLW 0x55 ; 55 -> registri W kaudu MOVWF RR01 ; mällu aadressiga RR01
EQU – defineeri konstant Processor 16F876A ; Protsessori defineerimine#include “P16F876A.INC” ; Include fail __config _HS_OSC & _WDT_OFF & _LVP_OFF ; NB! AND Cblock RR1 = 0x20 Endc Konstant EQU 0x55 ORG 0x00 ; Reset Vector GOTO Algus ; Mine algusse ORG 0x04 ; Interrupt Vector GOTO Katkestus ; Mine katkestust teenindamaAlgus CLRF STATUS ; STATUS – kõik bitid 0 BSF STATUS,5 ; STATUS – RP0=1 MOVLW 0x00 ; 0 -> registri W kaudu MOVWF TRISB ; registrisse TRISB BCF STATUS,5 ; STATUS – RP0=0MOVLW 0x55 ; 55 -> registri W kaudu MOVWF RR01 ; mällu aadressiga RR01 Konstant
Processor 16F876A ; Protsessori defineerimine#include “P16F876A.INC” ; Include fail __config _HS_OSC & _WDT_OFF & _LVP_OFF ; NB! AND Cblock RR1 = 0x20 EndcKonstant EQU 0x55 ORG 0x00 ; Reset Vector GOTO Algus ; Mine algusse ORG 0x04 ; Interrupt Vector GOTO Katkestus ; Mine katkestust teenindamaAlgus CLRF STATUS ; STATUS – kõik bitid 0 BSF STATUS,5 ; STATUS – RP0=1 MOVLW 0x00 ; 0 -> registri W kaudu MOVWF TRISB ; registrisse TRISB BCF STATUS,5 ; STATUS – RP0=0 MOVLW Konstant ; 55 -> registri W kaudu MOVWF RR01 ; mällu aadressiga RR01Loop COMF RR01,F ; F defineeritud “inc” failis MOVF RR01,W ; Võib ka RR01,0 MOVWF PORTB ; W -> PORTB GOTO Loop
END – koodi lõpp Processor 16F876A ; Protsessori defineerimine#include “P16F876A.INC” ; Include fail __config _HS_OSC & _WDT_OFF & _LVP_OFF ; NB! AND Cblock RR1 = 0x20 EndcKonstant EQU 0x55 ORG 0x00 ; Reset Vector GOTO Algus ; Mine algusse ORG 0x04 ; Interrupt Vector GOTO Katkestus ; Mine katkestust teenindamaAlgus CLRF STATUS ; STATUS – kõik bitid 0 BSF STATUS,5 ; STATUS – RP0=1 MOVLW 0x00 ; 0 -> registri W kaudu MOVWF TRISB ; registrisse TRISB BCF STATUS,5 ; STATUS – RP0=0 MOVLW Konstant ; 55 -> registri W kaudu MOVWF RR01 ; mällu aadressiga RR01Loop COMF RR01,F ; F defineeritud “inc” failis MOVF RR01,W ; Võib ka RR01,0 MOVWF PORTB ; W -> PORTB GOTO LoopEnd
#DEFINE – asenda tekst millegi muuga Processor 16F876A ; Protsessori defineerimine#include “P16F876A.INC” ; Include fail #define NULLL 0x00 __config _HS_OSC & _WDT_OFF & _LVP_OFF ; NB! AND Cblock RR1 = 0x20 EndcKonstant EQU 0x55 ORG 0x00 ; Reset Vector GOTO Algus ; Mine algusse ORG 0x04 ; Interrupt Vector GOTO Katkestus ; Mine katkestust teenindamaAlgus CLRF STATUS ; STATUS – kõik bitid 0 BSF STATUS,5 ; STATUS – RP0=1 MOVLW 0x00 ; 0 -> registri W kaudu MOVWF TRISB ; registrisse TRISB BCF STATUS,5 ; STATUS – RP0=0 MOVLW Konstant ; 55 -> registri W kaudu MOVWF RR01 ; mällu aadressiga RR01Loop COMF RR01,F ; F defineeritud “inc” failis MOVF RR01,W ; Võib ka RR01,0 MOVWF PORTB ; W -> PORTB GOTO Loop End NULLL
#DEFINE – asenda tekst millegi muuga Processor 16F876A ; Protsessori defineerimine#include “P16F876A.INC” ; Include fail #define NULLL 0x00 __config _HS_OSC & _WDT_OFF & _LVP_OFF ; NB! AND Cblock RR1 = 0x20 Endc Konstant EQU 0x55 ORG 0x00 ; Reset Vector GOTO Algus ; Mine algusse ORG 0x04 ; Interrupt Vector GOTO Katkestus ; Mine katkestust teenindamaAlgus CLRF STATUS ; STATUS – kõik bitid 0 BSF STATUS,5 ; STATUS – RP0=1 MOVLW NULLL ; 0 -> registri W kaudu MOVWF TRISB ; registrisse TRISB BCF STATUS,5 ; STATUS – RP0=0 MOVLW Konstant ; 55 -> registri W kaudu MOVWF RR01 ; mällu aadressiga RR01Loop COMF RR01,F ; F defineeritud “inc” failis MOVF RR01,W ; Võib ka RR01,0 MOVWF PORTB ; W -> PORTB GOTO Loop End Mille poolest erinevad EQU ja #DEFINE ? EQU mõjub ainult käskudele #DEFINE mõjub ka direktiividele ifdef NULLL NOP ; Need 3 NOP-i lähevad mängu NOP ; ainult kui NULLL NOP ; on defineeritud endif ifndef NULLL NOP ; kui NULLL ei ole enam ; defineeritud, läheb mängu ; ainult 1 NOP endif #undefine NULLL ; NULLL ei ole enam defineeritud