{ Active multi baudrate comms using smartpins Ozpropdev May 2018 } sys_clk = 80_000_000 tx_pin = 62 total_pins = 6 'User defined baurates baudrate1 = 9600 'P02 baudrate2 = 19200 'P01 baudrate3 = 38400 'P00 baudrate4 = 115200 'P63 'pin 62 (Tx) skipped baudrate5 = 460800 'P61 baudrate6 = 1_000_000 'P60 dat org reset hubset #$ff '80Mhz clock wrpin #%1_11110_0,#tx_pin 'setup async tx wxpin configs+3,#tx_pin 'default 115_200 dirh #tx_pin 'Setup 6 smartpins as async rx with different baudrates setup mov base,#configs mov pin,#2 'start at P02 rep @rep_end,#total_pins getnib pa,pin_offsets,#7 'get pin offset setnib pin_mode,pa,#7 shl pin_offsets,#4 wrpin pin_mode,pin 'configure smartpin for async rx altd base,index wxpin 0-0,pin 'set baudrate dirh pin 'enable smartpin decmod pin,#63 'next pin cmp pin,#tx_pin wz if_e sub pin,#1 'skip tx pin rep_end 'Test for "baud" message at all baudrates check mov base,#msg1 mov pin,#2 mov pin_count,#total_pins .loop testp pin wc 'any data received? if_nc jmp #.loop2 rdpin pa,pin getbyte pa,pa,#3 'get Rx byte cmp pin,current wz if_e call #send_char 'echo @ current baudrate only altd base rolbyte 0-0,pa,#0 'shift byte into msg altd base cmp 0-0,autobaud_seq wz 'msg = "baud" ? if_e call #switch_baudrate .loop2 add base,#1 decmod pin,#63 'next pin cmp pin,#tx_pin wz if_e sub pin,#1 'skip tx pin djnz pin_count,#.loop jmp #check 'switch to new baudrate switch_baudrate mov current,pin mov pa,pin_count 'get baudrate subr pa,#total_pins mov pb,#configs altd pb,pa wxpin 0-0,#tx_pin 'set tx to new baudrate loc ptra,#\labels shl pa,#4 add ptra,pa call #print 'show baudrate message ret print rdbyte pa,ptra++ wz if_z ret call #send_char jmp #print newline mov pb,#13 send_char rdpin pb,#tx_pin wc if_c jmp #send_char wypin pa,#tx_pin ret current long 63 autobaud_seq long "b" << 24 | "a" << 16 | "u" << 8 | "d" pin_offsets long %0101_0110_0111_0000_0010_0011_0000_0000 '-3,-2,-1,0,+2,+3 pin_mode long %0_11111_0 'async Rx index long 1 << 9 'base += 1 configs long (round(float(sys_clk) / float(baudrate1) * 65536.0) & $FFFFFC00 ) | 7 long (round(float(sys_clk) / float(baudrate2) * 65536.0) & $FFFFFC00 ) | 7 long (round(float(sys_clk) / float(baudrate3) * 65536.0) & $FFFFFC00 ) | 7 long (round(float(sys_clk) / float(baudrate4) * 65536.0) & $FFFFFC00 ) | 7 long (round(float(sys_clk) / float(baudrate5) * 65536.0) & $FFFFFC00 ) | 7 long (round(float(sys_clk) / float(baudrate6) * 65536.0) & $FFFFFC00 ) | 7 pin_count res 1 base res 1 pin res 1 msg1 res total_pins orgh labels byte 13,"9_600 baud ",13,0 byte 13,"19_200 baud ",13,0 byte 13,"38_400 baud ",13,0 byte 13,"115_200 baud ",13,0 byte 13,"460_800 baud ",13,0 byte 13,"1M baud ",13,0