Assembly Programming For Mid Range PIC
Assembly Programming For Mid Range PIC
Assembly Programming For Mid Range PIC
ProducingExecutableCode
Assembly Develop code on PC Edit / assemble / link / debug Assembly Convert assembly language code to machine language Absolute (executable) code
Single module systems Real (absolute) addresses
Assembly Code Assembler Executable Code
Linker
Executable Code
Linking Combine + convert multiple object modules to executable code Set real addresses
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming Dr. Martin Land 2
ProducingExecutableCode
Compiling Develop code on PC Edit / assemble / compile / link / debug Compile Convert C language code to object code C compiler available for Mid-Range PICs and higher Linking Combine + convert multiple object modules to executable code Set real addresses Assembler
Assembly Code Assembly Code C Code Object Code Object Code Object Code Library Code
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming Dr. Martin Land 3
Linker
Executable Code
Assembler
Compiler
MPLAB
IntegratedDevelopmentEnvironment(IDE) Text editor Colorized formatting of PIC assembly code + directives Assembler MPASM.EXE / MPASMWIN.EXE Linker MPLINK.EXE Library manager MPLIB.EXE Creates library (.lib) from several assembler programs Simulator/Debugger Simulates microcontroller on PC Permits (limited) testing and debugging Programmer Program microcontroller device Requires additional hardware
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming Dr. Martin Land 4
ElementsofanAssemblyProgram
Instructions Assembly language instructions in PIC ISA
Assembly language instruction machine language instruction
Labels Constant
Symbolic literal
Variable
Pointer to data register holding value
Line label
Pointer to location of instruction word GOTO label GOTO address_of_instruction_at_label
ProgramOrganization
Absolute code Directives
Include header files Set up constants + variables + macros
Subroutine code sections END directive Relocatable code Similar to absolute code Differences
Variables defined in separate data section No address specification for code sections Direct / indirect addressing permitted
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming Dr. Martin Land 6
AssemblerInput/OutputFiles
File Source Includefile Listing ErrorFile HexFile Cross Reference ObjectFile Extension
.asm .inc .lst .err .hex, .hxl, .hxh
.xrf .o
Assembler
Constants
Symbolicliteral nochangeatruntime Defining constant Assign value to symbol Assembler converts symbol to literal Directives equ no reassignment set reassignment as constant Example
CONST1 equ 0xA5 BIT equ 3 prog1: movlw CONST1 addlw BIT ; assign ; assign ; W A5h ; W 3 + W
Specifying constant values May be preceded by + or Decimal D'167' .'167' H'A7' 0xA7 0A7H O'247' 247O B'10100111' A'Z' 'Z'
Hexadecimal
Variables
Pointertodataregisterholdingvalue Defining variable Relocatable code
Reserve memory space in data section
Absolute code
Assign pointer to symbol Use symbols as register name
Example (absolute)
CONST1 equ 0xA5 REG1 equ 20h BIT equ 3 prog1: movlw CONST1 movwf REG1 bcf REG1, BIT
Embedded Systems Hadassah College Spring 2011
; assign ; assign ; assign ; W A5h ; REG1 (address 20h) W ; REG1<BIT> = bit 3 in reg 20h 0
Mid-Range PIC Programming Dr. Martin Land 9
OperationsonConstants
Arithmeticatassemblytime Example
CONST1 equ 0xA5 ; assign REG1 equ 20h ; assign INDEX equ 4 ; assign BIT set 3 ; assign BIT 3 BIT set BIT + INDEX ; reassign BIT 7 prog1: movlw CONST1 ; W A5h movwf REG1 ; REG1 (address 20h) W bcf REG1, BIT ; REG1<BIT> = bit 7 in reg 20h 0
10
Operatorsonconstants
Evaluatedatassemblytime
+ * / % ~ & | ^ >> << ! && || > < > < = !=
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming Dr. Martin Land 11
Addition Subtraction Multiplication Division Modulo NOT AND OR XOR Right shift Left shift A1 NOT AND OR Higher than Less than Higher or equal to Less or equal to Equal to Different than
A1 + A2 A1 A2 A1 * A2 A1/A2 A1%A2 ~A1 A1 & A2 A1 | A2 A1 ^ A2 A1 >> 1 << 2 !A1 A1 && A2 A1 || A2 A1 > A2 A1 < A2 A1 >= A2 A1 <= A2 A1 == A2 A1 != A2
Evaluate arithmetically
Evaluate bitwise
OperatorsonVariablePointers
Evaluatedatassemblytime
= ++ -+= -= *= /= %= &= |= ^= >>= <<=
Logic or arithmetic assignment Increment Decrement Add and assign Subtract and assign Multiply and assign Divide and assign Mod and assign AND and assign OR and assign XOR and assign Right shift and assign Left shift and assign
var = 0 var ++ var -var += k var -= k var *= k var /= k var %= k var &= k var |= k var ^= k var >>= k var <<= k
var = 0 var = var + 1 var = var 1 var = var + k var = var k var = var * k var = var / k var = var % k var = var & k var = var | k var = var ^ k var = var >> k var = var << k
DefineBlockofConstants
For absolute code Specify starting absolute address Defines list of named symbols at sequential addresses Used as variable pointers Syntax cblock [expr] label[:increment][,label[:increment]] endc Example cblock 0x20 name_0, name_1 name_2, name_3 endc
Embedded Systems Hadassah College Spring 2011
; ; ; ;
AddressOperatorsandGeneralDirectives
Operator
$ low high
Operation
Currentaddress Addresslowbyte Addresshighbyte goto $ movlw low label
Example
; loop in place ; W label<7:0>
Directive
list processor radix
Operation
Definedeviceand defaultnumber system processor 16f84a radix dec #include file
Example
list p = 16f84a, r = dec
#include
Includefileinsource #include "file" code #include <file> Assignaddressto instructionin org 4 ; set next instruction address 4 absolutecoding ; (interrupt section) Startofcodesection org 20 ; set next instruction address ; 20h
Mid-Range PIC Programming Dr. Martin Land
org
14
DeviceHeaderFile(Fragment)
; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc. ; This header file defines configurations, registers, and other useful bits of ; information for the PIC16F84 microcontroller. These names are taken to match ; the data sheets as closely as possible. ; = = = = = = = = = = = = = = = = = = = = = = = = = = ; Register Definitions ; = = = = = = = = = = = = = = = = = = = = = = = = = = W EQU H'0000' F EQU H'0001' ;----- Register Files-----------------------------INDF EQU H'0000' TMR0 EQU H'0001' SpecialFunctionRegisters(SFR) PCL EQU H'0002' STATUS EQU H'0003' Notreservednames FSR EQU H'0004' PORTA EQU H'0005' Definedinheaderfiles PORTB EQU H'0006' : ;----- STATUS Bits ---------------------------------IRP EQU H'0007' RP1 EQU H'0006' RP0 EQU H'0005' NOT_TO EQU H'0004' NOT_PD EQU H'0003' Z EQU H'0002' DC EQU H'0001' C EQU H'0000' ;----- INTCON Bits ---------------------------------:
15
SkeletonforAbsoluteCode 1
list p = 16f873 #include <p16f873.inc> ; ; Define constants ; DATA1 EQU 0x1 DATA2 EQU 0x2 ; ; Define variables ; w_temp equ 0x20 status_temp equ 0x21 X equ 0x22 Y equ 0x23 ; Declare device ; include header file
SkeletonforAbsoluteCode 2
; ; Body of program ; org 0x000 movlw high PP movwf PCLATH goto PP ;
; ; ; ;
Reset vector address W 000.PP<12:8> PCLATH PP<12:8> PCL PP<7:0> = start of main
17
SkeletonforAbsoluteCode 3
Interrupt vector address w_temp W (no flags) W STATUS (write Z) Select bank 0 status_temp W = STATUS ; (no write Z) ; Interrupt Service Routine Here ; bcf STATUS, RP0 ; Select bank 0 movf status_temp, W ; Restore STATUS (write Z) movwf STATUS ; (no write Z) swapf w_temp, f ; swap nibbles to w_temp swapf w_temp, W ; re-swap nibbles to W ; (no write Z) retfie ; Return from interrupt
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming Dr. Martin Land 18
org 0x004 movwf w_temp movf STATUS, W bcf STATUS, RP0 movwf status_temp
; ; ; ; ;
SkeletonforAbsoluteCode 4
PP: clrf X clrf Y ; ; main program ; ; subroutine call ; movlw high SR1 movwf PCLATH call SR1 ; zero variables
; ; ; ; ;
W 000.SR1<12:8> PCLATH SR1<12:8> push PC PCL SR1<7:0> spin loop (jumps to here)
19
SectionDeclarationsforRelocatableCode
Initializeddatasection Syntax [label] idata [RAM_address] Defaults label = .idata RAM_address set by linker Example idata LimitL dw 0 LimitH dw D'300' Gain dw D'5' Flags res 1 String db 'Hi there!'
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming
20
SectionDeclarationsforRelocatableCode
UninitializedDataSection Syntax [label] udata [RAM_address] Defaults label = .udata RAM_address set by linker Example udata Var1 res 1 Double res 2
21
SectionDeclarationsforRelocatableCode
SharedUninitializedDataSection Syntax [label] udata_shr [RAM_address] Registers shared across memory
Values copied to file address in all banks
SectionDeclarationsforRelocatableCode
Overlayed UninitializedDataSection Syntax [label] udata_ovr [RAM_address] Registers declared in section overlayed
Other udata_ovr sections with same name overwrite same space Multiple temporary variable sets declared at one memory location
Default label = .udata_ovr Example Temps udata_ovr Temp1 res 1 Temp2 res 1 ; ; work with Temp1, Temp2 ; Temps udata_ovr NewTemp1 res 1 ; reallocate location Temp1 NewTemp2 res 1 ; reallocate location Temp2
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming Dr. Martin Land 23
SectionDeclarationsforRelocatableCode
CodeSection
Syntax [label] code [RAM_address] Defaults label = .code RAM_address set by linker Example RST
CODE 0x0 pagesel start goto start PGM CODE start: clrw goto $ CODE nop end
SkeletonforRelocatableCode 1
list p = 16f873 #include <p16f873.inc> ; ; Define constants ; DATA1 EQU 0x1 DATA2 EQU 0x2 ; ; Define variables ; udata_shr w_temp res 1 status_temp res 1 X res 1 Y res 1
Embedded Systems Hadassah College Spring 2011
25
SkeletonforRelocatableCode 2
; ; Body of program ; Rst_vector code 0 pagesel PP goto PP ; Intr_vector code 4 goto SR_Int ;
26
SkeletonforRelocatableCode 3
Intr_Prog code 5 ; ISR SR_Int: movwf w_temp ; w_temp W (no flags) movf STATUS, W ; W STATUS (write Z) bcf STATUS, RP0 ; Select bank 0 movwf status_temp ; status_temp W = STATUS ; (no write Z) ; Interrupt Service Routine Here ; bcf STATUS, RP0 ; Select bank 0 movf status_temp, W ; Restore STATUS (write Z) movwf STATUS ; (no write Z) swapf w_temp, f ; swap nibbles to w_temp swapf w_temp, W ; re-swap nibbles to W ; (no write Z) retfie ; Return from interrupt
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming Dr. Martin Land 27
SkeletonforRelocatableCode 4
Prog_Principal code PP: clrf X ; zero variables clrf Y ; ; main program ; ; subroutine call ; pagesel call SR1 goto $ ; spin loop (jumps to here) Subroutines code SR1: ; code of subroutine SR1 return ; Return to main
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming Dr. Martin Land 28
Define SingleLineMacros
Syntax #define name [string] Text substitution name in assembly code replaced by string Permits parameter substitution Example #define length 20 #define width 30 #define depth 40 #define circumference(X,Y,Z) (X + Y + Z) : Size equ circumference(length, width, depth) Size evaluates to 20+30+40 = 90
29
Macros
Syntax macro_name macro [arg_def1, arg_def2,] [ local label [, label, label,]] ; ; Body of macroinstruction ; endm Optional arguments arg_def1, arg_def2 local labels local to macro definition Call macro macro_name [arg1, arg2,]
30
MacroExample
Convert macro HEXA, ASCII local add30, add37, end_mac movf HEXA, W sublw 9 movf HEXA, W btfsc STATUS, C C != 0 goto add30 add37: C = 0 addlw 37h goto end_mac add30: addlw 30h end_mac: movwf ASCII endm Convert HX, ASC
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming
; ; ; ; ; ; ; ; ; ; ; ;
Declare macro local labels HEXA W W 9 - W C (W > 9) C not changed if (C == 0){ W W + 37h } else { W W + 30h }
MacrosforRegisterSave/Restore
PUSH_MACRO MACRO MOVWF W_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP ENDM ; ; ; ; ; Save register contents Temporary register W W swap STATUS nibbles Temporary register STATUS End this Macro
POP_MACRO MACRO SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W ENDM
; ; ; ; ; ; ;
Restore register contents W swap STATUS STATUS W W_Temp swap W_Temp W swap W_Temp s no affect on STATUS End this Macro
32
TypicalInterruptServiceRoutine(ISR) 1
org ISR_ADDR PUSH_MACRO CLRF STATUS ; store at ISR address ; save context registers W, STATUS ; Bank0
; switch implementation in PIC assembly language BTFSC PIR1, TMR1IF GOTO T1_INT BTFSC PIR1, ADIF GOTO AD_INT BTFSC PIR1, LCDIF GOTO LCD_INT BTFSC INTCON, RBIF GOTO PORTB_INT GOTO INT_ERROR_LP1 ; skip next if (PIR1<TMR1IF> == 1) ; go to Timer1 ISR ; skip next if (PIR1<ADIF> == 1) ; go to A/D ISR ; skip next if (PIR1<LCDIF> == 1) ; go to LCD ISR ; skip next if (PIR1<RBIF> == 1) ; go to PortB ISR ; default ISR
33
TypicalInterruptServiceRoutine(ISR) 2
T1_INT : BCF PIR1, TMR1IF GOTO END_ISR AD_INT : BCF PIR1, ADIF GOTO END_ISR LCD_INT : BCF PIR1, LCDIF GOTO END_ISR PORTB_INT : END_ISR POP_MACRO RETFIE
Embedded Systems Hadassah College Spring 2011
; Timer1 overflow routine ; Clear Timer1 overflow interrupt flag ; Leave ISR ; Routine when A/D completes ; Clear A/D interrupt flag ; Leave ISR ; LCD Frame routine ; Clear LCD interrupt flag ; Leave ISR ; PortB change routine ; Leave ISR ; Restore registers ; Return and enable interrupts
Mid-Range PIC Programming Dr. Martin Land 34
AccessingExternalModules
Import Label extern label [, label...] Declare symbol
Used in current module Defined as global in different module
Example
; in module 1 global Var1, Var2 global AddThree ; udata Var1 res 1 Var2 res 1 code AddThree: addlw 3 return ; in module 2 extern Var1, Var2 extern AddThree clrf Var1 clrf Var2 call AddThree
Must appear before label used Export Label global label [, label...] Declare symbol
Defined in current module Available to other modules
35
StartMPLABIDE
36
Configure>SelectDevice
37
Project>ProjectWizard
Wizard
SelectPICDevice
SelectLanguageTools
SaveProjectbyPathname
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming
AddDeviceTemplateFile
Dr. Martin Land 38
BuildProject
Either Project > Build All Right click on project name in Project Window > Build All Click Build All icon on Project toolbar Output window shows result of build process Should be no errors or warnings for default template file
TestingCodewithSimulator
Debugger > Select Tool > MPLAB SIM Debug toolbar opens Debugger > Reset > Processor Reset Assembly code editor opens Green arrow points to program start (main)
40
View>Watch
Choose + Add items to watch list SFRs Symbols
41
Breakpoints
Set breakpoint Double-click on line of code Right click > choose Set Breakpoint from menu Run Program stops before breakpoint
42
Stopwatch
At breakpoint Reports clock cycles Estimates runtime
43
DelayTimerwithTimer0 1
Internal RC oscillator TCY = 4 1 / (4 MHz) = 1 s = 0.001 ms 1 ms = 1000 counts Prescale PS<2:0> 010 for 1 / 8 division 125 counts 2 cycle delay in synchronizer 123 counts Preset Timer0 interrupts when FFh = 256 rolls over to 0 Preset counter to 256 123 = 133 N ms delay AUX N for N 1 ms delay
44
DelayTimerwithTimer0 2
InitTimer0: List p = 16F873 include "P16F873.INC" AUX equ 0x20 ; Auxiliary variable bcf INTCON, T0IE ; Disable Timer0 interrupt bsf STATUS, RP0 ; Bank 1 movlw 0xC2 ; Configure timer mode movwf OPTION_REG ; Prescaler = 8 bcf STATUS, RP0 ; Bank 0 clrf TMR0 ; TMR0 0 bcf INTCON, T0IF ; Clear overflow flag return movlw .133 ; Preset value = 133 (decimal) movwf TMR0 ; TMR0 preset btfss INTCON, T0IF ; Skip next if (T0IF == 1) goto Del1ms_01 ; Keep waiting bcf INTCON, T0IF ; Clear T0IF = 0 return ; Return after 1 ms movwf AUX ; AUX number of ms ; Call Del1ms AUX times call Del1ms ; Wait 1 ms. decfsz AUX, f ; AUX-- Skip next if (AUX == 0) goto DemNms_01 ; Keep waiting return ; Return after AUX interations end
Mid-Range PIC Programming Dr. Martin Land 45
Del1ms: Del1ms_01:
DelNms: DelNms_01:
MeasureIntervalBetweenExternalPulses 1
Internal RC oscillator TCY = 4 1 / (4 MHz) = 1 s = 0.001 ms Timer1 Synchronous timer mode Prescale 1 TMR1++ every microsecond CPP1 in capture mode Capture values of Timer1
CCP1CON 00000101 (capture mode on rising edge)
46
MeasureIntervalBetweenExternalPulses 2
List p = 16F873 include "P16F873.INC" N1H equ 20h N1L equ 21h NH equ 22h NL equ 23h Init_capture: clrf T1CON clrf CCP1CON bsf STATUS, RP0 bsf TRISC, 2 bcf PIE1, TMR1IE bcf PIE1, CCP1IE bcf STATUS, RP0 clrf PIR1 movlw 0x05 movwf CCP1CON bsf T1CON, TMR1ON return
; High byte of first capture ; Low byte of first capture ; High byte of difference ; Low byte of difference ; Timer mode with prescaler = 1 ; Reset module CCP1 ; Bank 1 ; Set CCP1 pin as input ; Disable Timer1 interrupt ; Disable CCP1 interrupt ; Bank 0 ; Clear interrupt flags ; Capture mode on raising edge ; ; Start Timer1
47
MeasureIntervalBetweenExternalPulses 3
Capture: bcf PIR1, CCP1IF btfss PIR1, CCP1IF goto Capture bcf PIR1, CCP1I movf CCPR1L, W movwf N1L movf CCPR1H, W movwf N1H btfss PIR1, CCP1IF goto Capture2 bcf PIR1, CCP1IF movf N1L, W subwf CCPR1L, W movwf NL btfss STATUS, C goto Subt1 goto Subt0 decf CCPR1H, f movf N1H, W subwf CCPR1H, W movwf NH return end ; Clear capture flag ; Skip next if (CCP1IF == 1) ; Clear capture indicator ; Store captured value in N1H and N1L
Capture2:
Subt1: Subt0:
RealTimeClock(RTC) 1
Internal RC oscillator TCY = 4 1 / (4 MHz) = 1 s = 0.001 ms Timer0 Timer0 interrupts when FFh = 256 rolls over to 0 Prescale = 32 Interrupt every 0.001 ms 256 32 = 8.192 ms Seconds 1 second per clock tick (1 second / tick) / (8.192 ms / interrupt) = 122.07 interrupts / tick 1 second = 122 interrupts Minutes 1 minute = 60 clock ticks Hours 1 hour = 60 minutes Days 1 day = 24 hours
Embedded Systems Hadassah College Spring 2011 Mid-Range PIC Programming Dr. Martin Land 49
RealTimeClock(RTC) 2
INT
50
RealTimeClock(RTC) 3
list p = 16f873 #include <p16f873.inc> TICKS equ 0x20 ; Ticks counter SEC equ 0x21 ; Seconds counter MIN equ 0x22 ; Minutes counter HOUR equ 0x23 ; Hours counter TEMP_W equ 0x24 TEMP_ST equ 0x25 org 0 goto init org 4 goto rtc clrf INTCON ; Disable interrupts bsf STATUS, RP0 ; Bank 1 movlw 0xC4 ; Prescaler 32 movwf OPTION_REG ; Assigned to Timer0 bcf STATUS, RP0 ; Bank 0 movlw 0 ; Count module = 256 movwf TMR0 ; in Timer0 movlw .122 ; Ticks per second movwf TICKS ; in tick counter clrf SEC ; Clear Seconds counter clrf MIN ; Clear Minutes counter clrf HOUR ; Clear Hour counter bsf INTCON, T0IE ; Enable Timer0 interrupt bsf INTCON, GIE ; Enable global interrupts
Mid-Range PIC Programming Dr. Martin Land 51
init:
RealTimeClock(RTC) 4
prog: rtc: nop goto prog bcf STATUS, RP0 PUSH_MACRO bcf INTCON, T0IF decfsz TICKS, f goto end_rtc movlw .122 movwf TICKS incf SEC, f movf SEC, W xorlw .60 btfsc STATUS, Z goto end_rtc clrf SEC incf MIN, f movf MIN, W xorlw . 60 btfsc STATUS, Z goto end_rtc clrf MIN incf HOUR, f movf HOUR, W xorlw .24 btfsc STATUS, Z goto end_rtc clrf HOUR POP_MACRO retfie end ; ; ; ; ; Infinite loop Bank 0 Save STATUS, TEMP_ST Clear overflow flag for Timer0 TICKS-- Skip next if (TICKS == 0)
rtc_sec:
; Re-init TICKS ; seconds++ ; Z 1 if (SEC == 60) ; Skip next on (Z == 1) ; Clear seconds ; minutes++ ; Z 1 if (MIN == 60) ; Skip next on (Z == 1) ; Clear minutes ; hours++ ; Z 1 if (HOUR == 60) ; Skip next on (Z == 1) ; ; ; ; Clear hours Retrieve STATUS, TEMP_ST Return to interrupted program. End of source code.
Mid-Range PIC Programming Dr. Martin Land 52
rtc_min:
rtc_hour:
rtc_day: end_rtc: