; William Lark, Jr. ; ; How to make something that makes almost anything Spring 04 ; hola_Will.asm ; ref - Neil Gershenfeld CBA MIT 2/14/04 ; edited by Will Lark "How to make..." MIT 3/6/04 ; AVR hello world program ; .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 reset ; ; Place the Text "plctext" ; assumes no line driver (doesn't invert bits) ; .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 charloop1: ldi temp, delay charloop0: dec temp brne charloop0 dec temp1 brne charloop1 ret ; ; main program ; reset: sbi PORTB, txpin; init comm pin sbi DDRB, txpin loop: 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 rcall slowtext rjmp loop