;***************************************************************** ; ; File Name : 'echo1.asm' ; Title : Simple serial echo test without interrupts ; Date : 2001.10.08 ; Version : 0.01 ; Author : Pascal Stang ; Target MCU : AT90S8515 ; ;***************************************************************** .nolist .include "8515def.inc" .list ; define constants .equ CR =13 .equ LF =10 .equ BAUD_RATE =9600 .equ CPU_CLOCK =3686000 .equ UART_BAUD_DIV =(CPU_CLOCK/(16*BAUD_RATE))-1 ; define register aliases .def ARG0 =r0 .def ARG1 =r1 .def RETURN0 =r2 .def RETURN1 =r3 .def TEMP0 =r16 .def TEMP1 =r17 ; and as a reminder ;.def XL =r26 ;.def XH =r27 ;.def YL =r28 ;.def YH =r29 ;.def ZL =r30 ;.def ZH =r31 ; begin code .org $000 rjmp reset reset: ldi TEMP0, low(RAMEND) ; initialize stack pointer out SPL, TEMP0 ldi TEMP0, high(RAMEND) out SPH, TEMP0 ldi TEMP0, $FF ; port B all outputs so we can use LEDs out DDRB, TEMP0 out PORTB, TEMP0 ; initially all LEDs off ldi TEMP0, UART_BAUD_DIV ; set baud rate out UBRR, TEMP0 sbi UCR, TXEN ; enable serial transmitter sbi UCR, RXEN ; enable serial receiver loop: rcall getchar ; read serial input mov TEMP0, RETURN0 com TEMP0 out PORTB, TEMP0 ; output received data to LEDs mov ARG0, RETURN0 ; move the RETURN0 value from getchar to ARG0 rcall putchar ; write data to serial port mov TEMP0, RETURN0 cpi TEMP0, CR ; check for carriage return brne loop ldi TEMP0, LF mov ARG0, TEMP0 rcall putchar ; output linefeed after CR rjmp loop ; subroutines and functions ; function getchar ; wait until a character is recevied via the UART ; then return the character in RETURN0 getchar: sbis USR, RXC ; loop until USR:RXC is 1 rjmp getchar in RETURN0, UDR ; return receive data in RETURN0 ret ; function putchar ; wait until UART transmitter is ready ; then send the character in ARG0 putchar: sbis USR, UDRE ; loop until USR:UDRE is 1 rjmp putchar out UDR, ARG0 ; write ARG0 to transmitter buffer ret