;AVR AT90S2313 Test Program - Example #3 ;written 2001 Nov 06 ;by Kenrick Chin ;This program outputs a message to the serial port at 9600 baud ;and echoes any incoming characters. ;Interrupts are not used in this example. ********************************************************* * Hardware Definitions ********************************************************* ;register definitions R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 R16 EQU 16 R17 EQU 17 R18 EQU 18 R19 EQU 19 R20 EQU 20 R21 EQU 21 R22 EQU 22 R23 EQU 23 R24 EQU 24 R25 EQU 25 R26 EQU 26 R27 EQU 27 R28 EQU 28 R29 EQU 29 R30 EQU 30 R31 EQU 31 ********************************************************* * Application Register Assignments ********************************************************* A EQU 16 B EQU 17 char EQU 16 ;index registers X EQU 26 XHI EQU 27 Y EQU 28 YHI EQU 29 Z EQU 30 ZHI EQU 31 ********************************************************* * Hardware I/O Definitions ********************************************************* ;I/O addresses for AT90S2313 UBRRHI EQU $03 ;N/A on AT90S2313 ADCL EQU $04 ;N/A on AT90S2313 ADCH EQU $05 ;N/A on AT90S2313 ADCSR EQU $06 ;N/A on AT90S2313 ADMUX EQU $07 ;N/A on AT90S2313 ACSR EQU $08 UBRR EQU $09 UCR EQU $0A USR EQU $0B UDR EQU $0C ;N/A on AT90S2313 SPCR EQU $0D ;N/A on AT90S2313 SPSR EQU $0E ;N/A on AT90S2313 SPDR EQU $0F ;N/A on AT90S2313 PIND EQU $10 DDRD EQU $11 PORTD EQU $12 PINC EQU $13 DDRC EQU $14 PORTC EQU $15 PINB EQU $16 DDRB EQU $17 PORTB EQU $18 EECR EQU $1C EEDR EQU $1D EEAR EQU $1E WDTCR EQU $21 ICR1L EQU $24 ;$26 on AT90S4433 ICR1H EQU $25 ;$27 on AT90S4433 OCR1L EQU $2A OCR1H EQU $2B TCNT1L EQU $2C TCNT1H EQU $2D TCCR1B EQU $2E TCCR1A EQU $2F TCNT0 EQU $32 TCCR0 EQU $33 MCUSR EQU $34 ;N/A on AT90S2313 MCUCR EQU $35 TIFR EQU $38 TIMSK EQU $39 GIFR EQU $3A GIMSK EQU $3B SP EQU $3D SREG EQU $3F ;UART bit definitions RXC EQU 7 TXC EQU 6 UDRE EQU 5 FE EQU 4 OR EQU 3 ;ASCII codes LF EQU $0A CR EQU $0D SPACE EQU $20 ********************************************************* * INTERRUPT VECTORS ********************************************************* ORG $0000 JMP reset ********************************************************* * CODE SEGMENT ********************************************************* ORG $0010 mess1 FCS "Atmel AVR Example #3" ********************************************************* * Start of main program ********************************************************* reset LDI A $DF OUT SP A ;initialize SP CLR XHI CLR YHI CLR ZHI CALL initSCI ;initialize SCI LDI Z mess1 CALL cprint CALL newln main CALL getc CALL putc BRA main ********************************************************* * UART Interface ********************************************************* ;UART initialization initSCI PUSH A LDI A 51 ;set for 9600 baud OUT UBRR A LDI A %00011000 ;enable RX, TX OUT UCR A PULL A RET ;get character ;return with char = received char getc SBIS USR RXC JMP getc IN char UDR RET ;enter with char = 8-bits putc SBIS USR UDRE JMP putc OUT UDR char RET ;send CR/LF newln PUSH char LDI char CR CALL putc LDI char LF CALL putc PULL char RET ;print constant text from flash memory ;enter with Z = byte address of string ;!!! NOTE: ZHI = 0 is assumed ;updated: Z cprint PUSH R0 PUSH char cprint1 LPM ;get byte into R0 TST R0 BEQ cprint0 MOV char R0 CALL putc ADIW Z,1 JMP cprint1 cprint0 PULL char PULL R0 RET ********************************************************* * END OF CODE SEGMENT ********************************************************* END