??? 08/03/11 09:20 Read: times |
#183167 - something like this , without any warranty : Responding to: ???'s previous message |
mysegcode segment code mysegbit segment bit mysegdata segment data ;---------------- rseg mysegbit tx_bit: ds 1 ;---------------- rseg mysegdata c_maxtxbuflength equ 16 txmsglength: ds 1 txbuffer: ds c_maxtxbuflength txpointer: ds 1 txsendcounter: ds 1 txbytetosend: ds 1 txbitcounter: ds 1 ;----------------- rseg mysegcode org 0 ljmp main_tx_test org 0bh ljmp T0_isr main_tx_test: mov dptr #messagehello call proc_prepare_tx_message ;will send 'HELLO,' call proc_send_message mov dptr #messageworld call proc_prepare_tx_message ;will send 'HELLO,' call proc_send_message jmp main_tx_test ;------------- messagehello: db 'HELLO,',0 ;zero teminated string mesasgeworld: db 'WORLD!',13,10,0 proc_prepare_tx_message: mov r2,#c_maxtxbuflength mov r3,#0 mov r0,#txbuffer pr_pmsgcop_loop: clr a movc a,@a+dptr jz pr_pmsgcop_zeroterm ;zero terminator found mov @r0,a inc r0 inc r7 djnz r2,pr_pmsgcop_loop pr_pmsgcop_zeroterm: mov txmsglength,r7 ret ;------------ proc_send_message: mov a,txmsglength jz proc_send_mes_end mov txsendcounter,a mov txpointer,#0 proc_send_mnext: mov a,txpointer add a,#txbuffer mov r0,a mov a,@r0 setb c rrc a mov tx_bit,c mov txbytetosend,a mov txbitcounter,#10 call inittimerT0 ;this starts sending byte by Timer0 ;sending is moved by ISR for Timer0 proc_send_mes_waitbyte: mov a,txbitcounter jnz proc_send_mes_waitbyte inc txpointer dec txsendcounter mov a,txsendcounter jnz proc_send_mnext proc_send_mes_end: ret ;------------- T0bittime_const equ 65536-416 ;416== bit time in microseconds, xtal=12 MHz, 12 clocker inittimerT0: clr TR0 clr ET0 mov a,TMOD anl a,#0f0h orl a,#1 ;mode 1 for TIMER0 mov TL,#low(T0bittime_const) mov TH,#high(T0bittime_const) clr P3.1 ;start bit bigins here setb TR0 setb ET0 ret ;---------- T0_isr: clr EA push PSW push acc ;output next bit mov c,tx_bit mov P3.1,c ;reload timer clr TR0 mov a,#low(T0bittime_const) add a,TL0 mov TL0,a mov a,#high(T0bittime_const) addc a,TH0 mov TH0,a setb TR0 setb EA ;prepare next bit to send mov a,txbytetosend setb c rrc a mov tx_bit,c mov txbytetosend,a ;checking for byte sended? dec txbitcounter mov a,txbitcounter jnz T0_ISRend ;byte is sended, stop interrupt clr TR0 clr ET0 T0_ISRend: pop acc pop psw reti |