Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "atmega328p_def_inc.S"
  2.  
  3. .org 0
  4.    rjmp main
  5.  
  6.  main:
  7.     ; reset system status
  8.     ldi r16,0
  9.     out SREG,r16
  10.  
  11.     ; init stack pointer
  12.     ldi r16,lo8(RAMEND)
  13.     out SPL,r16
  14.     ldi r16,hi8(RAMEND)
  15.     out SPH,r16
  16.  
  17.     rcall uart_init
  18.     rjmp mainloop
  19.  
  20. ;-----------------------------------------------------------
  21. ; UART
  22. ;-----------------------------------------------------------
  23. uart_init:
  24.   ; set baud rate to 1 Mbps
  25.   ldi r16, 1<<U2X0
  26.   sts UCSR0A, r16
  27.   ldi r16, 0
  28.   sts UBRR0H, r16
  29.   ldi r16, 1
  30.   sts UBRR0L, r16
  31.  
  32.   ; enable receive and transmit, without interrupts
  33.   ldi r16, (1<<RXEN0)|(1<<TXEN0)
  34.   sts UCSR0B,r16
  35.  
  36.   ; frame format: 8 data bits, 1 stop bit, no parity.
  37.   ldi r16, (1<<UCSZ01)|(1<<UCSZ00)
  38.   sts UCSR0C,r16
  39.  
  40.   ret
  41.  
  42. ; sends one byte over the serial line.
  43. ; data must reside in r17.
  44. uart_send_byte:
  45.   ; wait for send register to become empty
  46.   lds r16, UCSR0A
  47.   sbrs r16, UDRE0
  48.   rjmp uart_send_byte
  49.  
  50.   ; write data to transmit register
  51.   sts UDR0, R17
  52.  
  53.   ; wait for send complete flag (MAY not be necessary)
  54. ;_wait_send_flag:
  55. ;  lds r16, UCSR0A
  56. ;  sbrs r16, TXC0
  57. ;  rjmp _wait_send_flag
  58.  
  59.   ret
  60.  
  61. ; receives one byte from the serial line.
  62. ; data received is moved to r17.
  63. uart_receive_byte:
  64.   ; wait for receive complete flag
  65.   lds r16, UCSR0A
  66.   sbrs r16, RXC0
  67.   rjmp uart_receive_byte
  68.  
  69.   ; write data to r17
  70.   lds r17, UDR0
  71.  
  72.   ret
  73.  
  74.  
  75.  
  76. ;-----------------------------------------------------------
  77. ; main loop
  78. ;-----------------------------------------------------------
  79. #define rcv_count r18
  80. #define snd_count r19
  81.  
  82. .equ RCV_BUF_ADDR, 512
  83. .equ RCV_BUF_MAX_LEN, 64
  84.  
  85. mainloop:
  86.   ; load buffer base addr into pointer register
  87.   ldi r30, lo8(RCV_BUF_ADDR)
  88.   ldi r31, hi8(RCV_BUF_ADDR)
  89.  
  90.   ; reset receive and send counts
  91.   ldi rcv_count, 0
  92.   ldi snd_count, 0
  93.  
  94. rcv_byte:
  95.   rcall uart_receive_byte         ; fetch next byte into r17
  96.   cpi r17, '\n'                   ; echo if newline received
  97.   breq echo
  98.   cpi rcv_count, RCV_BUF_MAX_LEN  ; echo if buf_max_len bytes received
  99.   breq echo
  100.  
  101.   inc rcv_count
  102.   st Z+, r17       ; update receive buffer
  103.   rjmp rcv_byte
  104.  
  105.  
  106. echo:
  107.   ; load buffer base addr into pointer register
  108.   ldi r30, lo8(RCV_BUF_ADDR)
  109.   ldi r31, hi8(RCV_BUF_ADDR)
  110.  
  111. snd_byte:
  112.   ld r17, Z+            ; load what pointer register points to into r17 and increment pointer
  113.   rcall uart_send_byte  ; send byte in r17
  114.   inc snd_count
  115.  
  116.   cp snd_count, rcv_count ; compare send/receive amounts
  117.   breq mainloop           ; if they are equal goto mainloop
  118.   rjmp snd_byte           ; if not, send next byte
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement