; ; IR CODE ; Serial driver EXTRACTED FROM: ; -----hello3.step.asm ; -----step response measurement for hello3 ; -----Neil Gershenfeld CBA MIT 8/22/04 ; rest by ED BAAFI ; definitions ; .include "tn13def.inc" .equ wait = 0x00 ; wait state .equ init = 0xaa ; init state .equ init2= 0x0a ; init2 state .equ read = 0xff ; read state .equ skip = 0x0f ; skip state .equ zero = 0 ; .equ one = 0 ; .equ txpin = PB1 ; serial transmit pin .equ irpin = PB2 ; ir module pin .def S =R0 ; Sreg storage .def inttemptime =R1 ;temp storage for time in int serv routine .def inttemp1 = R2 .def S1 =R3 Sreg storage for main .def bitcnt = R16 ; bit counter .def timeSincePC = R17 ; .def system = R18; system code .def command = R19; command code .def txbyte = R20 ; data byte .def irbits = R21 ; upwards high byte .def temp = R23 .def temp2 = R24 ; byte built to send 2 pc .def state = R25 ;state of device - read/wait/init .def trequart = R26 ;threequarters of bit time measured during start bit .def inttemp2 = R27 .def outputready = R28 ; ; start of code ; .cseg .org 0 rjmp reset ; jump to reset routine .org PCINT0addr rjmp PCIntV2 ; PCINT2 vector (pin PB2) .org TIM0_OVF0addr rjmp TimOvf0V ; Timer/Counter 0 overflow vector ; ; putchar ; assumes no line driver (doesn't invert bits) ; .equ sb = 1; number of stop bits putchar: in S1, SREG ;store status reg cli 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 out sreg,S1 ;restore SREG sei ret; ; ; bit delay ; .equ b = 78 ; OSCCAL = 0xff 9600 bps bitdelay: ldi temp, b bitloop: dec temp brne bitloop ret ; ; main program ; reset: ldi temp, (1<