All pastes #31287 Raw Edit

Code

public text v1 · immutable
#31287 ·published 2005-11-26 04:26 UTC
rendered paste body

.include "C:\PROGRA~1\VMLAB\include\Tn15def.inc"
;***** Pin definitions

.equ	RxD	=0			;Receive pin is PB0
.equ	TxD	=2			;Transmit pin is PB2
.equ AIN  =3			;Analog input is PB3
;***** Global register variables

.def	temp		=R16			;temporary storage register
.def	bitcnt	=R17			;bit counter
.def	Txbyte	=R18			;Data to be transmitted
.def	RXbyte	=R19			;Received data

.def buffer1	=R20			;Buffer bytes
.def buffer2	=R21
.def buffer3	=R22
.def buffer4	=R23
.def orary	=R24

.cseg
.org 0
	rjmp	reset
	rjmp reset
	rjmp reset
	rjmp reset
	rjmp reset
	rjmp reset
	rjmp reset
	rjmp reset
	rjmp reset
;***************************************************************************
;*
;* "putchar"
;*
;* This subroutine transmits the byte stored in the "Txbyte" register
;* The number of stop bits used is set with the sb constant
;*
;* Number of words	:14 including return
;* Number of cycles	:Depens on bit rate
;* Low registers used	:None
;* High registers used	:2 (bitcnt,Txbyte)
;* Pointers used	:None
;*
;***************************************************************************
.equ		sb	=1		;Number of stop bits (1, 2, ...)

putchar:	ldi	bitcnt,9+sb	;1+8+sb (sb is # of stop bits)
		com	Txbyte		;Inverte everything
		sec			;Start bit

putchar0:	brcc	putchar1	;If carry set
		cbi	PORTB,TxD	;    send a '0'
		rjmp	putchar2	;else	

putchar1:	sbi	PORTB,TxD	;    send a '1'
		nop

putchar2:	rcall UART_delay	;One bit delay
		rcall UART_delay

		lsr	Txbyte		;Get next bit
		dec	bitcnt		;If not all bit sent
		brne	putchar0	;   send next
					;else
		ret			;   return


;***************************************************************************
;*
;* "getchar"
;*
;* This subroutine receives one byte and returns it in the "Rxbyte" register
;*
;* Number of words	:14 including return
;* Number of cycles	:Depens on when data arrives
;* Low registers used	:None
;* High registers used	:2 (bitcnt,Rxbyte)
;* Pointers used	:None
;*
;***************************************************************************

getchar:	ldi 	bitcnt,9	;8 data bit + 1 stop bit
ldi temp, 0x62
out OSCCAL, temp

getchar1:	sbic 	PINb,RxD	;Wait for start bit
		rjmp 	getchar1

		rcall UART_delay	;0.5 bit delay

getchar2:	rcall UART_delay	;1 bit delay
		rcall UART_delay		

		clc			;clear carry
		sbic 	PINb,RxD	;if RX pin high
		sec			;

		dec 	bitcnt		;If bit is stop bit
		breq 	getchar3	;   return
					;else
		ror 	Rxbyte		;   shift bit into Rxbyte
		rjmp 	getchar2	;   go get next

getchar3:	ret


;***************************************************************************
;*
;* "UART_delay"
;*
;* This delay subroutine generates the required delay between the bits when
;* transmitting and receiving bytes. The total execution time is set by the
;* constant "b":
;*
;*	3·b + 7 cycles (including rcall and ret)
;*
;* Number of words	:4 including return
;* Low registers used	:None
;* High registers used	:1 (temp)
;* Pointers used	:None
;*
;***************************************************************************
; Some b values: 	(See also table in Appnote documentation)
;
; 1 MHz crystal:
;   9600 bps - b=14
;  19200 bps - b=5
;  28800 bps - b=2
;
; 2 MHz crystal:
;  19200 bps - b=14
;  28800 bps - b=8
;  57600 bps - b=2

; 4 MHz crystal:
;  19200 bps - b=31
;  28800 bps - b=19
;  57600 bps - b=8
; 115200 bps - b=2

.equ	b	=50 ;4800 8n1 @ 1.6mhz


UART_delay:	ldi	temp,b
UART_delay1:	dec	temp
		brne	UART_delay1

		ret

;***** Master Delay
mdelay:
ldi temp, 255
ldi orary, 255
l1:
dec temp
brne	l1
dec orary
brne l1
ret
;***** Test program

reset:
sbi  PORTB, TxD	;Set TX pin to output
sbi	DDRb,TxD
sbi PORTB, 3
cbi DDRb, 3

clr orary
clr temp
;sbi DDRB, 1		;Set OC1A (PWM_out) pin to output
;sbi PORTB, 1	;and enable normal PWM mode (no clock)
;ldi temp, 0b01100000
;out TCCR1, temp

ldi temp, 0b00100010;ADC results left adjusted (8bit)
out ADMUX, temp	;PB3 (ADC2) selected as input

ldi temp, 0b11100101;Enable the ADC at 50khz, free running?
out ADCSR, temp

rcall mdelay
newforever:


in buffer1, ADCL
in buffer2, ADCH
mov txbyte, buffer2
rcall putchar
rcall mdelay


rjmp newforever