Advertisement
Guest User

Untitled

a guest
Mar 5th, 2019
89
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.     inc     r19
  331.     cpi     r19, $1
  332.     breq    USARTINT_END
  333.    
  334.     add     YL, linepointercounter
  335.     std     Y+0, param1
  336.     sub     YL, linepointercounter
  337.  
  338. USARTINT_INCREASE_ONE_BYTE:
  339.     ldi     tmp, 1
  340.     add     linepointercounter,tmp
  341.  
  342.     cpi     r19, $0B
  343.     breq    USARTDONE
  344.     reti
  345.  
  346. USARTINT_END:
  347.  
  348.  
  349.     reti
  350.  
  351.  
  352. WELCOME_SCREEN:
  353.     push    param0
  354.     push    param1
  355.     ldi     ZH, high(welcome_message << 1)
  356.     ldi     ZL, low(welcome_message << 1)
  357.     rcall   LCD_WRITE_LINE
  358.     ldi     tmp, $30
  359.     mov     param1, r28
  360.     add     param1, tmp
  361.     rcall   LCD_DISPLAY_CHAR
  362.     pop     param1
  363.     pop     param0
  364. ret
  365.  
  366. NOT_ALLOWED:
  367.     ;push   param0
  368. ;   push    param1
  369.     ;ldi        ZH, high(notallowed_message << 1)
  370.     ;ldi        ZL, low(notallowed_message << 1)
  371.     ;rcall  LCD_WRITE_LINE
  372.     ;pop        param1
  373.     ;pop        param0
  374.     ;push   param1
  375.     ldi     param1, $4E
  376.     rcall   LCD_DISPLAY_CHAR
  377. ;   pop     param1
  378.     ;pop        param0
  379. ret
  380.  
  381. USARTDONE:
  382.     ;clr        r16
  383. ;   clr     r19
  384. ;   clr     linepointercounter
  385.     ;rcall  WRITELINE
  386.     ;rcall  INITLINE
  387.     rcall   RFID_HIGH_ENABLE
  388.     rcall   COMPARETAGS
  389.     mov     r28, r16
  390.     mov     param1, r16
  391.     ;mov        param1, r16
  392.     ;ldi        tmp, $30
  393.     ;add        param1, tmp
  394.     ;rcall  LCD_DISPLAY_CHAR
  395.  
  396.  
  397.  
  398.     ;cpi        r28, $9
  399.     ;breq   NOT_ALLOWED
  400.     ;mov        param1, r16
  401.     ldi     tmp, $30
  402.     add     param1, tmp
  403.     rcall   LCD_DISPLAY_CHAR
  404.    
  405.     ;cpi        r28, 9
  406.     ;brlo   WELCOME_SCREEN
  407.  
  408.  
  409.     rcall   LONG_SLEEP
  410.    
  411.     ;ldi        tmp, $30
  412.     ;add        param1, tmp
  413.     ;mov        param1, r16
  414.     ;ldi        tmp, 30
  415.     ;add        param1, tmp
  416.     ;rcall  LCD_DISPLAY_CHAR
  417.  
  418.     ;clr        param0
  419.     ;clr        param1
  420.     rcall   CLEAR_LCD
  421.     rcall   RFID_LOW_ENABLE
  422. reti
  423.  
  424.  
  425.  
  426. LONG_SLEEP:
  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.     ldi     param0, $FF
  436.     rcall   SLEEP_N_MS
  437.     ldi     param0, $FF
  438.     rcall   SLEEP_N_MS
  439.     ldi     param0, $FF
  440.     rcall   SLEEP_N_MS
  441.     ldi     param0, $FF
  442.     rcall   SLEEP_N_MS
  443.     ldi     param0, $FF
  444.     rcall   SLEEP_N_MS
  445.     ldi     param0, $FF
  446.     rcall   SLEEP_N_MS
  447.     ldi     param0, $FF
  448.     rcall   SLEEP_N_MS
  449.     ldi     param0, $FF
  450.     rcall   SLEEP_N_MS
  451.     ldi     param0, $FF
  452.     rcall   SLEEP_N_MS
  453. ret
  454.  
  455.  COMPARETAGS: ; Y = TAG FROM CARD, Z = TAGS FROM MEMORY
  456.     push    param0
  457.     push    param1
  458.     clr     TAG_LOOP_COUNT
  459.     clr     r16
  460.     clr     param0
  461.     ldi     TAG_LOOP_COUNT, 0
  462.     ldi     ZH, high(tags<< 1)
  463.     ldi     ZL, low(tags << 1)
  464.    
  465.     ;ldi        YH,HIGH(LINE << 1)
  466.     ;ldi        YL,LOW(LINE << 1)
  467. COMPARETAGS_LOOP_1:
  468.    
  469.     add     ZL, param0
  470.     clr     param0
  471.     COMPARETAGS_LOOP_2:
  472.         add     ZL,param0  
  473.         add     YL,param0
  474.         lpm     r16, Z
  475.         ldd     param1, Y+0
  476.         sub     ZL,param0
  477.         sub     YL, param0
  478.         inc     param0
  479.         cp      r16, param1
  480.         brne    COMPARETAGS_RETURN_FALSE
  481.         cpi     param0, 10
  482.         brlo    COMPARETAGS_LOOP_2
  483.  
  484.  
  485.     COMPARETAGS_SUCCESS:
  486.     mov     r16, TAG_LOOP_COUNT
  487.     ;rcall  WELCOME_SCREEN
  488.     jmp     COMPARETAGS_END
  489.  
  490.     COMPARETAGS_RETURN_FALSE:
  491.     ldi     r16, 9
  492.     inc     TAG_LOOP_COUNT
  493.     ldi     param0, 12
  494.     cpi     TAG_LOOP_COUNT, 6   ; <- 6 = number of strings
  495.     brlo    COMPARETAGS_LOOP_1 
  496.    
  497.     ;jmp        COMPARETAGS_END
  498.  
  499.     COMPARETAGS_END:
  500.  
  501.    
  502.  
  503.     ;mov        param1, r16
  504.     pop     param1
  505.     pop     param0
  506.    
  507.     ret
  508.      
  509.  
  510.  
  511. ; ***************** END RFID FUNCTIONS ********************
  512.  
  513.  
  514.        
  515. INTINTA:           
  516.  
  517.  
  518.     reti
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532. /*
  533. WRITELINE:          ; (Temporärt)
  534.     push    param1
  535.     ldd     param1, Y+0
  536.     rcall   LCD_DISPLAY_CHAR
  537.     ldd     param1, Y+1
  538.     rcall   LCD_DISPLAY_CHAR
  539.     ldd     param1, Y+2
  540.     rcall   LCD_DISPLAY_CHAR
  541.     ldd     param1, Y+3
  542.     rcall   LCD_DISPLAY_CHAR
  543.     ldd     param1, Y+4
  544.     rcall   LCD_DISPLAY_CHAR
  545.     ldd     param1, Y+5
  546.     rcall   LCD_DISPLAY_CHAR
  547.     ldd     param1, Y+6
  548.     rcall   LCD_DISPLAY_CHAR
  549.     ldd     param1, Y+7
  550.     rcall   LCD_DISPLAY_CHAR
  551.     ldd     param1, Y+8
  552.     rcall   LCD_DISPLAY_CHAR
  553.     ldd     param1, Y+9
  554.     rcall   LCD_DISPLAY_CHAR
  555.     pop     param1
  556. ret
  557. INITLINE:           ; (Temporärt)
  558.     ldi     ZH, high(line_init_tag << 1)
  559.     ldi     ZL, low(line_init_tag << 1)
  560.     lpm     tmp, Z+0
  561.     std     Y+0, tmp
  562.     lpm     tmp, Z+1
  563.     std     Y+1, tmp
  564.     lpm     tmp, Z+2
  565.     std     Y+2, tmp
  566.     lpm     tmp, Z+3
  567.     std     Y+3, tmp
  568.     lpm     tmp, Z+4
  569.     std     Y+4, tmp
  570.     lpm     tmp, Z+5
  571.     std     Y+5, tmp
  572.     lpm     tmp, Z+6
  573.     std     Y+6, tmp
  574.     lpm     tmp, Z+7
  575.     std     Y+7, tmp
  576.     lpm     tmp, Z+8
  577.     std     Y+8, tmp
  578.     lpm     tmp, Z+9
  579.     std     Y+9, tmp
  580. ret */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement