Låssystem med Ibutton

Berätta om dina pågående projekt.
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Låssystem med Ibutton

Inlägg av gvs »

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å.
Senast redigerad av gvs 4 mars 2004, 19:51:14, redigerad totalt 1 gång.
psyko_m
Inlägg: 100
Blev medlem: 6 november 2003, 09:42:09
Ort: Borlänge

snyggt!

Inlägg av psyko_m »

satt precis och funderade vad jag skulle göra med min ibutton :)
nu vet jag!
har du nå kopplingchema och pcb layout?
hur vet man vilket serial ibutton knappen har så man kan lägga in den i koden?
Användarvisningsbild
Perrx
Inlägg: 176
Blev medlem: 15 december 2003, 21:43:41
Ort: Göteborg
Kontakt:

Inlägg av Perrx »

Riktigt coolt! :D
Var har ni köpt era ibutton och vad kostade dom?
psyko_m
Inlägg: 100
Blev medlem: 6 november 2003, 09:42:09
Ort: Borlänge

här

Inlägg av psyko_m »

http://www.ibutton.com/
klicka på samples för gratis prov
Användarvisningsbild
Perrx
Inlägg: 176
Blev medlem: 15 december 2003, 21:43:41
Ort: Göteborg
Kontakt:

Inlägg av Perrx »

Dessa samples finns ju överallt! :D
Tackar!
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Inlägg av gvs »

Serialen står på den tänk på att det står baklänges, det var det jag fastnade på....
koden som ligger här ovan är lite buggig ska byta den om nån dag ( glömde koden på datorn i labbet) mot en som funkar bättre, då kommer även en pcb-layout.
psyko_m
Inlägg: 100
Blev medlem: 6 november 2003, 09:42:09
Ort: Borlänge

tack gvs

Inlägg av psyko_m »

låter hur bra som helst det här!
måste provas!
men jag väntar till den andra koden kommer och pcb layouten
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Absolut coolast vore att ha en bygel på kortet som när den är byglad så lär sig systemet vilka buttons som är godkännda genom att man stoppar i dom en efter en. Sedan när man tar bort bygel så är det bara som dom den har lärt sig som fungerar.
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Inlägg av gvs »

Jo visst. hur gör man det?
Robert Nielsen
Inlägg: 700
Blev medlem: 23 augusti 2003, 20:42:38

Inlägg av Robert Nielsen »

Jag röstar på matsengs förslag. Plus att man kan återställa med en bygel (radera redan inlagda nycklar.)
danei
EF Sponsor
Inlägg: 26419
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Bara att spara ner numrena i program-minnet eller eeprom om man har det.
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Inlägg av gvs »

Jo men jag vet ej hur man gör det, men det är bara att utveckla koden...
danei
EF Sponsor
Inlägg: 26419
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Det står i databladet. Men det är en utmaning att få det att funka. Försökte att skriva till eeprom i en 16F877 i går och i dag men det vill inte fungera. Har testat både i C och asembler. Har lyckats skriva till program-minnet tidigare så det kanske är läge att återvinna den koden.
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Inlägg av gvs »

Man vill ju gärna ha kvar minnet om strömmen skulle gå...
danei
EF Sponsor
Inlägg: 26419
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Det får man om man lägger det i eeprom eller program minnet.
Skriv svar