Сб авг 12, 2017 18:39:49
list p=12f675
#include <p12f675.inc>
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDTE_OFF & _INTRC_OSC_NOCLKOUT
W equ 0
F equ 1
varT equ 20h
varTMR0_1 equ 21h
W_temp equ 22h
STATUS_temp equ 23h
TMR0_time equ 24h
time_on_TMR0 equ 25h
START_FLAG equ 26h
org 0x0000
goto INIT
;...................................................
;...................................................
org 0x0004
movwf W_temp ;saving key register values
swapf STATUS,W
clrf STATUS
movwf STATUS_temp
;interrupt actions
bcf STATUS,RP0
btfsc GPIO,1 ;LOW lvl on GPIO.1
goto What_time_on_TMR0 ;NO => HIGH lvl => it was LOW lvl => end of pressed
;YES => it was HIGH lvl => START of pressed
clrf TMR0
clrf START_FLAG
goto escape
What_time_on_TMR0
MOVF TMR0,W
MOVWF time_on_TMR0
clrf TMR0
bcf INTCON,GPIF
MOVWF START_FLAG
goto escape
escape swapf STATUS_temp,W
movwf STATUS
swapf W_temp,F
swapf W_temp,W
retfie
;...................................................
;...................................................
;===INIT=========
INIT
bsf STATUS,RP0
MOVLW b'11111111'
MOVWF TRISIO ;all ports as inputs
;==SET GP<5:0> to Digital IO
bcf STATUS,RP0;BANK 0
clrf GPIO ;LOW lvl http://avr.ru/beginer/understand/1wire ????????..... so to press data bus DO GPIO.1 as OUTPUT!!!
MOVLW H'1f' ;Set GP<5:0> to
MOVWF CMCON ;digital IO
bsf GPIO,0
bsf STATUS,RP0;BANK 1
CLRF ANSEL ;Digital I/O
bsf STATUS,RP0
MOVLW b'11111110'
MOVWF TRISIO ;all ports as inputs. GP0 as output
bsf TRISIO,0
;==
bsf INTCON,T0IF
bcf INTCON,T0IE
bcf INTCON,GIE
;
banksel OPTION_REG
MOVLW b'11010000' ; ~, ~, CLKOUT, ~, TMR0, prescaller 2
MOVWF OPTION_REG
BCF STATUS,RP0
clrf START_FLAG
;==Initializing CHANGE INTERRUPT
;enable change interrupt on GPIO.1
MOVLW b'00000010'
bsf STATUS,RP0
MOVWF IOC
;==clr change interrupt flug
bcf INTCON,GPIF
;==enable Change interrut
bsf INTCON,GPIE
;====Initializing CHANGE INTERRUPT END
goto main
;==========
;============
main bcf STATUS,RP0
MOVF GPIO,w ;reading GPIO
wait_interrupt
;MOVF GPIO,w
MOVF START_FLAG,F
btfsc STATUS,3 ;Z=0? flag <> 0 ?
goto wait_interrupt ;Z=1, flag = 0
;Z=0, flag <> 0
MOVF time_on_TMR0,W
MOVWF EEDATA
MOVLW 00h
MOVWF EEADR
BSF STATUS,RP0 ;Bank 1
BSF EECON1,WREN ;Enable write
BCF INTCON,GIE ;Disable INTs
MOVLW 55h ;Unlock write
MOVWF EECON2 ;
MOVLW H'AA' ;
MOVWF EECON2 ;
BSF EECON1,WR ;Start the write
BSF INTCON,GIE ;Enable INTS
goto main
end
Вс авг 13, 2017 00:46:39
Вс авг 13, 2017 10:38:02
The user, in the Interrupt Service Routine, can clear the interrupt in the following manner:
a) Any read or write of GPIO. This will end the mismatch condition.
b) Clear the flag bit GPIF.
A mismatch condition will continue to set flag bit GPIF. Reading GPIO will end the mismatch condition and allow flag bit GPIF to be cleared.
Вс авг 13, 2017 11:09:08
Вс авг 13, 2017 13:29:15
Вт авг 22, 2017 14:49:39
Вт авг 22, 2017 17:34:03
Ср авг 23, 2017 06:53:03