.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