Файл: Microcontroller Programming. Thi Micro Chip PIC (Julio Sanchez, 2007).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 14.06.2025
Просмотров: 8612
Скачиваний: 0
236 |
Chapter 11 |
;change interrupt. Pushbutton switches are connected
;to port-B lines 4 and 7. A red LED is wired to port
;RA1 and a green LED to port RA0. The pushbuttons
;generate interrupts that toggle a LEDs on and off. ;===========================
;switches
;===========================
; Switches used in __config directive:
; |
_CP_ON |
Code protection ON/OFF |
|
; * |
_CP_OFF |
||
; |
* |
_PWRTE_ON |
Power-up timer ON/OFF |
;_PWRTE_OFF
; |
_WDT_ON |
Watchdog timer ON/OFF |
||
; * _WDT_OFF |
||||
; |
_LP_OSC |
Low power crystal |
occilator |
|
; * _XT_OSC |
External parallel |
resonator/crystal oscillator |
||
; |
_HS_OSC |
High speed crystal resonator (8 to |
10 MHz) |
|
; |
Resonator: Murate |
Erie CSA8.00MG = |
8 MHz |
|
; |
_RC_OSC |
Resistor/capacitor oscillator (simplest, 20% |
||
error)
;|
;|_____ * indicates setup values
;========================= ; set up and configuration ;=========================
processor 16f84A |
|||
include |
<p16f84A.inc> |
||
__config |
_XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF |
||
;===================================================== |
|||
; |
variables in PIC RAM |
||
;===================================================== |
|||
; Local variables |
|||
cblock |
0x0d |
; Start of block |
|
J |
; counter J |
||
K |
; counter K |
||
count1 |
; Auxiliary counter |
||
count2 |
; ISR counter |
||
old_w |
; Context saving |
||
old_STATUS ; Idem |
|||
bitsB47 |
; Storage for previous value |
||
; in port-B bits 4-7 |
|||
temp |
; Temporary storage |
||
endc |
|||
;========================================================
; m a i n p r o g r a m
Interrupts |
237 |
|
;======================================================== |
||
org |
0 |
; start at address 0 |
goto |
main |
|
; |
||
;=============================
; interrupt handler
;=============================
org |
0x04 |
goto IntServ
;=============================
;main program ;============================= main:
;Disable port-B internal pullups
;Interrupts on falling edge of pushbutton action movlw b’10111111’
option
;Wiring:
; |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
<= port-B |
; |
| |
|_______________ red pushbutton |
|||||||
; |
|________________________ black pushbutton |
||||||||
; |
|||||||||
; |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
<= Port-A |
; |
| |
|_____ red LED |
|||||||
; |
|________ green LED |
||||||||
; |
|||||||||
movlw |
b’00000000’ |
; Set Port-A for ouput |
|||||||
tris |
PORTA |
||||||||
movlw |
b’11110000’ |
; Port-B bit 0-3 are output |
|||||||
; bits 4-7 are input |
|||||||||
tris |
PORTB |
; all others are output |
|||||||
clrf |
PORTB |
; All Port-B to 0 |
|||||||
movlw |
b’00000000’ |
; Zero to w |
|||||||
movwf |
bitsB47 |
; Store in local variable |
|||||||
; Initially turn on LEDs |
|||||||||
bsf |
PORTA,0 |
; Set LEDs on line 0 |
|||||||
bsf |
PORTA,1 |
; and on line 1 |
|||||||
;============================
;set up interrupts ;============================
;Clear external interrupt flag (intf = bit 1)
bcf |
INTCON,RBIF |
; Clear flag |
;Enable global interrupts (GIE = bit 7)
;Enable RB0 interrupt (inte = bit 4)
bsf |
INTCON,GIE |
; |
Enable |
global int (bit |
7) |
|
bsf |
INTCON,RBIE |
; |
Enable |
RB0 int (bit 3) |
||
;============================ |
||||||
; |
flash LED |
|||||
238 |
Chapter 11 |
;============================
;Main program does nothing. All action takes place in
;Interrupt Service Routine
lights:
nop
goto lights
;=======================================================
; |
Interrupt Service Routine |
;=======================================================
;Service routine receives control whenever any of
;port-B lines 4 to 7 change state
IntServ:
; First test: make sure source is an RB4-7 interrupt
btfss |
INTCON,RBIF |
; RBIF flag is interrupt |
goto |
notRBIF |
; Go if not RBIF origin |
; Save context |
||
movwf |
old_w |
; Save w register |
swapf |
STATUS,w ; STATUS to w |
|
movwf |
old_STATUS |
; Save STATUS |
;=========================
;interrupt action ;=========================
;The interrupt occurs when any of Port-B bits 4 to 7
;have changed STATUS.
movf |
PORTB,w |
; Read Port-B bits |
|
movwf |
temp |
; Save reading |
|
xorwf |
bitsB47,f |
; |
Xor with old bits, |
; |
result in f |
||
; Test each meaningful bit (4 and 7 in this example)
btfsc |
bitsB47,4 |
; Test bit 4 |
goto |
bit4Chng ; Routine for changed bit 4 |
|
; At this point bit 4 did not change |
||
btfsc |
bitsB47,7 |
; Test bit 7 |
goto |
bit7Chng ; Routine for changed bit 7 |
|
; Invalid port line change. Exit |
||
goto |
pbRelease |
|
;======================== |
||
;bit 4 change routine ;========================
;Check for signal falling edge, ignore if not bit4Chng:
btfsc |
PORTB,4 |
; Is bit |
4 high |
goto |
pbRelease |
; Bit is |
high. Ignore |
; Toggling bit 1 of Port-A turns LED on and off |
|||
movlw |
b’00000010’ |
; Xoring |
with a 1-bit produces |
; the complement |
|||
xorwf |
PORTA,f |
; Complement bit 1, Port-A |
|
goto |
pbRelease |
||
Interrupts |
239 |
;========================
;bit 7 change routine ;========================
;Check for signal falling edge, ignore if not bit7Chng:
btfsc |
PORTB,7 |
; Is bit 7 high |
goto |
exitISR |
; Bit is high. Ignore |
; Toggling bit 0 of Port-A turns LED on and off |
||
movlw |
b’00000001’ |
; Xoring with a 1-bit produces |
; the complement |
||
xorwf |
PORTA,f |
; Complement bit 1, Port-A |
; |
||
pbRelease: |
||
call |
delay |
; Debounce switch |
movf |
PORTB,w |
; Read port-B into w |
andlw |
b’10010000’ ; Eliminate unused bits |
|
btfsc |
STATUS,Z ; Check for zero |
|
goto |
pbRelease |
; Wait |
;At this point all port-B pushbuttons are released ;=========================
;exit ISR
;========================= |
||
exitISR: |
||
; Store new value of port-B |
||
movf |
temp,w |
; This port-B value to w |
movwf |
bitsB47 |
; Store |
; Restore context |
||
swapf |
old_STATUS,w |
; Saved STATUS to w |
movfw |
STATUS |
; To STATUS register |
swapf |
old_w,f |
; Swap file register in itself |
swapf |
old_w,w |
; re-swap back to w |
; Reset,interrupt |
||
notRBIF: |
||
bcf |
INTCON,RBIF |
; Clear INTCON bit 0 |
retfie |
||
;=======================
;Procedure to delay
;10 machine cycles ;======================= delay:
movlw |
D’6’ |
; Repeat 18 machine cycles |
movwf |
count1 |
; Store value in counter |
repeat: |
||
decfsz |
count1,f |
; Decrement counter |
goto |
repeat |
; Continue if not 0 |
return |
;=============================
240 |
Chapter 11 |
;long delay sub-routine
;(for debugging) ;============================= long_delay
movlw |
D’200’ |
; w = 200 decimal |
movwf |
J |
; J = w |
jloop: |
||
movwf |
K |
; K = w |
kloop: |
||
decfsz |
K,f |
; K = K-1, skip next if zero |
goto |
kloop |
|
decfsz |
J,f |
; J = J-1, skip next if zero |
goto |
jloop |
|
return |
||
end |