Advertisement
Guest User

Untitled

a guest
Mar 6th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.    
  2.     .def    param0 = r23
  3.     .def    param1 = r24
  4.     .def    lcd_data = r11
  5.     .def    tmp = R27
  6.     .def    counter = r26
  7.     .def    linepointercounter = r18
  8.     .def    TAG_LOOP_COUNT = r25
  9.     .def    TAG_SUCCESS_COUNT = r25
  10.  
  11.     .equ    DIODE_MASK = 0x10   ; 0001 0000
  12.     .equ    FUNCTION_SET_MASK = 0x38    ; 0011 1000
  13.     .equ    ENTRY_MODE_MASK = 0x06      ; 0000 0110
  14.     .equ    DISPLAY_MASK = 0x0c         ; 0000 1100
  15.     .equ    CLEAR_MASK = 0x01           ; 0000 0001
  16.     .equ    RETURN_TO_HOME_MASK = 0x02  ; 0000 0010
  17.  
  18.     ;.equ   usart_interrupt = $016
  19.  
  20.     .equ    rfid_en_pin = PD1
  21.     .equ    rfid_sout_pin = PD0
  22.  
  23.     .equ    en_pin = PB7
  24.     .equ    rw_pin = PB6
  25.     .equ    rs_pin = PB5
  26.     .equ    diode_pin = PB4     ; 00010000
  27.     .equ    blip_pin = PB3
  28.  
  29.     .org    $300    ;2200533DF8
  30.     tags:
  31.         .db "2200533788",0  ;B30
  32.         .db "0000000000",0  ;B31
  33.         .db "220053432D",0  ;B32
  34.         .db "22005367E2",0  ;B33
  35.         .db "2200533DF8",0  ;B34
  36.         .db "22005340BD",0  ;B35
  37.  
  38.     .org    $200       ;0001000000
  39.     welcome_message: .db  "Welcome user B3",0
  40.     notallowed_message: .db "Not Authorized! ",0
  41.  
  42.  
  43. .org    $250
  44. LINE: .db "0000000000"
  45.  
  46.  
  47. .cseg
  48.  
  49.     .org    $000
  50.     rjmp    RESET
  51.  
  52.     .org    $016
  53.     rjmp    USARTINT
  54.  
  55.  
  56.  
  57. RESET:
  58.     clr     r16
  59.     clr     r17
  60.     clr     r18
  61.     clr     r19    
  62.     clr     r20
  63.     clr     r21
  64.     clr     r22
  65.     clr     r26
  66.     clr     r27
  67.     clr     r16
  68.  
  69.  
  70.     ldi     r16,$FF
  71.     out     DDRA,r16
  72.     ldi     r16,$FF
  73.     out     DDRB,r16   
  74.     ldi     r16,$FF
  75.     out     DDRD,r16   
  76.    
  77.  
  78.     ldi     r16,HIGH(RAMEND)    ; Set stackpointer
  79.     out     SPH,r16
  80.     ldi     r16,LOW(RAMEND)
  81.     out     SPL,r16
  82.    
  83.  
  84.  
  85.     ldi     YH,HIGH(LINE*2) ; Set Ypointer to point to LINE
  86.     ldi     YL,LOW(LINE*2)  ;
  87.  
  88.  
  89.     ;clr        r16                                     ; init timer0
  90.     ;ldi        r16,(1<<CS02) | (0<<CS01) |(1<<CS00)    ; Normal mode, prescale clk/64
  91.     ;out    TCCR0,r16
  92.     ldi     r16,(0<<TOIE0) | (0<<TOIE1)     ; enable timer0 & timer 1
  93.     out     TIMSK,r16
  94.  
  95.             ; The MCU Control Register
  96.     ldi     r16, (1<<ISC01) | (0<<ISC00) | (1<<ISC11) | (0<<ISC10)  ; Trigger int 0 and int 1 on falling edge
  97.     out     MCUCR, r16
  98.  
  99.  
  100.     rcall   RFID_LOW_ENABLE
  101.  
  102.     ; General Interrupt Control Register
  103.     ldi     r16,(1<<RXC | 0 << UDRE)
  104.     out     GICR, r16
  105.  
  106.     ;rcall  RFID_HIGH_ENABLE
  107.  
  108.     call    CLEAR_PORTB
  109.     rcall   LCD_INIT
  110.     ldi     r16,$0
  111.     out     PORTD,r16  
  112.    
  113.  
  114.     ;out        PORTD,r19
  115.      
  116. USART_Init:
  117.     ldi     r16,0
  118.     out     UBRRH, r16
  119.     ldi     r16,25      ; UBRR = 25 => bps = 2400
  120.     out     UBRRL, r16
  121.     ;ldi        r16, (1<<RxC )  ; Enable receiver
  122.     ;out        UCSRA,r16
  123.     ldi     r16, (1<<RXEN) |(0<<TXEN)  | (1<<RXCIE ) | (0<<UDRIE ) 
  124.     out     UCSRB,r16
  125.     ldi     r16, (1<<URSEL)|(3<<UCSZ0) | (0 << UMSEL)
  126.     out     UCSRC,r16
  127.     sei
  128. LOOP:
  129.     jmp     LOOP
  130.  
  131. CLEAR_PORTA:
  132.     ldi tmp, $00
  133.     out PORTA, tmp
  134.     ret
  135.    
  136. CLEAR_PORTB:
  137.     ldi tmp, $00
  138.     out PORTA, tmp
  139.     ret
  140.  
  141. SLEEP_N_MS:
  142.     push    param0
  143.     push    param1
  144.     clr     param1
  145. SLEEP_N_MS_LOOP:    rcall   SLEEP_1_MS
  146.     inc     param1
  147.     cp      param1, param0
  148.     brlo    SLEEP_N_MS_LOOP
  149.     pop     param1
  150.     pop     param0
  151.     ret
  152.  
  153.  
  154. SLEEP_1_MS:     ; (6 + (4 * 41) * (3 * 2)) = 990 klockcyklar = 0,000978
  155.         push    param0
  156.         push    param1
  157.         clr     param0
  158.     SLEEP_1_MS_LOOP1:   clr     param1
  159.     SLEEP_1_MS_LOOP2:   inc     param1
  160.         cpi     param1, 3
  161.         brne    SLEEP_1_MS_LOOP2
  162.         inc     param0
  163.         cpi     param0, 41
  164.         brne    SLEEP_1_MS_LOOP1
  165.         pop     param1
  166.         pop     param0
  167.         ret
  168.  
  169.  
  170. ; ***************** LCD FUNCTIONS *********************
  171. E_EQUALS_1:
  172.     clr     tmp
  173.     in      tmp,PORTB
  174.     sbr     tmp, en_pin
  175.     out     PORTB,tmp
  176.     ret
  177.  
  178. E_EQUALS_0:
  179.     clr     tmp
  180.     in      tmp,PORTB
  181.     cbr     tmp, en_pin
  182.     out     PORTB,tmp
  183.     ret
  184.  
  185. RS0_RW1:        ;RS=0 och RW=1
  186.     clr     tmp
  187.     in      tmp,PORTB
  188.     cbr     tmp, rs_pin
  189.     sbr     tmp, rw_pin
  190.     out     PORTB,tmp  
  191.     ret
  192.  
  193. RS0_RW0:        ;RS=0 och RW=0
  194.     clr     tmp
  195.     in      tmp,PORTB
  196.     cbr     tmp, rs_pin
  197.     cbr     tmp, rw_pin
  198.     out     PORTB,tmp  
  199.     ret
  200.  
  201.  
  202. CLEAR_LCD:
  203.     ldi     param0, 2
  204.     rcall   SLEEP_N_MS
  205.     ldi     param1, CLEAR_MASK      ; 0000 0001 clear display
  206.     rcall   LCD_INIT_WRITE
  207. ret
  208.  
  209. LCD_INIT:
  210.     push    param0
  211.     push    param1
  212.     ldi     param1, FUNCTION_SET_MASK       ; 0011 1000 function set, 8bit data, 2 lines
  213.     rcall   LCD_INIT_WRITE
  214.     ldi     param1, DISPLAY_MASK        ; 0000 1100 display is turned on
  215.     rcall   LCD_INIT_WRITE
  216.     ldi     param1, CLEAR_MASK      ; 0000 0001 clear display
  217.     rcall   LCD_INIT_WRITE
  218.     ldi     param0, 2
  219.     rcall   SLEEP_N_MS
  220.     ldi     param1, ENTRY_MODE_MASK     ; 0000 0110 cursor moves right
  221.     rcall   LCD_INIT_WRITE
  222.     ldi     param1, RETURN_TO_HOME_MASK     ; 0000 0010  return to home
  223.     rcall   LCD_INIT_WRITE
  224.     pop     param1
  225.     pop     param0
  226.     ret
  227.  
  228. BLIP_NOISE:
  229.     sbi     PORTB, blip_pin
  230.     ldi     param0, 100
  231.     rcall   SLEEP_N_MS
  232.     cbi     PORTB, blip_pin
  233.     ret
  234.  
  235. DIODE_LIGHT_ON:
  236.     sbi     PORTB, diode_pin
  237.     ret
  238.  
  239. DIODE_LIGHT_OFF:
  240.     cbi     PORTB, diode_pin
  241.     ret
  242.  
  243. LCD_INIT_WRITE:
  244.     mov     lcd_data, param1
  245.     cbi     PORTB, rs_pin
  246.     cbi     PORTB, rw_pin
  247.     rcall   LCD_WRITE
  248.     ret
  249.  
  250.  
  251. LCD_DISPLAY_CHAR:
  252.     mov     lcd_data, param1
  253.     sbi     PORTB, rs_pin
  254.     cbi     PORTB, rw_pin
  255.     rcall   LCD_WRITE
  256.     ret
  257.  
  258. LCD_WRITE:
  259.     sbi     PORTB, en_pin
  260.     rcall   SLEEP_1_MS
  261.     out     PORTA, lcd_data
  262.     rcall   SLEEP_1_MS
  263.     cbi     PORTB, en_pin
  264.     rcall   SLEEP_1_MS
  265.     ret
  266.    
  267.  
  268. LCD_WRITE_LINE:        
  269.     push    param0
  270.     clr     param0
  271.     LCD_WRITE_LINE_LOOP:   
  272.         clr     counter
  273.         add     ZL,param0
  274.         lpm     r16,Z
  275.         sub     ZL, param0
  276.         mov     param1, r16
  277.         rcall   LCD_DISPLAY_CHAR
  278.         inc     param0
  279.         cpi     param0, $F
  280.         brlo    LCD_WRITE_LINE_LOOP
  281.     ;rcall  CLEAR_lCD
  282.     pop     param0
  283.    
  284.     ;rcall  LCD_INIT
  285. ret
  286. ; ***************** END LCD FUNCTIONS *********************
  287.  
  288.  
  289.  
  290. ; ***************** RFID FUNCTIONS ************************
  291.  
  292. RFID_READ:
  293.         ;rcall RFID_LOW_ENABLE
  294.  
  295.  
  296. ret
  297.  
  298. RFID_HIGH_ENABLE:
  299.         sbi     PORTD, rfid_en_pin
  300. ret
  301.  
  302. RFID_LOW_ENABLE:
  303.         cbi     PORTD, rfid_en_pin
  304. ret
  305.  
  306. DIODE_LIGHT:
  307.     sbi     PORTB, diode_pin
  308.     ret
  309.  
  310. DIODE_SWITCH:
  311.     push    param0
  312.     push    param1
  313.     clr     counter
  314.     in      param0, PORTB
  315.     ldi     param1, DIODE_MASK
  316.     eor     param0, param1
  317.     out     PORTB, param0
  318.     pop     param1
  319.     pop     param0
  320. ret
  321.  
  322.  
  323.  
  324.  
  325.  
  326. USARTINT:
  327.    
  328.     in      param1, UDR
  329.     ;LDI        param1, $5
  330.  
  331.     cpi     r19, $C
  332.     BRSH    USARTINT_END
  333.  
  334.     inc     r19
  335.     cpi     r19, $1
  336.     breq    USARTINT_END
  337.    
  338.     add     YL, linepointercounter
  339.     std     Y+0, param1
  340.     sub     YL, linepointercounter
  341.  
  342. USARTINT_INCREASE_ONE_BYTE:
  343.     ldi     tmp, 1
  344.     add     linepointercounter,tmp
  345.  
  346.     cpi     r19, $0B
  347.     breq    USARTDONE
  348.  
  349. USARTINT_END:
  350.    
  351.  
  352.     reti
  353.  
  354.  
  355.  
  356. USARTDONE:
  357.     rcall   RFID_HIGH_ENABLE
  358.     clr     r16
  359.     clr     linepointercounter
  360.     rcall   COMPARETAGS
  361.     mov     r28, r16
  362.     cpi     r28, $9
  363.     breq    NOT_ALLOWED
  364.     cpi     r28, $9
  365.     brlo    WELCOME_SCREEN
  366. WELCOME_SCREEN:
  367.     ldi     ZH, high(welcome_message << 1)
  368.     ldi     ZL, low(welcome_message << 1)
  369.     rcall   LCD_WRITE_LINE
  370.     ldi     tmp, $30
  371.     mov     param1, r28
  372.     add     param1, tmp
  373.     rcall   LCD_DISPLAY_CHAR
  374.    
  375.     jmp     USARTDONE_END
  376. NOT_ALLOWED:
  377.     ldi     ZH, high(notallowed_message << 1)
  378.     ldi     ZL, low(notallowed_message << 1)
  379.     rcall   LCD_WRITE_LINE
  380. USARTDONE_END: 
  381.     rcall   CLEAR_REGISTERS
  382.     rcall   LONG_SLEEP
  383.     rcall   CLEAR_LCD
  384.     rcall   RFID_LOW_ENABLE
  385.     in      r16,UDR
  386.     in      r16,UDR
  387.     in      r16,UDR
  388. reti
  389.  
  390. CLEAR_REGISTERS:
  391.     clr     r16
  392.     clr     r17
  393.     clr     r18
  394.     clr     r19    
  395.     clr     r20
  396.     clr     r21
  397.     clr     r22
  398.     clr     r23
  399.     clr     r24
  400.     clr     r25
  401.     clr     r26
  402.     clr     r27
  403.     ldi     YH,HIGH(LINE*2) ; Set Ypointer to point to LINE
  404.     ldi     YL,LOW(LINE*2)  ;
  405. ret
  406.  
  407. LONG_SLEEP:
  408.     push    param0
  409.     ldi     param0, $FF
  410.     rcall   SLEEP_N_MS
  411.     ldi     param0, $FF
  412.     rcall   SLEEP_N_MS
  413.     ldi     param0, $FF
  414.     rcall   SLEEP_N_MS
  415.     ldi     param0, $FF
  416.     rcall   SLEEP_N_MS
  417.     ldi     param0, $FF
  418.     rcall   SLEEP_N_MS
  419.     ldi     param0, $FF
  420.     rcall   SLEEP_N_MS
  421.     ldi     param0, $FF
  422.     rcall   SLEEP_N_MS
  423.     ldi     param0, $FF
  424.     rcall   SLEEP_N_MS
  425.     ldi     param0, $FF
  426.     rcall   SLEEP_N_MS
  427.     ldi     param0, $FF
  428.     rcall   SLEEP_N_MS
  429.     ldi     param0, $FF
  430.     rcall   SLEEP_N_MS
  431.     ldi     param0, $FF
  432.     rcall   SLEEP_N_MS
  433.     ldi     param0, $FF
  434.     rcall   SLEEP_N_MS
  435.     pop     param0
  436. ret
  437.  
  438.  COMPARETAGS: ; Y = TAG FROM CARD, Z = TAGS FROM MEMORY
  439.     push    param0
  440.     push    param1
  441.     clr     TAG_LOOP_COUNT
  442.     clr     r16
  443.     clr     param0
  444.     ldi     TAG_LOOP_COUNT, 0
  445.     ldi     ZH, high(tags<< 1)
  446.     ldi     ZL, low(tags << 1)
  447.    
  448.     ;ldi        YH,HIGH(LINE << 1)
  449.     ;ldi        YL,LOW(LINE << 1)
  450. COMPARETAGS_LOOP_1:
  451.    
  452.     add     ZL, param0
  453.     clr     param0
  454.     COMPARETAGS_LOOP_2:
  455.         add     ZL,param0  
  456.         add     YL,param0
  457.         lpm     r16, Z
  458.         ldd     param1, Y+0
  459.         sub     ZL,param0
  460.         sub     YL, param0
  461.         inc     param0
  462.         cp      r16, param1
  463.         brne    COMPARETAGS_RETURN_FALSE
  464.         cpi     param0, 10
  465.         brlo    COMPARETAGS_LOOP_2
  466.  
  467.  
  468.     COMPARETAGS_SUCCESS:
  469.     mov     r16, TAG_LOOP_COUNT
  470.     ;rcall  WELCOME_SCREEN
  471.     jmp     COMPARETAGS_END
  472.  
  473.     COMPARETAGS_RETURN_FALSE:
  474.     ldi     r16, 9
  475.     inc     TAG_LOOP_COUNT
  476.     ldi     param0, 12
  477.     cpi     TAG_LOOP_COUNT, 6   ; <- 6 = number of strings
  478.     brlo    COMPARETAGS_LOOP_1 
  479.    
  480.     ;jmp        COMPARETAGS_END
  481.  
  482.     COMPARETAGS_END:
  483.  
  484.    
  485.  
  486.     ;mov        param1, r16
  487.     pop     param1
  488.     pop     param0
  489.    
  490.     ret
  491.      
  492.  
  493.  
  494. ; ***************** END RFID FUNCTIONS ********************
  495.  
  496.  
  497.        
  498. INTINTA:           
  499.  
  500.  
  501.     reti
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515. /*
  516. WRITELINE:          ; (Temporärt)
  517.     push    param1
  518.     ldd     param1, Y+0
  519.     rcall   LCD_DISPLAY_CHAR
  520.     ldd     param1, Y+1
  521.     rcall   LCD_DISPLAY_CHAR
  522.     ldd     param1, Y+2
  523.     rcall   LCD_DISPLAY_CHAR
  524.     ldd     param1, Y+3
  525.     rcall   LCD_DISPLAY_CHAR
  526.     ldd     param1, Y+4
  527.     rcall   LCD_DISPLAY_CHAR
  528.     ldd     param1, Y+5
  529.     rcall   LCD_DISPLAY_CHAR
  530.     ldd     param1, Y+6
  531.     rcall   LCD_DISPLAY_CHAR
  532.     ldd     param1, Y+7
  533.     rcall   LCD_DISPLAY_CHAR
  534.     ldd     param1, Y+8
  535.     rcall   LCD_DISPLAY_CHAR
  536.     ldd     param1, Y+9
  537.     rcall   LCD_DISPLAY_CHAR
  538.     pop     param1
  539. ret
  540.  
  541.  
  542. INITLINE:           ; (Temporärt)
  543.     ldi     ZH, high(line_init_tag << 1)
  544.     ldi     ZL, low(line_init_tag << 1)
  545.     lpm     tmp, Z+0
  546.     std     Y+0, tmp
  547.     lpm     tmp, Z+1
  548.     std     Y+1, tmp
  549.     lpm     tmp, Z+2
  550.     std     Y+2, tmp
  551.     lpm     tmp, Z+3
  552.     std     Y+3, tmp
  553.     lpm     tmp, Z+4
  554.     std     Y+4, tmp
  555.     lpm     tmp, Z+5
  556.     std     Y+5, tmp
  557.     lpm     tmp, Z+6
  558.     std     Y+6, tmp
  559.     lpm     tmp, Z+7
  560.     std     Y+7, tmp
  561.     lpm     tmp, Z+8
  562.     std     Y+8, tmp
  563.     lpm     tmp, Z+9
  564.     std     Y+9, tmp
  565. ret */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement