; William Lark, Jr. ; ; How to make something that makes almost anything Spring 04 ; hello_Will.asm ; ref - Neil Gershenfeld CBA MIT 2/14/04 ; edited by Will Lark MIT 3/6/04 ; AVR ; .include "tn15def.inc" .equ txpin = PB3; transmit pin .def bitcnt = R16; bit counter .def temp = R17; temporary storage .def temp1 = R18; temporary storage .def txbyte = R19; data byte .cseg .org 0 rjmp mainprgm ; go to the main program "mainprgm" ; ; Program text output "Hola Buenas tardes" ; mainprgm: sbi PORTB, txpin; init comm pin sbi DDRB, txpin rptmessage: ldi Txbyte, 'H' rcall plctext ldi Txbyte, 'o' rcall plctext ldi Txbyte, 'l' rcall plctext ldi Txbyte, 'a' rcall plctext ldi Txbyte, ' ' rcall plctext ldi Txbyte, ' ' rcall plctext ldi Txbyte, 'B' rcall plctext ldi Txbyte, 'u' rcall plctext ldi Txbyte, 'e' rcall plctext ldi Txbyte, 'n' rcall plctext ldi Txbyte, 'a' rcall plctext ldi Txbyte, 's' rcall plctext ldi Txbyte, ' ' rcall plctext ldi Txbyte, 't' rcall plctext ldi Txbyte, 'a' rcall plctext ldi Txbyte, 'r' rcall plctext ldi Txbyte, 'd' rcall plctext ldi Txbyte, 'e' rcall plctext ldi Txbyte, 's' rcall plctext ldi Txbyte, ' ' rcall plctext ldi Txbyte, ' ' rcall plctext rcall slowtext rjmp rptmessage ; ; Slow down the text "slowtext" ; .equ delay = 200 slowtext: ldi temp1, delay rpttext1: ldi temp, delay rpttext0: dec temp brne rpttext0 dec temp1 brne rpttext1 ret ; ; Place the Text "plctext" ; .equ sb = 1; number of stop bits plctext: ldi bitcnt, 9+sb; 1+8+sb com txbyte; invert everything sec; set start bit plctext0: brcc plctext1; if carry set sbi PORTB, txpin; send a '0' rjmp plctext2; else plctext1: cbi PORTB, txpin ; send a '1' nop ; even out timing plctext2: rcall slowbit; one bit delay rcall slowbit lsr txbyte; get next bit dec bitcnt; if not all bits sent brne plctext0; send next bit ret ; ; Slow down the bit speed "slowbit" ; ; 1 MHz crystal: 9600 bps - b=14, 19200 bps - b=5, 28800 bps - b=2 ; .equ b = 16 slowbit: ldi temp, b bitloop: dec temp brne bitloop ret ; ; Sow down the text "slowtext" ; .equ delay = 200 slowtext: ldi temp1, delay rpttext: ldi temp, delay rpttext0: dec temp brne rpttext0 dec temp1 brne rpttext1 ret