console.s
author Tero Marttila <terom@fixme.fi>
Fri, 07 May 2010 02:04:59 +0300
changeset 11 49c5eeee4cb7
parent 9 30c3807baac1
child 13 a18180e37d57
permissions -rw-r--r--
Echo after greeting
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
.nolist
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
.include "m168def.inc"      ; Same family as 328P
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
.list
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
.macro poke
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
		.message	"No parameters"
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
.endm
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
.macro poke_i_8_i
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
		ldi			@1, @2
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
		sts			@0, @1
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
.endm
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
.macro poke_i_16_i
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
		ldi			@1, low(@3)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
		sts			@0+0, @1
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
		
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
		ldi			@2, high(@3)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
		sts			@0+1, @2
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
.endm
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
;; Load a 16-bit *word* address into the given register a a byte address
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
.macro loadp_16_i
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
		ldi			@0, high(2 * @2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
		ldi			@1, low(2 * @2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
.endm
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
.macro load_16_i
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
		ldi			@0, high(@2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
		ldi			@1, low(@2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
.endm
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
;; Interrupt Vector
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
.org 0x00
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        rjmp        Main
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
;; Serial
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
.set SERIAL_BAUD = 103		; 9.6k @ 16Mhz
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
;; Initialize the UART for 
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
Serial_Init:
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
	; Set up control registers
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
		; Single-speed
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
		poke		[UCSR0A, r16, (0 << U2X0)]
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
		; Async
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
		; n parity
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
		; 1 stop
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
		; 8 bits
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
		poke		[UCSR0C, r16, (0b00 << UMSEL00) | (0b00 << UPM00) | (0 << USBS0) | (0b11 << UCSZ00)]
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
		; Baud rate
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
		poke		[UBRR0L, r16:r17, SERIAL_BAUD]
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
		
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
		; Enable RX
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
		; Enable TX
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
		; 8 bits
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    58
		poke		[UCSR0B, r16, (1 << RXEN0) | (1 << TXEN0) | (0 << UCSZ02)]
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
		
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
	; Done
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
		ret
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
;; Send a single byte on serial port
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
; Input byte in r16
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
Serial_Send:
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
	; Wait for idle
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
		lds			r0, UCSR0A
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
		sbrs		r0, UDRE0
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
		rjmp		Serial_Send
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
	; Copy byte to buffer
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
		sts			UDR0, r16
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
	; Done
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
		ret
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    77
;; Read a single byte from serial port
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    78
; Output byte in r16
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    79
Serial_Recv:
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    80
	; Wait for recv
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    81
		lds			r0, UCSR0A
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    82
		sbrs		r0, RXC0
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    83
		rjmp		Serial_Recv
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    84
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    85
	; Copy byte from buffer
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    86
		lds			r16, UDR0
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    87
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    88
	; Done
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    89
		ret
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    90
9
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
;; Write nul-terminated string to serial port
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
; Input string in Z
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
Serial_Write:
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
	; Load byte to r16
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
		lpm			r16, Z+
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
	; Quit if nul
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
		tst			r16
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
		breq		_serial_write_end
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
	; Write it
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
		rcall		Serial_Send
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
	; Continue
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
		rjmp		Serial_Write
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
_serial_write_end:
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
		ret
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
;; Program
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
message:	.db "Hello World", 13, 10, 0
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
Main:
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
; Initialization
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
	; Stack
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
		poke		[SPL, r16:r17, RAMEND]
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    ; Enable interrupts
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
        sei
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
	; Init
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
		rcall		Serial_Init
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
; Main program
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
		ldi			ZH, high(message * 2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
		ldi			ZL, low(message * 2)
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
		
30c3807baac1 serial console
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
		rcall		Serial_Write
11
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   129
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   130
; Echo out
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   131
		sbi			DDRB, PORTB5
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   132
		ldi			r20, 0
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   133
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   134
Main_Echo:
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   135
		out			PORTB, r20
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   136
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   137
		rcall		Serial_Recv
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   138
		rcall		Serial_Send
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   139
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   140
		com			r20
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   141
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   142
		rjmp		Main_Echo
49c5eeee4cb7 Echo after greeting
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   143