Låssystem med Ibutton
Låssystem med Ibutton
Blev just klar med mitt låssystem. Bilder och kod kommer här
Liten förklaring av vad den gör:
När en ibutton förs till läsaren läser Picen av serienummret i den för att sedan jämföra med det programmerade. (nästa version av koden kommer kunna hantera fler nycklar)
Om det var rätt nyckel tänds leden i proben ca 10 sekunder och under tiden dras ett ben högt på picen. förutom den utgången finns en som togglas vid rätt nyckel och en som förblir hög ända till reset. Bland dessa tre utgångar väljs en med en jumper, den ska sen kopplas till ett relä. Om man har fel ibutton blinkar leden i proben ca 3 sekunder.
Bilder:
http://gusvo085.mine.nu/ibutton/page_01.htm
Uppdatering:
Är nu typ klar, det enda som återstår är att byta glättningskondensatorn till en större så kan jag även köra på växelström, 12 volt. vid ett eventuellt strömavbrott går ett batteri in så att det går att öppna även då. Den drar inte mycket ström i viloläge, alltså då den väntar på en nyckel, drar den 17mA, de mesta till lysdioden som visar att den är på. som mest drar den ca 30mA, vilket går att minska till under 10 om man kopplar bort alla LED. Vid nätström drar den lite mer då det finns en diod till som visar att nätet är inkopplat.
Koden här nedan klarar av att läsa 2 olika nycklar, lite primitiv är den det skulle gå att göra snyggare med indirektadressering och en lookup-tabell för godkända serials men det fick jag inte att funka.
Det finns även en pcb-layout ( final.brd) i samma mapp som bilderna, den är inte samma som jag använt utan en förbättring.
sockerbiten till vänster på bilderna är anslutningen som sluts då nyckeln är OK och den till höger är för ström in.
Jag har inte skrivit vad det är för komponenter på pcb-layouten men det är bara fråga om någon undrar.
koden:
Ny kod, som inte ska bugga så mycket.
Observera att den bara gör ett försök att läsa nyckeln, så den dissar godkändanycklar ibland, men det är bara att föröka igen. en annan sak om ibutton, den sänder alltid lsb först, om man inte observerar det så blir det fel. (körde fast rejält på det)
Det finns 2 olika versioner på hemsidan, en ibutton.asm och en test.asm enda skillanden är att test.asm klarar 2 nycklar.
; LÄSA IBUTTON MED PIC
;Glöm ej pull up på pinne 7!
processor 12F629
#include <p12F629.inc>
; SKRIVET FÖR 4MhZ
__CONFIG _WDT_OFF & _INTRC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON
;---------------------------------------------------------
; Assign the TRISIO and Constants
constant DQ=0 ; Use GPIO 0, BEN 7 ALLTSÅ TILL 1-WIRE
constant LED=1 ; För att tända leden i läsaren tänds ca 10 sekunder vid ok
constant TOGGLA=2 ; Togglar en bit vid ok nyckel
constant DRA=4 ; drar en bit tills mclr
constant DRAKORT=5 ; Drar en bit ca 10 sekunder
constant READROM=0x0F
constant PEKARE=0x40
;---------------------------------------------------------
; These constants are used throughout the code
cblock 0x20
IOBYTE
TMP0 ; Address 0x23
COUNT ; Keep track of bits
PDBYTE ; Presence Detect Pulse
LOOP1
LOOP2
LOOP3
BYTE1 ; Variabler att spara läst serial i!
BYTE2
BYTE3
BYTE4
BYTE5
BYTE6
BYTE7
BYTE8
TOGGEL_TEST ; variabel för att hålla koll på toggelläge
endc
; Set the program origin for subsequent code.
org 0x00
GOTO SETUP
NOP
NOP
NOP
GOTO INTERRUPT ; PC 0x04...INTERRUPT VECTOR!
;---------------------------------------------------------
INTERRUPT
SLEEP
;---------------------------------------------------------
; Option Register bits
; ____
; RBPU,INTEDG,TOCS,TOSE,PSA,PS2,PS1,PS0
; 7=TRISIO Pullup Enable, 6=Interrupt Edge Select, 5=TMR0 Source,
; 4=TMR0 Source Edge, 3=Prescaler Assign, 2-0=Prescaler Rate Select
; 11010111
; TRISIO pullups disabled,rising edge,internal,hightolow,TMR0,1:256
SETUP
BSF STATUS,RP0 ; Select Bank 1 of data memory
MOVLW 0xD7
MOVWF OPTION_REG
CALL 3FFh
MOVWF OSCCAL
BCF STATUS,RP0 ; Select Bank 0 of data memory
;---------------------------------------------------------
BCF INTCON,7 ; STÄNGER AV INTERRUPT
;---------------------------------------------------------
MOVLW 07h
MOVWF CMCON ; Stänger av komparatorer för analoga signaler
BSF STATUS,RP0 ; Select Bank 1
BCF TRISIO,LED ; SÄTTER IN OCH UTGÅNGAR
BCF TRISIO,TOGGLA
BCF TRISIO,DRA
BCF TRISIO,DRAKORT
BSF TRISIO,3
BCF STATUS,RP0 ; Select Bank 0 of data memory
BCF GPIO,LED ; SÄTTER LÅGT VID START // NÖDVÄNDIGT?
BCF GPIO,TOGGLA
BCF GPIO,DRA
BCF GPIO,DRAKORT ; sätter hög detta är en felsöknings sak
CLRF TOGGEL_TEST
GOTO START
; *******************************************************
; Dallas Semiconductor 1-Wire MACROS
; *******************************************************
OW_HIZ MACRO
BSF STATUS,RP0 ; Select Bank 1 of data memory
BSF TRISIO, DQ ; Make DQ pin High Z /Ingång
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
OW_LO MACRO
BCF STATUS,RP0 ; Select Bank 0 of data memory
BCF GPIO, DQ ; Clear the DQ bit /Sätt pinne låg
BSF STATUS,RP0 ; Select Bank 1 of data memory
BCF TRISIO, DQ ; Make DQ pin an output
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
WAIT MACRO TIME
;Delay for TIME u s.
;Variable time must be in multiples of 5u s.
MOVLW (TIME/5)-1 ;1u s
MOVWF TMP0 ;1u s
CALL WAIT5U ;2u s
ENDM
; *******************************************************
; Dallas Semiconductor 1-Wire ROUTINES
; *******************************************************
WAIT5U
;This takes 5uS to complete
NOP ;1u s
NOP ;1u s
DECFSZ TMP0,F ;1u s or 2u s
GOTO WAIT5U ;2u s
RETLW 0 ;2u s
; --------------------------------------------------------
WAITLONG MACRO ; VÄNTA TIO SEKUNDER, NU GÅR DET INTE ATT GÖRA NÅGOT ANNAT
MOVLW H'27'
MOVWF LOOP2
STOR
DECFSZ LOOP2,F
GOTO HOPPA
GOTO SLUT
HOPPA
MOVLW H'FF'
MOVWF LOOP1
LITEN
WAIT .1000
DECFSZ LOOP1,F
GOTO LITEN
GOTO STOR
SLUT
ENDM
;------------------------------------------------------------
; FÖR ATT KUNNA BLINKA VID FEL IBUTTON
WAITSHORT MACRO
LOCAL JUMP, KORT, STOPP
MOVLW H'FF'
MOVWF LOOP1
MOVWF LOOP2
JUMP
MOVLW H'FF'
MOVWF LOOP1
DECFSZ LOOP2,F
GOTO KORT
GOTO STOPP
KORT
WAIT .1000
DECFSZ LOOP1,F
GOTO JUMP
GOTO KORT
STOPP
ENDM
;-------------------------------------------------------
OW_RESET
OW_HIZ ; Start with the line high
CLRF PDBYTE ; Clear the PD byte
OW_LO
WAIT .500 ; Drive Low for 500u s
OW_HIZ
WAIT .70 ; Release line and wait 70u s for PD Pulse
BTFSS GPIO,DQ ; Read for a PD Pulse
INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse?App Note 2420: 1-Wire Communication with a Microchip PICmicro Microcontroller
WAIT .400 ; Wait 400u s after PD Pulse
RETLW 0
; --------------------------------------------------------
DSRXBYTE ; Byte read is stored in IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSRXLP ; KÖR PÅ TILLS VI HAR EN BYTE
OW_LO
NOP
NOP
NOP
NOP
NOP
NOP ; Bring DQ low for 6u s
OW_HIZ
NOP
NOP
NOP
NOP ; Change to HiZ and Wait 4u s
MOVF GPIO,W ; Read DQ
ANDLW 1<<DQ ; Mask off the DQ bit
ADDLW .255 ; C=1 if DQ=1: C=0 if DQ=0
RRF IOBYTE,F ; Shift C into IOBYTE
WAIT .50 ; Wait 50u s to end of time slot
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSRXLP
RETLW 0
; --------------------------------------------------------
DSTXBYTE ; Byte to send starts in W
MOVWF IOBYTE ; We send it from IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSTXLP ; SÄNDER ALLA 8 BITARNA
OW_LO
NOP
NOP
NOP
NOP
NOP ; Drive the line low for 5u s
RRF IOBYTE,F ; The data byte
BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0
BSF GPIO,DQ ; Drive the line high if LSB is 1
WAIT .60 ; Continue driving line for 60u s
OW_HIZ ; Release the line for pullup
NOP
NOP ; Recovery time of 2u s
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSTXLP
RETLW 0
;---------------------------------------------------------
START
;---------------------------------------------------------
GET_SERIAL
CALL OW_RESET ; Send Reset Pulse and read for Presence Detect Pulse
BTFSS PDBYTE,0 ; 1 = Presence Detect Detected
GOTO START
MOVLW READROM
CALL DSTXBYTE ; Send Read ROM Command (0x0F)
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE1 ; sparar family code
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE2 ; sparar lsb i serial
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE3
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE4
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE5
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE6
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE7 ; sparar msb i serial
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE8 ; sparar crc code
GOTO KVAR
;-------------------------------------------------------------
; håller tills ibuttonen tas bort från proben
KVAR
CALL OW_RESET
BTFSC PDBYTE,0 ; VÄNTAR TILLS IBUTTONEN ÄR BORTA
GOTO KVAR
; Nu ska serialen kollas,
MOVF BYTE1,W ;Läser tillbaka family code
SUBLW H'01' ; FAMILY CODE
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE2,W
SUBLW H'A2' ; SERIAL lsb
BTFSS STATUS,Z
GOTO ANNAN_NYCKEL
MOVF BYTE3,W
SUBLW H'8B' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE4,W
SUBLW H'0C' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE5,W
SUBLW H'0A' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE6,W
SUBLW H'00' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE7,W
SUBLW H'00' ;SERIAL msb
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE8,W
SUBLW H'CC' ;CRC
BTFSS STATUS,Z
GOTO FEL_NYCKEL
GOTO NYCKEL_OK
ANNAN_NYCKEL
MOVF BYTE2,W
SUBLW H'CC' ; SERIAL lsb
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE3,W
SUBLW H'EB' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE4,W
SUBLW H'A4' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE5,W
SUBLW H'0A' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE6,W
SUBLW H'00' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE7,W
SUBLW H'00' ;SERIAL msb
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE8,W
SUBLW H'B8' ;CRC
BTFSS STATUS,Z
GOTO FEL_NYCKEL
GOTO NYCKEL_OK
NYCKEL_OK ; det var en ok nyckel
BTFSS TOGGEL_TEST,0 ; börjar med att toggla toggel utgången
GOTO SET_UT
BCF TOGGEL_TEST,0
BCF GPIO,TOGGLA
GOTO KLAR
SET_UT
BSF TOGGEL_TEST,0
BSF GPIO,TOGGLA
KLAR ; klar med togglandet
BSF GPIO,DRA ; drar en utgång som kommer att vara dragen till vi startar om
BSF GPIO,LED ; tänder leden i proben i tio sekunder
BSF GPIO,DRAKORT
WAITLONG ; väntar ca 10 sekudner
BCF GPIO,LED ; sen används även som en kort "upplåsning"
BCF GPIO,DRAKORT
GOTO START
FEL_NYCKEL
; BLINKAR KNAPPT 4 SEKUNDER
MOVLW H'0F'
MOVWF LOOP3
FELBLINK
BSF GPIO,LED
WAITSHORT
BCF GPIO,LED
WAITSHORT
DECFSZ LOOP3,F
GOTO FELBLINK
GOTO START
END
Den finns även på http://gusvo085.mine.nu/ibutton men man vet aldrig hur länge den finns kvar där, så det var lika bra att lägga den här oxå.
Liten förklaring av vad den gör:
När en ibutton förs till läsaren läser Picen av serienummret i den för att sedan jämföra med det programmerade. (nästa version av koden kommer kunna hantera fler nycklar)
Om det var rätt nyckel tänds leden i proben ca 10 sekunder och under tiden dras ett ben högt på picen. förutom den utgången finns en som togglas vid rätt nyckel och en som förblir hög ända till reset. Bland dessa tre utgångar väljs en med en jumper, den ska sen kopplas till ett relä. Om man har fel ibutton blinkar leden i proben ca 3 sekunder.
Bilder:
http://gusvo085.mine.nu/ibutton/page_01.htm
Uppdatering:
Är nu typ klar, det enda som återstår är att byta glättningskondensatorn till en större så kan jag även köra på växelström, 12 volt. vid ett eventuellt strömavbrott går ett batteri in så att det går att öppna även då. Den drar inte mycket ström i viloläge, alltså då den väntar på en nyckel, drar den 17mA, de mesta till lysdioden som visar att den är på. som mest drar den ca 30mA, vilket går att minska till under 10 om man kopplar bort alla LED. Vid nätström drar den lite mer då det finns en diod till som visar att nätet är inkopplat.
Koden här nedan klarar av att läsa 2 olika nycklar, lite primitiv är den det skulle gå att göra snyggare med indirektadressering och en lookup-tabell för godkända serials men det fick jag inte att funka.
Det finns även en pcb-layout ( final.brd) i samma mapp som bilderna, den är inte samma som jag använt utan en förbättring.
sockerbiten till vänster på bilderna är anslutningen som sluts då nyckeln är OK och den till höger är för ström in.
Jag har inte skrivit vad det är för komponenter på pcb-layouten men det är bara fråga om någon undrar.
koden:
Ny kod, som inte ska bugga så mycket.
Observera att den bara gör ett försök att läsa nyckeln, så den dissar godkändanycklar ibland, men det är bara att föröka igen. en annan sak om ibutton, den sänder alltid lsb först, om man inte observerar det så blir det fel. (körde fast rejält på det)
Det finns 2 olika versioner på hemsidan, en ibutton.asm och en test.asm enda skillanden är att test.asm klarar 2 nycklar.
; LÄSA IBUTTON MED PIC
;Glöm ej pull up på pinne 7!
processor 12F629
#include <p12F629.inc>
; SKRIVET FÖR 4MhZ
__CONFIG _WDT_OFF & _INTRC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON
;---------------------------------------------------------
; Assign the TRISIO and Constants
constant DQ=0 ; Use GPIO 0, BEN 7 ALLTSÅ TILL 1-WIRE
constant LED=1 ; För att tända leden i läsaren tänds ca 10 sekunder vid ok
constant TOGGLA=2 ; Togglar en bit vid ok nyckel
constant DRA=4 ; drar en bit tills mclr
constant DRAKORT=5 ; Drar en bit ca 10 sekunder
constant READROM=0x0F
constant PEKARE=0x40
;---------------------------------------------------------
; These constants are used throughout the code
cblock 0x20
IOBYTE
TMP0 ; Address 0x23
COUNT ; Keep track of bits
PDBYTE ; Presence Detect Pulse
LOOP1
LOOP2
LOOP3
BYTE1 ; Variabler att spara läst serial i!
BYTE2
BYTE3
BYTE4
BYTE5
BYTE6
BYTE7
BYTE8
TOGGEL_TEST ; variabel för att hålla koll på toggelläge
endc
; Set the program origin for subsequent code.
org 0x00
GOTO SETUP
NOP
NOP
NOP
GOTO INTERRUPT ; PC 0x04...INTERRUPT VECTOR!
;---------------------------------------------------------
INTERRUPT
SLEEP
;---------------------------------------------------------
; Option Register bits
; ____
; RBPU,INTEDG,TOCS,TOSE,PSA,PS2,PS1,PS0
; 7=TRISIO Pullup Enable, 6=Interrupt Edge Select, 5=TMR0 Source,
; 4=TMR0 Source Edge, 3=Prescaler Assign, 2-0=Prescaler Rate Select
; 11010111
; TRISIO pullups disabled,rising edge,internal,hightolow,TMR0,1:256
SETUP
BSF STATUS,RP0 ; Select Bank 1 of data memory
MOVLW 0xD7
MOVWF OPTION_REG
CALL 3FFh
MOVWF OSCCAL
BCF STATUS,RP0 ; Select Bank 0 of data memory
;---------------------------------------------------------
BCF INTCON,7 ; STÄNGER AV INTERRUPT
;---------------------------------------------------------
MOVLW 07h
MOVWF CMCON ; Stänger av komparatorer för analoga signaler
BSF STATUS,RP0 ; Select Bank 1
BCF TRISIO,LED ; SÄTTER IN OCH UTGÅNGAR
BCF TRISIO,TOGGLA
BCF TRISIO,DRA
BCF TRISIO,DRAKORT
BSF TRISIO,3
BCF STATUS,RP0 ; Select Bank 0 of data memory
BCF GPIO,LED ; SÄTTER LÅGT VID START // NÖDVÄNDIGT?
BCF GPIO,TOGGLA
BCF GPIO,DRA
BCF GPIO,DRAKORT ; sätter hög detta är en felsöknings sak
CLRF TOGGEL_TEST
GOTO START
; *******************************************************
; Dallas Semiconductor 1-Wire MACROS
; *******************************************************
OW_HIZ MACRO
BSF STATUS,RP0 ; Select Bank 1 of data memory
BSF TRISIO, DQ ; Make DQ pin High Z /Ingång
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
OW_LO MACRO
BCF STATUS,RP0 ; Select Bank 0 of data memory
BCF GPIO, DQ ; Clear the DQ bit /Sätt pinne låg
BSF STATUS,RP0 ; Select Bank 1 of data memory
BCF TRISIO, DQ ; Make DQ pin an output
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
WAIT MACRO TIME
;Delay for TIME u s.
;Variable time must be in multiples of 5u s.
MOVLW (TIME/5)-1 ;1u s
MOVWF TMP0 ;1u s
CALL WAIT5U ;2u s
ENDM
; *******************************************************
; Dallas Semiconductor 1-Wire ROUTINES
; *******************************************************
WAIT5U
;This takes 5uS to complete
NOP ;1u s
NOP ;1u s
DECFSZ TMP0,F ;1u s or 2u s
GOTO WAIT5U ;2u s
RETLW 0 ;2u s
; --------------------------------------------------------
WAITLONG MACRO ; VÄNTA TIO SEKUNDER, NU GÅR DET INTE ATT GÖRA NÅGOT ANNAT
MOVLW H'27'
MOVWF LOOP2
STOR
DECFSZ LOOP2,F
GOTO HOPPA
GOTO SLUT
HOPPA
MOVLW H'FF'
MOVWF LOOP1
LITEN
WAIT .1000
DECFSZ LOOP1,F
GOTO LITEN
GOTO STOR
SLUT
ENDM
;------------------------------------------------------------
; FÖR ATT KUNNA BLINKA VID FEL IBUTTON
WAITSHORT MACRO
LOCAL JUMP, KORT, STOPP
MOVLW H'FF'
MOVWF LOOP1
MOVWF LOOP2
JUMP
MOVLW H'FF'
MOVWF LOOP1
DECFSZ LOOP2,F
GOTO KORT
GOTO STOPP
KORT
WAIT .1000
DECFSZ LOOP1,F
GOTO JUMP
GOTO KORT
STOPP
ENDM
;-------------------------------------------------------
OW_RESET
OW_HIZ ; Start with the line high
CLRF PDBYTE ; Clear the PD byte
OW_LO
WAIT .500 ; Drive Low for 500u s
OW_HIZ
WAIT .70 ; Release line and wait 70u s for PD Pulse
BTFSS GPIO,DQ ; Read for a PD Pulse
INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse?App Note 2420: 1-Wire Communication with a Microchip PICmicro Microcontroller
WAIT .400 ; Wait 400u s after PD Pulse
RETLW 0
; --------------------------------------------------------
DSRXBYTE ; Byte read is stored in IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSRXLP ; KÖR PÅ TILLS VI HAR EN BYTE
OW_LO
NOP
NOP
NOP
NOP
NOP
NOP ; Bring DQ low for 6u s
OW_HIZ
NOP
NOP
NOP
NOP ; Change to HiZ and Wait 4u s
MOVF GPIO,W ; Read DQ
ANDLW 1<<DQ ; Mask off the DQ bit
ADDLW .255 ; C=1 if DQ=1: C=0 if DQ=0
RRF IOBYTE,F ; Shift C into IOBYTE
WAIT .50 ; Wait 50u s to end of time slot
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSRXLP
RETLW 0
; --------------------------------------------------------
DSTXBYTE ; Byte to send starts in W
MOVWF IOBYTE ; We send it from IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSTXLP ; SÄNDER ALLA 8 BITARNA
OW_LO
NOP
NOP
NOP
NOP
NOP ; Drive the line low for 5u s
RRF IOBYTE,F ; The data byte
BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0
BSF GPIO,DQ ; Drive the line high if LSB is 1
WAIT .60 ; Continue driving line for 60u s
OW_HIZ ; Release the line for pullup
NOP
NOP ; Recovery time of 2u s
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSTXLP
RETLW 0
;---------------------------------------------------------
START
;---------------------------------------------------------
GET_SERIAL
CALL OW_RESET ; Send Reset Pulse and read for Presence Detect Pulse
BTFSS PDBYTE,0 ; 1 = Presence Detect Detected
GOTO START
MOVLW READROM
CALL DSTXBYTE ; Send Read ROM Command (0x0F)
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE1 ; sparar family code
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE2 ; sparar lsb i serial
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE3
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE4
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE5
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE6
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE7 ; sparar msb i serial
CALL DSRXBYTE
MOVF IOBYTE,W
MOVWF BYTE8 ; sparar crc code
GOTO KVAR
;-------------------------------------------------------------
; håller tills ibuttonen tas bort från proben
KVAR
CALL OW_RESET
BTFSC PDBYTE,0 ; VÄNTAR TILLS IBUTTONEN ÄR BORTA
GOTO KVAR
; Nu ska serialen kollas,
MOVF BYTE1,W ;Läser tillbaka family code
SUBLW H'01' ; FAMILY CODE
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE2,W
SUBLW H'A2' ; SERIAL lsb
BTFSS STATUS,Z
GOTO ANNAN_NYCKEL
MOVF BYTE3,W
SUBLW H'8B' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE4,W
SUBLW H'0C' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE5,W
SUBLW H'0A' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE6,W
SUBLW H'00' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE7,W
SUBLW H'00' ;SERIAL msb
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE8,W
SUBLW H'CC' ;CRC
BTFSS STATUS,Z
GOTO FEL_NYCKEL
GOTO NYCKEL_OK
ANNAN_NYCKEL
MOVF BYTE2,W
SUBLW H'CC' ; SERIAL lsb
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE3,W
SUBLW H'EB' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE4,W
SUBLW H'A4' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE5,W
SUBLW H'0A' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE6,W
SUBLW H'00' ;SERIAL
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE7,W
SUBLW H'00' ;SERIAL msb
BTFSS STATUS,Z
GOTO FEL_NYCKEL
MOVF BYTE8,W
SUBLW H'B8' ;CRC
BTFSS STATUS,Z
GOTO FEL_NYCKEL
GOTO NYCKEL_OK
NYCKEL_OK ; det var en ok nyckel
BTFSS TOGGEL_TEST,0 ; börjar med att toggla toggel utgången
GOTO SET_UT
BCF TOGGEL_TEST,0
BCF GPIO,TOGGLA
GOTO KLAR
SET_UT
BSF TOGGEL_TEST,0
BSF GPIO,TOGGLA
KLAR ; klar med togglandet
BSF GPIO,DRA ; drar en utgång som kommer att vara dragen till vi startar om
BSF GPIO,LED ; tänder leden i proben i tio sekunder
BSF GPIO,DRAKORT
WAITLONG ; väntar ca 10 sekudner
BCF GPIO,LED ; sen används även som en kort "upplåsning"
BCF GPIO,DRAKORT
GOTO START
FEL_NYCKEL
; BLINKAR KNAPPT 4 SEKUNDER
MOVLW H'0F'
MOVWF LOOP3
FELBLINK
BSF GPIO,LED
WAITSHORT
BCF GPIO,LED
WAITSHORT
DECFSZ LOOP3,F
GOTO FELBLINK
GOTO START
END
Den finns även på http://gusvo085.mine.nu/ibutton men man vet aldrig hur länge den finns kvar där, så det var lika bra att lägga den här oxå.
Senast redigerad av gvs 4 mars 2004, 19:51:14, redigerad totalt 1 gång.
-
- Inlägg: 700
- Blev medlem: 23 augusti 2003, 20:42:38