; ; bdetect.asm ; .include "tn13def.inc" .equ rxpin = PB3; receive pin .equ txpin = PB2; transmit pin .def bitcnt = R16; bit counter .def temp = R17; temporary storage .def temp1 = R18; temporary storage .def b = R21; b as a register so we can change it .def txbyte = R19; transmit byte .def rxbyte = R20; receive byte .def try = R22 .equ tries = 3 ;try a few times at each speed in case of sync probs .equ minB = 10 ;b will try between min and max .equ maxB = 255 .equ V = 86 ;use V as our trial letter, since it has a nice bunch of 1's and 0's... ;bit delays so far (5v, 9600) ;default everything - b = 17 ;set OSCCAL to max (7f) - b = 23 ;set OSCCAL to max, divisor to 2 - b = 103 ;set OSCCAL to max, divisor to 1 - b = 213 .cseg .org 0 rjmp reset ; ; putchar ; assumes no line driver (doesn't invert bits) ; .equ sb = 1; number of stop bits putchar: ldi bitcnt, 9+sb; 1+8+sb com txbyte; invert everything sec; set start bit putchar0: brcc putchar1; if carry set sbi PORTB, txpin; send a '0' rjmp putchar2; else putchar1: cbi PORTB, txpin ; send a '1' nop ; even out timing putchar2: rcall bitdelay; one bit delay rcall bitdelay lsr txbyte; get next bit dec bitcnt; if not all bits sent brne putchar0; send next bit ret; ; ; getchar ; assumes no line driver (doesn't invert bits) ; getchar: ldi bitcnt,9 ; 8 data bit + 1 stop bit getchar1: sbis PINB, rxpin ; wait for start bit rjmp getchar1 rcall bitdelay ; 0.5 bit delay getchar2: rcall bitdelay ; 1 bit delay rcall bitdelay ; clc ; clear carry sbis PINB, rxpin ; if RX pin high skip sec ; otherwise set carry dec bitcnt breq getchar3 ; return if all bits read ror rxbyte ; otherwise shift bit into receive byte rjmp getchar2 ; go get next bit getchar3: ret ; ; bit delay bitdelay: mov temp, b bitloop: dec temp brne bitloop ret ; ; print_delay ; delay between printed lines ; .equ delay = 100 print_delay: ldi temp1, delay charloop1: ldi temp, delay charloop0: dec temp brne charloop0 dec temp1 brne charloop1 ret ; ; print ; prints a null-terminated string ; print: print_loop: lpm mov txbyte,R0 cpi txbyte,0 breq return rcall putchar inc zl rjmp print_loop return: ret ; ; string to print ; print_string: .db "hello",13,10,0 ; ; main program ; reset: ldi temp, low(RAMEND) ; set stack pointer to top of RAM out SPL, temp ; sbi PORTB, txpin; init comm pin ldi temp, 0x7f ; maximum RC clock out OSCCAL, temp ldi temp, (1 << CLKPCE) ; set clock divider ldi temp1, (0<