Advertisement
Guest User

Untitled

a guest
Mar 1st, 2019
83
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    character_counter = r28
  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    $250
  30.     tagB31: .db "3453453434",0
  31.     .db "3453453445",0
  32.     .db "3453453335",0
  33.     .db "3453423435",0
  34.     .db "3453453435",0
  35.  
  36.     .org    $200       ;0001000000
  37.     line_init_tag: .db "3453453435"
  38.  
  39.  
  40.  
  41.  
  42.  
  43. .dseg
  44. .org    $100
  45. LINE: .byte 10
  46.  
  47.  
  48. .cseg
  49.  
  50.     .org    $000
  51.     rjmp    RESET
  52.  
  53.     .org    $016
  54.     rjmp    USARTINT
  55.  
  56.  
  57.  
  58. RESET:
  59.     clr     r16
  60.     clr     r17
  61.     clr     r18
  62.     clr     r19    
  63.     clr     r20
  64.     clr     r21
  65.     clr     r22
  66.     clr     r26
  67.     clr     r27
  68.     clr     r28
  69.  
  70.  
  71.     ldi     r16,$FF
  72.     out     DDRA,r16
  73.     ldi     r16,$FF
  74.     out     DDRB,r16   
  75.     ldi     r16,$FF
  76.     out     DDRD,r16   
  77.    
  78.  
  79.     ldi     r16,HIGH(RAMEND)    ; Set stackpointer
  80.     out     SPH,r16
  81.     ldi     r16,LOW(RAMEND)
  82.     out     SPL,r16
  83.    
  84.  
  85.  
  86.     ldi     YH,HIGH(LINE*2) ; Set Ypointer to point to LINE
  87.     ldi     YL,LOW(LINE*2)  ;
  88.  
  89.  
  90.     ;clr        r16                                     ; init timer0
  91.     ;ldi        r16,(1<<CS02) | (0<<CS01) |(1<<CS00)    ; Normal mode, prescale clk/64
  92.     ;out    TCCR0,r16
  93.     ldi     r16,(0<<TOIE0) | (0<<TOIE1)     ; enable timer0 & timer 1
  94.     out     TIMSK,r16
  95.  
  96.             ; The MCU Control Register
  97.     ldi     r16, (1<<ISC01) | (0<<ISC00) | (1<<ISC11) | (0<<ISC10)  ; Trigger int 0 and int 1 on falling edge
  98.     out     MCUCR, r16
  99.  
  100.  
  101.     rcall   RFID_LOW_ENABLE
  102.  
  103.     ; General Interrupt Control Register
  104.     ldi     r16,(1<<RXC | 0 << UDRE)
  105.     out     GICR, r16
  106.  
  107.  
  108.  
  109.     call    CLEAR_PORTB
  110.     rcall   LCD_INIT
  111.     ldi     r16,$0
  112.     out     PORTD,r16  
  113.    
  114.  
  115.     out     PORTD,r19
  116.  
  117. USART_Init:
  118.     ldi     r16,(25>>8)
  119.     out     UBRRH, r16
  120.     ldi     r16,25      ; UBRR = 25 => bps = 2400
  121.     out     UBRRL, r16
  122.     ldi     r16, (1<<RxC )  ; Enable receiver
  123.     out     UCSRA,r16
  124.     ldi     r16, (1<<RXEN) |(0<<TXEN)  | (1<<RXCIE ) | (0<<UDRIE ) 
  125.     out     UCSRB,r16
  126.     ldi     r16, (1<<URSEL)|(3<<UCSZ0) | (0 << UMSEL)
  127.     out     UCSRC,r16
  128.     sei
  129. LOOP:
  130.     jmp     LOOP
  131.  
  132. CLEAR_PORTA:
  133.     ldi tmp, $00
  134.     out PORTA, tmp
  135.     ret
  136.    
  137. CLEAR_PORTB:
  138.     ldi tmp, $00
  139.     out PORTA, tmp
  140.     ret
  141.  
  142. SLEEP_N_MS:
  143.     push    param0
  144.     push    param1
  145.     clr     param1
  146. SLEEP_N_MS_LOOP:    rcall   SLEEP_1_MS
  147.     inc     param1
  148.     cp      param1, param0
  149.     brlo    SLEEP_N_MS_LOOP
  150.     pop     param1
  151.     pop     param0
  152.     ret
  153.  
  154.  
  155. SLEEP_1_MS:     ; (6 + (4 * 41) * (3 * 2)) = 990 klockcyklar = 0,000978
  156.         push    param0
  157.         push    param1
  158.         clr     param0
  159.     SLEEP_1_MS_LOOP1:   clr     param1
  160.     SLEEP_1_MS_LOOP2:   inc     param1
  161.         cpi     param1, 3
  162.         brne    SLEEP_1_MS_LOOP2
  163.         inc     param0
  164.         cpi     param0, 41
  165.         brne    SLEEP_1_MS_LOOP1
  166.         pop     param1
  167.         pop     param0
  168.         ret
  169.  
  170.  
  171. ; ***************** LCD FUNCTIONS *********************
  172. E_EQUALS_1:
  173.     clr     tmp
  174.     in      tmp,PORTB
  175.     sbr     tmp, en_pin
  176.     out     PORTB,tmp
  177.     ret
  178.  
  179. E_EQUALS_0:
  180.     clr     tmp
  181.     in      tmp,PORTB
  182.     cbr     tmp, en_pin
  183.     out     PORTB,tmp
  184.     ret
  185.  
  186. RS0_RW1:        ;RS=0 och RW=1
  187.     clr     tmp
  188.     in      tmp,PORTB
  189.     cbr     tmp, rs_pin
  190.     sbr     tmp, rw_pin
  191.     out     PORTB,tmp  
  192.     ret
  193.  
  194. RS0_RW0:        ;RS=0 och RW=0
  195.     clr     tmp
  196.     in      tmp,PORTB
  197.     cbr     tmp, rs_pin
  198.     cbr     tmp, rw_pin
  199.     out     PORTB,tmp  
  200.     ret
  201.  
  202.  
  203. CLEAR_lCD:
  204.     ldi     param0, 2
  205.     rcall   SLEEP_N_MS
  206.     ldi     param1, CLEAR_MASK      ; 0000 0001 clear display
  207.     rcall   LCD_INIT_WRITE
  208. ret
  209.  
  210. LCD_INIT:
  211.     push    param0
  212.     push    param1
  213.     ldi     param1, FUNCTION_SET_MASK       ; 0011 1000 function set, 8bit data, 2 lines
  214.     rcall   LCD_INIT_WRITE
  215.     ldi     param1, DISPLAY_MASK        ; 0000 1100 display is turned on
  216.     rcall   LCD_INIT_WRITE
  217.     ldi     param1, CLEAR_MASK      ; 0000 0001 clear display
  218.     rcall   LCD_INIT_WRITE
  219.     ldi     param0, 2
  220.     rcall   SLEEP_N_MS
  221.     ldi     param1, ENTRY_MODE_MASK     ; 0000 0110 cursor moves right
  222.     rcall   LCD_INIT_WRITE
  223.     ldi     param1, RETURN_TO_HOME_MASK     ; 0000 0010  return to home
  224.     rcall   LCD_INIT_WRITE
  225.     pop     param1
  226.     pop     param0
  227.     ret
  228.  
  229. BLIP_NOISE:
  230.     sbi     PORTB, blip_pin
  231.     ldi     param0, 100
  232.     rcall   SLEEP_N_MS
  233.     cbi     PORTB, blip_pin
  234.     ret
  235.  
  236. DIODE_LIGHT_ON:
  237.     sbi     PORTB, diode_pin
  238.     ret
  239.  
  240. DIODE_LIGHT_OFF:
  241.     cbi     PORTB, diode_pin
  242.     ret
  243.  
  244. LCD_INIT_WRITE:
  245.     mov     lcd_data, param1
  246.     cbi     PORTB, rs_pin
  247.     cbi     PORTB, rw_pin
  248.     rcall   LCD_WRITE
  249.     ret
  250.  
  251.  
  252. LCD_DISPLAY_CHAR:
  253.     mov     lcd_data, param1
  254.     sbi     PORTB, rs_pin
  255.     cbi     PORTB, rw_pin
  256.     rcall   LCD_WRITE
  257.     ret
  258.  
  259. LCD_WRITE:
  260.     sbi     PORTB, en_pin
  261.     rcall   SLEEP_1_MS
  262.     out     PORTA, lcd_data
  263.     rcall   SLEEP_1_MS
  264.     cbi     PORTB, en_pin
  265.     rcall   SLEEP_1_MS
  266.     ret
  267.    
  268.  
  269. LCD_WRITE_LINE:        
  270.     push    param0
  271.     clr     param0
  272.     LCD_WRITE_LINE_LOOP:   
  273.         clr     counter
  274.         add     ZL,param0
  275.         lpm     r16,Z
  276.         sub     ZL, param0
  277.         mov     param1, r16
  278.         rcall   LCD_DISPLAY_CHAR
  279.         inc     param0
  280.         cpi     param0, $0A
  281.         brlo    LCD_WRITE_LINE_LOOP
  282.     ;rcall  CLEAR_lCD
  283.     pop     param0
  284.    
  285.     ;rcall  LCD_INIT
  286. ret
  287. ; ***************** END LCD FUNCTIONS *********************
  288.  
  289.  
  290.  
  291. ; ***************** RFID FUNCTIONS ************************
  292.  
  293. RFID_READ:
  294.         ;rcall RFID_LOW_ENABLE
  295.  
  296.  
  297. ret
  298.  
  299. RFID_HIGH_ENABLE:
  300.         sbi     PORTD, rfid_en_pin
  301. ret
  302.  
  303. RFID_LOW_ENABLE:
  304.         cbi     PORTD, rfid_en_pin
  305. ret
  306.  
  307. DIODE_LIGHT:
  308.     sbi     PORTB, diode_pin
  309.     ret
  310.  
  311. DIODE_SWITCH:
  312.     push    param0
  313.     push    param1
  314.     clr     counter
  315.     in      param0, PORTB
  316.     ldi     param1, DIODE_MASK
  317.     eor     param0, param1
  318.     out     PORTB, param0
  319.     pop     param1
  320.     pop     param0
  321. ret
  322.  
  323.  
  324.  
  325.  
  326.  
  327. USARTINT:
  328.  
  329.    
  330.     in      param1, UDR
  331.  
  332.     ;ldi        tmp, $30
  333.     add     param1, tmp
  334.  
  335.     rcall   LCD_DISPLAY_CHAR
  336.    
  337.     inc     r19
  338.     cpi     r19, $0A
  339.     breq    USARTDONE
  340.  
  341.  
  342. USARTINT_END:
  343.     reti
  344.  
  345. USARTDONE:
  346.     ;rcall  INITLINE
  347.     ;rcall  COMPARETAGS
  348.     rcall   RFID_HIGH_ENABLE
  349. ret
  350.  
  351.  
  352. INITLINE:           ; (Temporärt)
  353.     ldi     ZH, high(line_init_tag << 1)
  354.     ldi     ZL, low(line_init_tag << 1)
  355.     lpm     tmp, Z+0
  356.     std     Y+0, tmp
  357.     lpm     tmp, Z+1
  358.     std     Y+1, tmp
  359.     lpm     tmp, Z+2
  360.     std     Y+2, tmp
  361.     lpm     tmp, Z+3
  362.     std     Y+3, tmp
  363.     lpm     tmp, Z+4
  364.     std     Y+4, tmp
  365.     lpm     tmp, Z+5
  366.     std     Y+5, tmp
  367.     lpm     tmp, Z+6
  368.     std     Y+6, tmp
  369.     lpm     tmp, Z+7
  370.     std     Y+7, tmp
  371.     lpm     tmp, Z+8
  372.     std     Y+8, tmp
  373.     lpm     tmp, Z+9
  374.     std     Y+9, tmp
  375.     lpm     tmp, Z+10
  376.     std     Y+10, tmp
  377. ret
  378.  
  379.  
  380.  COMPARETAGS: ; Y = TAG FROM CARD, Z = TAGS FROM MEMORY
  381.     push    param0
  382.     push    param1
  383.     clr     TAG_LOOP_COUNT
  384.     clr     r16
  385.     clr     param0
  386.     ldi     TAG_LOOP_COUNT, 0
  387.     ldi     ZH, high(tagB31<< 1)
  388.     ldi     ZL, low(tagB31 << 1)
  389. COMPARETAGS_LOOP_1:
  390.    
  391.     add     ZL, param0
  392.     clr     param0
  393.     COMPARETAGS_LOOP_2:
  394.         add     ZL,param0  
  395.         add     YL,param0
  396.         lpm     r16, Z
  397.         ldd     param1, Y+0
  398.         sub     ZL,param0
  399.         sub     YL, param0
  400.         inc     param0
  401.         cp      r16, param1
  402.         brne    COMPARETAGS_RETURN_FALSE
  403.         cpi     param0, 10
  404.         brlo    COMPARETAGS_LOOP_2
  405.  
  406.     COMPARETAGS_SUCCESS:
  407.     ldi     param1, $31
  408.     rcall   LCD_DISPLAY_CHAR
  409.     jmp     COMPARETAGS_END
  410.      
  411.     COMPARETAGS_RETURN_FALSE:
  412.     inc     TAG_LOOP_COUNT
  413.     ldi     param0, 12
  414.     cpi     TAG_LOOP_COUNT, 5   ; <- 5 = number of strings
  415.     brlo    COMPARETAGS_LOOP_1 
  416.  
  417.     COMPARETAGS_END:
  418.     pop     param1
  419.     pop     param0
  420.     ret
  421.      
  422.  
  423.  
  424. ; ***************** END RFID FUNCTIONS ********************
  425.  
  426.  
  427.        
  428. INTINTA:           
  429.  
  430.  
  431.     reti
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement