; ************************************ ; *********************************** ; ** SERIAL COMMUNICATION ROUTINES ; ** BY PEK ´2000 ; *********************************** ; ************************************ .cseg ; ************************************ ; * Register and Constant Definitions ; ************************************ .def temp =R16 .def delay1 =R17 .def delay2 =R18 .def delay3 =R19 .def numb_b =R20 ; Number of bytes to send/receive in a sequence ; More used registers are R0, ZL and ZH ; ************************************ ; * Macros ; ************************************ .macro SDTIME ; To Set Delay Times ldi delay3,@0 ldi delay2,@1 ldi delay1,@2 .endmacro ; ************************************ ; * Send a Byte ; * ; * temp = byte to send ; ************************************ Send_Byte: sbis USR,UDRE ; Loop if transmit not complete rjmp Send_Byte out UDR,temp ret ; ************************************ ; * Send Sequence of Bytes ; * ; * Z = start of sequence ; * numb_b = number of bytes ; ************************************ Send_Sequence: sbis USR,UDRE ; Loop if transmit not complete rjmp Send_Sequence ld temp,Z+ out UDR,temp ; Send next byte in sequence dec numb_b brne Send_Sequence ; Is all bytes transfered ? ret ; ************************************ ; * Send Sequence of Bytes from Flash ; * ; * Z = start of sequence ; * numb_b = number of bytes ; ************************************ Send_Sequence_Flash: sbis USR,UDRE ; Loop if transmit not complete rjmp Send_Sequence_Flash lpm out UDR,R0 ; Send next byte in the sequence adiw ZL,1 ; Point to next byte dec numb_b brne Send_Sequence_Flash ; Is all bytes transfered ? ret ; ************************************ ; * Wait for a byte to be received ; * ; * temp = received byte ; ************************************ Wait_UART_Receive: SDTIME 16,0,0 ; Set Delay Time ca 1 sek (at 4 MHz) clr temp WUR_Loop: sbic USR,RXC ; Wait for byte to be received rjmp WUR_Get_Byte dec delay1 ; Wait MAX 1 sek for computer to brne WUR_Loop ; send byte. dec delay2 brne WUR_Loop dec delay3 brne WUR_Loop ; If something wrong happend, mov R0,temp ; R0 is 0x00. ret WUR_Get_Byte: in temp,UDR ret