con samples = 1000 '8192 start_pin = 0 last_pin = 58 start_speed = 80 speed_adj = 20 max_speed = 300 dv = 12,mlt = 80 clk = 1 << 24 | (dv-1) << 18 | (mlt-1) << 8 baudrate = 9600 '115200 rx_pin = 63 tx_pin = 62 dat org 'wait for keypress to start wait4key testp #rx_pin wc if_c jmp #wait4key mov speed,#start_speed new_speed qmul speed,##1_000_000 getqx clkfreq qdiv clkfreq,##baudrate getqx bpc shl bpc,#16 and bpc,##$FFFFFC00 or bpc,#7 ' clk = 1 << 24 | (dv-1) << 18 | (mlt-1) << 8 mov clock,speed sub clock,#1 shl clock,#8 or clock,##1 << 24 | (dv-1) << 18 mov clk1,clock or clk1,#%1111_01_00 mov clk2,clock or clk2,#%1111_01_11 hubset clk1 'enable crystal+PLL, stay in 20MHz+ mode waitx ##20_000_000/100 'wait ~10ms for crystal+PLL to stabilize hubset clk2 'now switch to PLL running at 80MHz cmp first,#1 wz wrpin #%1_11110_0,#tx_pin wxpin bpc,#tx_pin dirh #tx_pin ' waitx clkfreq 'wait ~10ms for crystal+PLL to stabilize mov first,#1 ' %AAAA_BBBB_FFF_PPPPPPPPPPPPP_TT_MMMMM_0 ' MMMMM = 01111 = periodic/continuous: inc on A-high {/ dec on B-high} mov pin,#start_pin 'show clock speed and sample count call #newline mov digits,#3 mov pb,speed call #send_dec loc ptra,#@msg call #print mov digits,#5 mov pb,##samples call #send_dec loc ptra,#@msg2 call #print '============================================== main 'Get GIO data mov max,#0 mov min,##$ffffffff wrpin ##%100000_0000000_00_01111_0,pin 'ADC,GIO,1x,Fast,Fast wxpin ##$FFFF,pin wypin #0,pin dirh pin 'enable counter mov temp,pin or temp,#%01<<6 setse1 temp 'se1 triggers on adc sample 'show pin number mov digits,#2 mov pb,pin call #send_dec mov char,#" " call #send_char 'collect samples loc ptra,#@buffer mov count,##samples loop waitse1 'wait adc sample rdpin value,pin 'get adc sample wrword value,ptra++ setbyte dacmod,value,#1 'output lower byte of sample to P31 DAC djnz count,#loop 'find mix/max values loc ptra,#@buffer mov count,##samples loop2 rdword pb,ptra++ cmp pb,min wcz if_b mov min,pb cmp pb,max wcz if_a mov max,pb djnz count,#loop2 'show results mov digits,#5 mov pb,min call #send_dec mov char,#" " call #send_char mov pb,max call #send_dec mov char,#" " call #send_char add max,min shr max,#1 mov pb,max call #send_dec mov char,#" " call #send_char mov v1,max '====================================== 'GET VIO data dirl pin 'reset smart pin mov max,#0 mov min,##$ffffffff wrpin ##%100001_0000000_00_01111_0,pin 'ADC,VIO,1x,Fast,Fast wxpin ##$FFFF,pin wypin #0,pin dirh pin 'enable counter mov temp,pin or temp,#%01<<6 setse1 temp 'se1 triggers on adc sample 'get samples loc ptra,#@buffer mov count,##samples loop3 waitse1 'wait adc sample rdpin value,pin 'get adc sample wrword value,ptra++ setbyte dacmod,value,#1 'output lower byte of sample to P31 DAC djnz count,#loop3 'find min/max loc ptra,#@buffer mov count,##samples loop4 rdword pb,ptra++ cmp pb,min wcz if_b mov min,pb cmp pb,max wcz if_a mov max,pb djnz count,#loop4 'show results mov digits,#5 mov pb,min call #send_dec mov char,#" " call #send_char mov pb,max call #send_dec mov char,#" " call #send_char add max,min shr max,#1 mov pb,max call #send_dec mov char,#" " call #send_char mov v2,max sub v2,v1 mov pb,v2 call #send_dec call #newline tx_busy rdpin ax5,#tx_pin wc 'wait for tx to finish before switching clock if_c jmp #tx_busy 'reset and clear smart pin fltl pin wrpin #0,pin incmod pin,#last_pin wz if_nz jmp #main add speed,#speed_adj cmp speed,#max_speed wcz if_be jmp #new_speed hubset #1 cogstop #0 '************************************************* newline mov char,#13 call #send_char mov char,#10 call #send_char ret value long 0 first long 0 softmod long %0000_100001001_00_00000_0 'ADC,GIO,1x,1k5 PU,1k5 PD dacmod long %10100_00000000_00_00000_0 'DAC,990R,3V3 print rdbyte char,ptra++ wz if_z ret call #send_char jmp #print send_char rdpin ax5,#tx_pin wc if_c jmp #send_char wypin char,#tx_pin ret wcz send_hex4 shl pa,#16 mov cx5,#4 jmp #sh2 send_hex8 mov cx5,#8 sh2 getnib char,pa,#7 cmp char,#9 wcz if_a add char,#"A"-10 if_be add char,#"0" call #send_char rol pa,#4 djnz cx5,#sh2 ret send_dec mov dx5,#1 cmp digits,#0 wcz if_e mov digits,#1 cmp digits,#1 wcz if_e jmp #dec2 mov dg,digits sub dg,#1 rep @decx,dg mov ex5,dx5 shl dx5,#3 add dx5,ex5 add dx5,ex5 decx ' mov dx5,##10_000 dec2 mov ex5,digits ddd qdiv pb,dx5 getqx char add char,#"0" call #send_char getqy pb qdiv dx5,#10 getqx dx5 djnz ex5,#ddd ret v1 long 0 v2 long 0 ax5 long 0 cx5 long 0 dx5 long 0 ex5 long 0 char long 0 count long 0 digits long 0 dg long 0 pin long 0 temp long 0 max long 0 min long $ffffffff max2 long 0 min2 long $ffffffff bpc long 0 clkfreq long 0 speed long 0 clock long 0 clk1 long 0 clk2 long 0 orgh $400 msg byte " MHz clock * ",0 msg2 byte "samples",13,10 byte "===============================================",13,10 byte " GIO VIO",13,10 byte "# min max avg min max avg range",13,10 byte "===============================================",13,10,0 orgh $801 buffer long 0[samples]