K L Transmitter Shell Using PIC12F6XX: EE OQ ®
K L Transmitter Shell Using PIC12F6XX: EE OQ ®
VDD 1 8 VSS
PIC12F6XX
S0 2 7 NC Is Button No
Released?
S1(1) 3 6 RFOUT
Yes
S2(1) 4 5 NC
Note 1: This implementation uses a Hopping Code
lookup table instead of the KEELOQ®
Note 1: Only S0 is implemented in this encryption algorithm for producing a KEELOQ
application note. hopping code transmission. Please contact
your local Microchip sales office for details on
licensing the KEELOQ encryption algorithm.
LOGIC ‘1’
Bit
Period
Repeat VLOW Button Serial Number Button OVR DISC Sync Counter
(1-bit) (1-bit) Status (28 bits) Status (2 bits) (10 bits) (16 bits)
S2 S1 S0 S3 S2 S1 S0 S3
MSb LSb
66 Data bits
Transmitted
LSb first.
Implementation Overview Before the function is called, the address of the data in
the EEPROM should be stored in EEADR. The byte
The transmitter shell implementation shows the device read from the EEPROM is returned in the W register
resources, device configuration setup, useful function after the call and EEADR is incremented.
calls, and memory maps. The device resources (see Reading 2 consecutive bytes from the EEPROM
Table 2) show the available program memory, RAM (address 8h and 9h) would be done as follows:
and EEPROM. As shown in Table 2, there are
adequate resources for the designer to implement
MOVLW 08H ;SETUP THE ADDRESS
additional features. For a more detailed description of
MOVWF EEADR
the RAM and EEPROM memory maps, see Table 5 CALL EEREAD ;READ THE FIRST BYTE
and Table 6. The recommended configuration setup for MOVWF BYTE1 ;STORE THE DATA IN BYTE1 IN
the PIC12F6XX is depicted in Table 4. For more details ;SRAM
on the configuration word of the PIC12F6XX, please CALL EEREAD ;READ THE SECOND BYTE
see the PIC12F6XX data sheet available on the MOVWF BYTE2 ;STORE THE DATA IN BYTE2 IN
Microchip website at: ;SRAM
www.microchip.com
EEPROM Write
The transmitter shell contains a 16-bit configuration
word similar to a HCS300. The two bits of the configu- Writing a byte to the EEPROM of the PIC® can be done
ration word that will be useful to the designer are bits 13 by calling EEWRITE. Before the call, the address to
and 14 that control the baud rate of the code hopping write to should be setup in EEADR, and the byte to
transmission output on the RFOUT pin (See Table 3). write to the EEPROM placed into the W register.
For a further explanation of the configuration word and EEADR is incremented after the byte has been written.
baud rates in KEELOQ-based encoders, please see the
Writing 01h and ABh to addresses 29h and 2Ah would
HCS300 data sheet available on the Microchip website
be done as follows:
at: www.microchip.com.
MOVLW 029H ; SETUP THE ADDRESS
Four functions will be useful to the user of the transmit- MOVWF EEADR
ter shell. Two of them are used to read data from and MOVLW 01H ; SETUP THE DATA TO WRITE
write data to the EEPROM on the PIC12F629. The CALL EEWRITE
other two are used to generate SEED and HOP MOVLW 0ABH ; SETUP THE DATA TO WRITE
transmissions and transmit them. CALL EEWRITE ; WRITE THE SECOND BYTE
Conclusion
This transmitter shell example shows a convenient way
to implement a low cost and low power capable custom
KEELOQ encoder. By utilizing the available code space
on board the PIC12F6XX, the developer has the
flexibility to add additional features.
ADDITIONAL INFORMATION
Microchip's Secure Data Products are covered by
some or all of the following: Code hopping encoder pat-
ents issued in European countries and U.S.A. Secure
learning patents issued in European countries, U.S.A.
and R.S.A.
LIST P=12F629,F=INHX8M,R=DEC
#include <p12f629.inc>
; ERRORLEVEL 0,-224,-305,-306
;Messages, Warnings and Errors Printed
;Ignore [224] => Use Of This Instruction is not recommended
;Ignore [305] => Using default dest of 1 file
;Ignore [306] => Crossing Page Boundary
__CONFIG _CP_ON & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_ON & _PWRTE_ON &
_INTRC_OSC_NOCLKOUT
; COUNTER REGISTERS
FUNC EQU ETMP4 ; BUTTON CODE & USER BIT FUNCTION BYTE
DISC EQU ETMP3 ; DISCRIMINATION VALUE
CNTR_HI EQU ETMP2 ; 16 BIT RX COUNTER
CNTR_LW EQU ETMP1
HOP_FUNC EQU 010H ; FUNCTION CODE TRANSMITTED DURING HOP CODE TRANSMSSIONS
SEED_FUNC EQU 0F0H ; FUNCTION CODE TRANSMITTED DURING SEED TRANSMISSIONS
;------------------------------------------------------------------------------------------------
; REGISTER BIT DEFINITIONS:
;------------------------------------------------------------------------------------------------
ORG 000H
CALL 0x3FF ; RETRIEVE FACTORY CALIBRATION VALUE
BANKSEL OSCCAL ; BANK 1
MOVWF OSCCAL ;
GOTO RESET ;
ORG 04H
GOTO MAIN
;---------------------------------------------------------------------------
;
; FUNCTION : GET_SEED ()
;
; DESCRIPTION : GET THE SEED FROM THE EEPROM AND PLACE IT IN CSR[0:3]
;---------------------------------------------------------------------------
GET_SEED
MOVLW SEED_ADR ; INITIALIZE EEADR WITH THE BASE ADDRESS OF THE SEED
BANKSEL EEADR ; BANK1
MOVWF EEADR
CALL EEREAD ; READ THE SEED
MOVWF CSR0
CALL EEREAD
;---------------------------------------------------------------------------
;
; FUNCTION: GET_KEY ()
;
; DESCRIPTION: GET THE ENCRYPTION FROM THE EEPROM AND PLACE IT IN KEY[0:3]
;---------------------------------------------------------------------------
GET_KEY
MOVLW KEY_ADR ; INITIALIZE EEADR WITH THE BASE ADDRESS OF THE SEED
BANKSEL EEADR ; BANK1
MOVWF EEADR
MOVLW (KEY0-1) ; INITIALIZE THE RAM POINTER
MOVWF FSR
GET_KEYLOOP
INCF FSR,F ; INCREMENT THE RAM POINTER
CALL EEREAD ; READ THE BYTE OF THE KEY
MOVWF INDF ; WRITE TO KEY POSITION IN RAM
;---------------------------------------------------------------------------
;
; FUNCTION: GET_SERIAL ()
;
; DESCRIPTION: GET THE 28 BIT SERIAL NUMBER FROM THE EEPROM AND PLACE IT
; IN CSR[4:7]
;
;---------------------------------------------------------------------------
GET_SERIAL
MOVLW SER_ADR ; INITIALIZE EEADR WITH THE SERIAL NUMBER BASE ADDRESS
BANKSEL EEADR ; BANK1
MOVWF EEADR
CALL EEREAD ; READ THE SERIAL NUMBER
MOVWF CSR4
CALL EEREAD
MOVWF CSR5
CALL EEREAD
MOVWF CSR6
CALL EEREAD
MOVWF CSR7
RETURN
;---------------------------------------------------------------------------
;
; FUNCTION: GET_COUNTER ()
;
; DESCRIPTION: GET, CHECK FOR ERRORS, UPDATE THE COUNTERS AND RETURN WITH
; : THE COUNTER IN CSR1:CSR0
;
;---------------------------------------------------------------------------
GET_COUNTER
MOVLW CNT_2 ; INITIALIZE EEADR WITH CNT_2'S BASE ADDRESS
CHECK_1_2
MOVLW CNT_1 ; UNITIALIZE EEADR WITH CNT_1'S BASE ADDRESS
BANKSEL EEADR ; BANK1
MOVWF EEADR
CNT2_FAULTY
MOVLW CNT_1 ; INITIALIZE EEADR WITH CNT_3'S ADDRESS, CNT_1 HAS ALREADY
BEEN UPDATED
; BUT WAS NEVER TRANSMITTED
BANKSEL EEADR ; BANK1
MOVWF EEADR
UPDATE_CNTRS
INCF ETMP1,F ; INCREMENT THE COUNTER
BTFSC STATUS,Z ; CHECK IF COUNTER HAS WRAPPED
INCF ETMP2,F ; INCREMENT IF COUNTER HAS WRAPPED
;---------------------------------------------------------------------------
;
; FUNCTION : GET_DISCR ()
;
; DESCRIPTION : GETS THE DISCRIMINATION VALUE FROM THE CONFIG BYTES AND
; : STORES THEM IN CSR3:2.
; : GETS NUMBER OF LOOPS FOR TE_DEL2 AND STORES IT IN TMP2
; : GETS THE NUMBER OF BLANK WORDS AND STORES THEM IN TMP3
;
;---------------------------------------------------------------------------
GET_DISCR
MOVLW CFG_ADR ; GET THE CONFIG WORDS ADDRESS...
BANKSEL EEADR ; BANK1
MOVWF EEADR
CALL EEREAD ; AND READ THE LSB OF THE CONFIG WORD
MOVWF CSR2
GET_TXSPEED
MOVLW (CFG_ADR+1) ; READ THE MSB OF THE CONFIG WORD
BANKSEL EEADR ; BANK1
MOVWF EEADR
CALL EEREAD
ANDLW 060H ; MASK OUT BSL[1:0]
BCF STATUS,C
MOVWF TMP2
RLF TMP2,F
RLF TMP2,F
RLF TMP2,F
RLF TMP2,W
TE_100US_QRTR
NOP ; BSL 2 AND 3 HAVE TE OF 100us
MOVLW 014H
MOVWF TMP2
MOVLW 03H ; TRANSMIT1, BLANK3
MOVWF TMP3
RETURN
TE_200US_QRTR
MOVLW 028H
MOVWF TMP2
MOVLW 03H
MOVWF TMP3 ; TRANSMIT 1, BLANK1
RETURN
TE_400US_ALL
MOVLW 050H
MOVWF TMP2
CLRF TMP3 ; TRANSMIT 1, BLANK0
RETURN
RESET
MOVLW 07H ; SETUP TMR0 PRESCALER
MOVWF OPTION_REG
BSF WPU,5 ; GP5 WEAK PULL UP ENABLED
BANKSEL GPIO ; BANK0
CLRF GPIO
MOVLW .7 ; COMPARATOR OFF
MOVWF CMCON
;---------------------------------------------------------------------------
; THIS IS WHERE THE ENCRYPTION ROUTINES ARE ADDED
;---------------------------------------------------------------------------
#INCLUDE "SENCRYPT.ASM" ; SHELL ENCRYPTION ROUTINE - TRANSMISSION LOOK UP TABLE
;; #INCLUDE "ENCRYPT.ASM" ; REAL ENCRYPTION ROUTINE
;---------------------------------------------------------------------------
;
; FUNCTION : EEWRITE ()
;
; DESCRIPTION : WRITE 8 BIT VALUE TO EEPROM
;
;---------------------------------------------------------------------------
EEWRITE
CLRWDT ; RESET WATCHDOG TIMER
BANKSEL EEDATA ; BANK1
MOVWF EEDATA ; STORE DATA
BSF EECON1,WREN ; EEPROM WRITE ENABLE
BCF INTCON,GIE ; DISABLE INT'S
MOVLW 055H ; WRITE 55H
MOVWF EECON2
MOVLW 0AAH ; WRITE AAH
MOVWF EECON2
BSF EECON1,WR ; BEGIN WRITE BY SETTING WR BIT
EEWRITE2
BTFSC EECON1,WR ; WAIT FOR EEPROM WRITE COMPLETE
GOTO EEWRITE2
BSF INTCON,GIE ; ENABLE INT'S
;---------------------------------------------------------------------------
;
; FUNCTION : EEREAD ()
;
; DESCRIPTION : READ 8 BIT VALUE FROM EEPROM
;
;---------------------------------------------------------------------------
EEREAD
BANKSEL EEADR ; BANK1
BSF EECON1,RD ; EE READ
INCF EEADR,F ; POINT TO NEXT ENTRY IN EEPROM
MOVF EEDATA,W ; GET UPPER 8 BITS
BANKSEL GPIO ; BANK 0
RETURN ; RETURN WITHOUT CHANGING W REGISTER
;---------------------------------------------------------------------------
;
; FUNCTION : ROT_SHIFT()
;
; DESCRIPTION : RIGHT ROTATE 64 BIT RECEIVE SHIFT REGISTER
;
;---------------------------------------------------------------------------
ROT_SHIFT
RRF CSR8,1 ; RIGHT ROTATE RECEIVE SHIFT REGISTER
RRF CSR7,1 ; RIGHT ROTATE RECEIVE SHIFT REGISTER
RRF CSR6,1 ; RIGHT ROTATE RECEIVE SHIFT REGISTER
RRF CSR5,1 ; RIGHT ROTATE RECEIVE SHIFT REGISTER
RRF CSR4,1 ; RIGHT ROTATE RECEIVE SHIFT REGISTER
RRF CSR3,1 ; RIGHT ROTATE RECEIVE SHIFT REGISTER
RRF CSR2,1 ; RIGHT ROTATE RECEIVE SHIFT REGISTER
RRF CSR1,1 ; RIGHT ROTATE RECEIVE SHIFT REGISTER
RRF CSR0,1 ; RIGHT ROTATE RECEIVE SHIFT REGISTER
RETLW E_OK
;---------------------------------------------------------------------------
;
; FUNCTION : TE_DEL ()
;
; DESCRIPTION : WAIT FOR 1 TE CYCLE. TE_DEL2 = 5us. DELAYING 20 TE_DEL2
; : TAKES DELAY UP TO 100us
;
;---------------------------------------------------------------------------
TE_DELAY
MOVF TMP2,W ; MOV THE SELECTED BAUD RATE TO W
MOVWF CNT2
MOVF TMP2,W ; TMP2 CONTAINS THE TX RATE SELECTED
TE_DEL2
NOP ; [1] WASTE TIME
CLRWDT ; [1]
DECFSZ CNT2,1 ; [1]
GOTO TE_DEL2 ; [2]
RETLW 0
;---------------------------------------------------------------------------
;
; FUNCTION : TRANSMIT_HOP ()
;
; DESCRIPTION : SET UP CSR[8:0] TO TRANSMIT A NORMAL HOP CODE
; : TRANSMISSION AND TRANSMIT.
MOVLW HOP_FUNC ; PREPARE TO MASK THE FUNCTION CODE IN THE OPEN PORTION
IORWF CSR7,F
MOVLW 2H ; SET THE LAST BITS TO HAVE RPT SET AND VLOW CLEAR
MOVWF CSR8
GOTO TRANSMIT_CSR
;---------------------------------------------------------------------------
;
; FUNCTION : TRANSMIT_SEED ()
;
; DESCRIPTION : SET UP CSR[8:0] TO TRANSMIT A SEED TRANSMISSION AND
; : TRANSMIT.
;
;---------------------------------------------------------------------------
TRANSMIT_SEED
CALL GET_TXSPEED
CALL GET_SEED ; GET THE SEED FROM EE TO CSR[3:0]
CALL GET_SERIAL ; GET THE SERIAL NUMBER FROM EE TO CSR[8:4]
MOVLW SEED_FUNC ; PREPARE TO MASK THE FUNCTION CODE IN THE OPEN PORTION
IORWF CSR7,F
MOVLW 2H ; SET THE LAST BITS TO HAVE RPT SET AND VLOW CLEAR
MOVWF CSR8
GOTO TRANSMIT_CSR
;---------------------------------------------------------------------------
;
; FUNCTION : TRANSMIT_BLANK ()
;
; DESCRIPTION : TRANSMITS AS MANY BLANK TRANSMISSIONS AS SPECIFIED BY TMP3
;
;---------------------------------------------------------------------------
TRANSMIT_BLANK
MOVF TMP3,W
MOVWF TMP4 ; TMP4 IS DECREMENTED EACH TIME TX IS BLANKED
BLANK_LOOP
BTFSC STATUS,Z ; CHECK IF TMP4 IS ZERO
RETURN ; RETURN IF TMP4 IS ZERO
;---------------------------------------------------------------------------
;
; FUNCTION : TRANSMIT_CSR ()
;
; DESCRIPTION : TRANSMITS THE CONTENTS OF CSR[8:0] (66 BITS) USING A
; : PWM FORMAT, LSB OF CSR0 FIRST, ENDING WITH BIT 1 OF CSR8
;
;---------------------------------------------------------------------------
TRANSMIT_CSR
TX_DTA
MOVLW 042H ; TOTAL OF 66 BITS TO TRANSMIT
MOVWF CNT1
TX_MARK
BCF GPIO,RFOUT ; SET RF OUTPUT HIGH
CALL TE_DELAY ; WAIT FOR ONE TE CYCLE
BCF GPIO,RFOUT ; SET RF OUTPUT LOW
CALL TE_DELAY ; WAIT FOR ONE TE CYCLE
GOTO TX_NEXT
TX_NEXT
CALL ROT_SHIFT ; GET NEXT BIT IN CARRY
DECFSZ CNT1,1 ; ALL BITS TRANSMITTED
GOTO TX_DTA2 ; ... NO, THEN DO NEXT BIT
TX_STOP
BCF GPIO,RFOUT ; SET RF OUTPUT LOW
CALL TE_DELAY ; WAIT FOR ONE TE CYCLE
BSF GPIO,RFOUT ; SET RF OUTPUT HIGH
CALL TE_DELAY ; WAIT FOR ONE TE CYCLE
TX_GUARD2
CALL TE_DELAY ; WAIT ONE TE_DELAY TIME
DECFSZ CNT1,1
GOTO TX_GUARD2
CALL TRANSMIT_BLANK
DECFSZ CNT0,1
GOTO TX00
RETLW 0H
;---------------------------------------------------------------------------
;
RD_MAP1
MOVLW 8H ; NUMBER OF BYTE TO READ FROM ROM
MOVWF CNT1
CLRFCSR8
RD_MAP12
CLRWDT
MOVFW CNT2 ; GET INDEX POINTER
MOVWF INDF ; STORE IN BUFFER
DECFSZ CNT1,1
GOTO RD_MAP12
RETLW 0
;---------------------------------------------------------------------------
;
; FUNCTION : RD_MAP2 ()
;
; DESCRIPTION : READ SEED MAP FROM ROM TABLE
;
;---------------------------------------------------------------------------
RD_MAP2
MOVLW 8H ; NUMBER OF BYTE TO READ FROM ROM
MOVWF CNT1
CLRF CNT2
CLRF CSR8
RD_MAP22
CLRWDT
MOVFW CNT2 ; GET INDEX POINTER
CALL GET_SEED ; READ BYTE FROM MAP
DECFSZ CNT1,1
GOTO RD_MAP22
RETLW 0
;---------------------------------------------------------------------------
;
; FUNCTION : MAIN ()
;
; DESCRIPTION : MAIN PROGRAM LOOP
;
;---------------------------------------------------------------------------
MAIN
BANKSEL INTCON ; BANK 1
BCF INTCON,GIE ; DISABLE GLOBAL INTERUPTS
CALL INITIALIZE_EEPROM
M_LOOP
BANKSEL GPIO ; BANK 0
CLRWDT
BTFSC GPIO,5 ; TEST IF S0 PRESSED - GP5
GOTO M_LOOP ; LOOP BACK
MOVLW 1
MOVWF CNT0
CALL TRANSMIT_HOP ; TRANSMIT HOP CODE TRANSMISSION
M_LOOP2
BTFSC GPIO,5 ; LOOP WHILE BUTTON IS STILL PRESSED
GOTO M_LOOP ; LOOP BACK IF BUTTON IS RELEASED
MOVLW 1
MOVWF CNT0
CALL TRANSMIT_CSR ; OTHERWISE RETRANSMIT BUFFER
GOTO M_LOOP2 ; LOOP BACK TO M_LOOP2
;---------------------------------------------------------------------------
;
; FUNCTION : INITIALIZE EEPROM
;
; DESCRIPTION : EEPROM INITIALIZATION
;
;---------------------------------------------------------------------------
INITIALIZE_EEPROM
MOVLW KEY_ADR ; WRITE KEY0 (LSB)
MOVWF EEADR
MOVLW 078H
CALL EEWRITE
MOVLW 042H ; WRITE KEY1
CALL EEWRITE
MOVLW 007H ; WRITE KEY2
CALL EEWRITE
MOVLW 089H ; WRITE KEY3
CALL EEWRITE
MOVLW 0E9H ; WRITE KEY4
CALL EEWRITE
MOVLW 0FBH ; WRITE KEY5
CALL EEWRITE
MOVLW 016H ; WRITE KEY6
CALL EEWRITE
MOVLW 05H ; WRITE KEY7
CALL EEWRITE
END
GOTO TRANSMISSION_0
GOTO TRANSMISSION_1
GOTO TRANSMISSION_2
GOTO TRANSMISSION_3
GOTO TRANSMISSION_4
GOTO TRANSMISSION_5
GOTO TRANSMISSION_6
GOTO TRANSMISSION_7
GOTO TRANSMISSION_8
GOTO TRANSMISSION_9
GOTO TRANSMISSION_10
GOTO TRANSMISSION_11
GOTO TRANSMISSION_12
GOTO TRANSMISSION_13
GOTO TRANSMISSION_14
GOTO TRANSMISSION_15
• Microchip believes that its family of products is one of the most secure families of its kind on the market today, when used in the
intended manner and under normal conditions.
• There are dishonest and possibly illegal methods used to breach the code protection feature. All of these methods, to our
knowledge, require using the Microchip products in a manner outside the operating specifications contained in Microchip’s Data
Sheets. Most likely, the person doing so is engaged in theft of intellectual property.
• Microchip is willing to work with the customer who is concerned about the integrity of their code.
• Neither Microchip nor any other semiconductor manufacturer can guarantee the security of their code. Code protection does not
mean that we are guaranteeing the product as “unbreakable.”
Code protection is constantly evolving. We at Microchip are committed to continuously improving the code protection features of our
products. Attempts to break Microchip’s code protection feature may be a violation of the Digital Millennium Copyright Act. If such acts
allow unauthorized access to your software or other copyrighted work, you may have a right to sue for relief under that Act.
ISBN: 978-1-61341-276-3