.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