Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .def param0 = r23
- .def param1 = r24
- .def lcd_data = r11
- .def tmp = R27
- .def counter = r26
- .def linepointercounter = r18
- .def TAG_LOOP_COUNT = r25
- .def TAG_SUCCESS_COUNT = r25
- .equ DIODE_MASK = 0x10 ; 0001 0000
- .equ FUNCTION_SET_MASK = 0x38 ; 0011 1000
- .equ ENTRY_MODE_MASK = 0x06 ; 0000 0110
- .equ DISPLAY_MASK = 0x0c ; 0000 1100
- .equ CLEAR_MASK = 0x01 ; 0000 0001
- .equ RETURN_TO_HOME_MASK = 0x02 ; 0000 0010
- ;.equ usart_interrupt = $016
- .equ rfid_en_pin = PD1
- .equ rfid_sout_pin = PD0
- .equ en_pin = PB7
- .equ rw_pin = PB6
- .equ rs_pin = PB5
- .equ diode_pin = PB4 ; 00010000
- .equ blip_pin = PB3
- .org $300 ;2200533DF8
- tags:
- .db "2200533788",0 ;B30
- .db "0000000000",0 ;B31
- .db "220053432D",0 ;B32
- .db "22005367E2",0 ;B33
- .db "2200533DF8",0 ;B34
- .db "22005340BD",0 ;B35
- .org $200 ;0001000000
- welcome_message: .db "Welcome user B3",0
- notallowed_message: .db "Not Authorized! ",0
- .org $250
- LINE: .db "0000000000"
- .cseg
- .org $000
- rjmp RESET
- .org $016
- rjmp USARTINT
- RESET:
- clr r16
- clr r17
- clr r18
- clr r19
- clr r20
- clr r21
- clr r22
- clr r26
- clr r27
- clr r16
- ldi r16,$FF
- out DDRA,r16
- ldi r16,$FF
- out DDRB,r16
- ldi r16,$FF
- out DDRD,r16
- ldi r16,HIGH(RAMEND) ; Set stackpointer
- out SPH,r16
- ldi r16,LOW(RAMEND)
- out SPL,r16
- ldi YH,HIGH(LINE*2) ; Set Ypointer to point to LINE
- ldi YL,LOW(LINE*2) ;
- ;clr r16 ; init timer0
- ;ldi r16,(1<<CS02) | (0<<CS01) |(1<<CS00) ; Normal mode, prescale clk/64
- ;out TCCR0,r16
- ldi r16,(0<<TOIE0) | (0<<TOIE1) ; enable timer0 & timer 1
- out TIMSK,r16
- ; The MCU Control Register
- ldi r16, (1<<ISC01) | (0<<ISC00) | (1<<ISC11) | (0<<ISC10) ; Trigger int 0 and int 1 on falling edge
- out MCUCR, r16
- rcall RFID_LOW_ENABLE
- ; General Interrupt Control Register
- ldi r16,(1<<RXC | 0 << UDRE)
- out GICR, r16
- ;rcall RFID_HIGH_ENABLE
- call CLEAR_PORTB
- rcall LCD_INIT
- ldi r16,$0
- out PORTD,r16
- ;out PORTD,r19
- USART_Init:
- ldi r16,0
- out UBRRH, r16
- ldi r16,25 ; UBRR = 25 => bps = 2400
- out UBRRL, r16
- ;ldi r16, (1<<RxC ) ; Enable receiver
- ;out UCSRA,r16
- ldi r16, (1<<RXEN) |(0<<TXEN) | (1<<RXCIE ) | (0<<UDRIE )
- out UCSRB,r16
- ldi r16, (1<<URSEL)|(3<<UCSZ0) | (0 << UMSEL)
- out UCSRC,r16
- sei
- LOOP:
- jmp LOOP
- CLEAR_PORTA:
- ldi tmp, $00
- out PORTA, tmp
- ret
- CLEAR_PORTB:
- ldi tmp, $00
- out PORTA, tmp
- ret
- SLEEP_N_MS:
- push param0
- push param1
- clr param1
- SLEEP_N_MS_LOOP: rcall SLEEP_1_MS
- inc param1
- cp param1, param0
- brlo SLEEP_N_MS_LOOP
- pop param1
- pop param0
- ret
- SLEEP_1_MS: ; (6 + (4 * 41) * (3 * 2)) = 990 klockcyklar = 0,000978
- push param0
- push param1
- clr param0
- SLEEP_1_MS_LOOP1: clr param1
- SLEEP_1_MS_LOOP2: inc param1
- cpi param1, 3
- brne SLEEP_1_MS_LOOP2
- inc param0
- cpi param0, 41
- brne SLEEP_1_MS_LOOP1
- pop param1
- pop param0
- ret
- ; ***************** LCD FUNCTIONS *********************
- E_EQUALS_1:
- clr tmp
- in tmp,PORTB
- sbr tmp, en_pin
- out PORTB,tmp
- ret
- E_EQUALS_0:
- clr tmp
- in tmp,PORTB
- cbr tmp, en_pin
- out PORTB,tmp
- ret
- RS0_RW1: ;RS=0 och RW=1
- clr tmp
- in tmp,PORTB
- cbr tmp, rs_pin
- sbr tmp, rw_pin
- out PORTB,tmp
- ret
- RS0_RW0: ;RS=0 och RW=0
- clr tmp
- in tmp,PORTB
- cbr tmp, rs_pin
- cbr tmp, rw_pin
- out PORTB,tmp
- ret
- CLEAR_LCD:
- ldi param0, 2
- rcall SLEEP_N_MS
- ldi param1, CLEAR_MASK ; 0000 0001 clear display
- rcall LCD_INIT_WRITE
- ret
- LCD_INIT:
- push param0
- push param1
- ldi param1, FUNCTION_SET_MASK ; 0011 1000 function set, 8bit data, 2 lines
- rcall LCD_INIT_WRITE
- ldi param1, DISPLAY_MASK ; 0000 1100 display is turned on
- rcall LCD_INIT_WRITE
- ldi param1, CLEAR_MASK ; 0000 0001 clear display
- rcall LCD_INIT_WRITE
- ldi param0, 2
- rcall SLEEP_N_MS
- ldi param1, ENTRY_MODE_MASK ; 0000 0110 cursor moves right
- rcall LCD_INIT_WRITE
- ldi param1, RETURN_TO_HOME_MASK ; 0000 0010 return to home
- rcall LCD_INIT_WRITE
- pop param1
- pop param0
- ret
- BLIP_NOISE:
- sbi PORTB, blip_pin
- ldi param0, 100
- rcall SLEEP_N_MS
- cbi PORTB, blip_pin
- ret
- DIODE_LIGHT_ON:
- sbi PORTB, diode_pin
- ret
- DIODE_LIGHT_OFF:
- cbi PORTB, diode_pin
- ret
- LCD_INIT_WRITE:
- mov lcd_data, param1
- cbi PORTB, rs_pin
- cbi PORTB, rw_pin
- rcall LCD_WRITE
- ret
- LCD_DISPLAY_CHAR:
- mov lcd_data, param1
- sbi PORTB, rs_pin
- cbi PORTB, rw_pin
- rcall LCD_WRITE
- ret
- LCD_WRITE:
- sbi PORTB, en_pin
- rcall SLEEP_1_MS
- out PORTA, lcd_data
- rcall SLEEP_1_MS
- cbi PORTB, en_pin
- rcall SLEEP_1_MS
- ret
- LCD_WRITE_LINE:
- push param0
- clr param0
- LCD_WRITE_LINE_LOOP:
- clr counter
- add ZL,param0
- lpm r16,Z
- sub ZL, param0
- mov param1, r16
- rcall LCD_DISPLAY_CHAR
- inc param0
- cpi param0, $F
- brlo LCD_WRITE_LINE_LOOP
- ;rcall CLEAR_lCD
- pop param0
- ;rcall LCD_INIT
- ret
- ; ***************** END LCD FUNCTIONS *********************
- ; ***************** RFID FUNCTIONS ************************
- RFID_READ:
- ;rcall RFID_LOW_ENABLE
- ret
- RFID_HIGH_ENABLE:
- sbi PORTD, rfid_en_pin
- ret
- RFID_LOW_ENABLE:
- cbi PORTD, rfid_en_pin
- ret
- DIODE_LIGHT:
- sbi PORTB, diode_pin
- ret
- DIODE_SWITCH:
- push param0
- push param1
- clr counter
- in param0, PORTB
- ldi param1, DIODE_MASK
- eor param0, param1
- out PORTB, param0
- pop param1
- pop param0
- ret
- USARTINT:
- in param1, UDR
- ;LDI param1, $5
- cpi r19, $C
- BRSH USARTINT_END
- inc r19
- cpi r19, $1
- breq USARTINT_END
- add YL, linepointercounter
- std Y+0, param1
- sub YL, linepointercounter
- USARTINT_INCREASE_ONE_BYTE:
- ldi tmp, 1
- add linepointercounter,tmp
- cpi r19, $0B
- breq USARTDONE
- USARTINT_END:
- reti
- USARTDONE:
- rcall RFID_HIGH_ENABLE
- clr r16
- clr linepointercounter
- rcall COMPARETAGS
- mov r28, r16
- cpi r28, $9
- breq NOT_ALLOWED
- cpi r28, $9
- brlo WELCOME_SCREEN
- WELCOME_SCREEN:
- ldi ZH, high(welcome_message << 1)
- ldi ZL, low(welcome_message << 1)
- rcall LCD_WRITE_LINE
- ldi tmp, $30
- mov param1, r28
- add param1, tmp
- rcall LCD_DISPLAY_CHAR
- jmp USARTDONE_END
- NOT_ALLOWED:
- ldi ZH, high(notallowed_message << 1)
- ldi ZL, low(notallowed_message << 1)
- rcall LCD_WRITE_LINE
- USARTDONE_END:
- rcall CLEAR_REGISTERS
- rcall LONG_SLEEP
- rcall CLEAR_LCD
- rcall RFID_LOW_ENABLE
- in r16,UDR
- in r16,UDR
- in r16,UDR
- reti
- CLEAR_REGISTERS:
- clr r16
- clr r17
- clr r18
- clr r19
- clr r20
- clr r21
- clr r22
- clr r23
- clr r24
- clr r25
- clr r26
- clr r27
- ldi YH,HIGH(LINE*2) ; Set Ypointer to point to LINE
- ldi YL,LOW(LINE*2) ;
- ret
- LONG_SLEEP:
- push param0
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- ldi param0, $FF
- rcall SLEEP_N_MS
- pop param0
- ret
- COMPARETAGS: ; Y = TAG FROM CARD, Z = TAGS FROM MEMORY
- push param0
- push param1
- clr TAG_LOOP_COUNT
- clr r16
- clr param0
- ldi TAG_LOOP_COUNT, 0
- ldi ZH, high(tags<< 1)
- ldi ZL, low(tags << 1)
- ;ldi YH,HIGH(LINE << 1)
- ;ldi YL,LOW(LINE << 1)
- COMPARETAGS_LOOP_1:
- add ZL, param0
- clr param0
- COMPARETAGS_LOOP_2:
- add ZL,param0
- add YL,param0
- lpm r16, Z
- ldd param1, Y+0
- sub ZL,param0
- sub YL, param0
- inc param0
- cp r16, param1
- brne COMPARETAGS_RETURN_FALSE
- cpi param0, 10
- brlo COMPARETAGS_LOOP_2
- COMPARETAGS_SUCCESS:
- mov r16, TAG_LOOP_COUNT
- ;rcall WELCOME_SCREEN
- jmp COMPARETAGS_END
- COMPARETAGS_RETURN_FALSE:
- ldi r16, 9
- inc TAG_LOOP_COUNT
- ldi param0, 12
- cpi TAG_LOOP_COUNT, 6 ; <- 6 = number of strings
- brlo COMPARETAGS_LOOP_1
- ;jmp COMPARETAGS_END
- COMPARETAGS_END:
- ;mov param1, r16
- pop param1
- pop param0
- ret
- ; ***************** END RFID FUNCTIONS ********************
- INTINTA:
- reti
- /*
- WRITELINE: ; (Temporärt)
- push param1
- ldd param1, Y+0
- rcall LCD_DISPLAY_CHAR
- ldd param1, Y+1
- rcall LCD_DISPLAY_CHAR
- ldd param1, Y+2
- rcall LCD_DISPLAY_CHAR
- ldd param1, Y+3
- rcall LCD_DISPLAY_CHAR
- ldd param1, Y+4
- rcall LCD_DISPLAY_CHAR
- ldd param1, Y+5
- rcall LCD_DISPLAY_CHAR
- ldd param1, Y+6
- rcall LCD_DISPLAY_CHAR
- ldd param1, Y+7
- rcall LCD_DISPLAY_CHAR
- ldd param1, Y+8
- rcall LCD_DISPLAY_CHAR
- ldd param1, Y+9
- rcall LCD_DISPLAY_CHAR
- pop param1
- ret
- INITLINE: ; (Temporärt)
- ldi ZH, high(line_init_tag << 1)
- ldi ZL, low(line_init_tag << 1)
- lpm tmp, Z+0
- std Y+0, tmp
- lpm tmp, Z+1
- std Y+1, tmp
- lpm tmp, Z+2
- std Y+2, tmp
- lpm tmp, Z+3
- std Y+3, tmp
- lpm tmp, Z+4
- std Y+4, tmp
- lpm tmp, Z+5
- std Y+5, tmp
- lpm tmp, Z+6
- std Y+6, tmp
- lpm tmp, Z+7
- std Y+7, tmp
- lpm tmp, Z+8
- std Y+8, tmp
- lpm tmp, Z+9
- std Y+9, tmp
- ret */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement