'P2 DAC Tester, steps through 32 pins x 256 codes + VIO twice + GIO twice (the second reading is slightly more settled/accurate) '"tubular" based on code from "OzPropDev", 14 Nov 2018 'DMM setup: 10 Megohm, 10v range (fixed), >20 Hz filter, set PLC in const below 'connect a big bridge across all pins 0 to 31 for measurement to red probe of DMM 'only one pin P0~31 active at a time. Pins float once complete. 'connect negative probe of DMM to power-in ground beside pins 30/31 on P2D2 header 'connect DMM trig to P32 of P2D2 board 'connect VMC from multimeter to cro for timing observation. '2.5 Readings/sec in 10PLC mode on Keysight 34461A DMM. (logged accurate data) '25 Readings/sec on 1PLC mode on Keysight 34461A DMM. (quick sweeps) '32 pins * 260 readings = 8320 (memory buffer is 10k readings) 'todo: measure Slow DAC as used in comparator modes '=========================================================================== con xtal = 12_000_000 'P2D2 default osc dv = 12 mlt = 80 'Default 80 MHz (doesn't really affect DAC readings) clk = 1 << 24 | (dv-1) << 18 | (mlt-1) << 8 sys_clk = xtal / dv * mlt rx_pin = 63 tx_pin = 62 baudrate = 115200'1_000_000 '115_200 clocksperbit = float(sys_clk) / float(baudrate) nco = round(clocksperbit * 65536.0) & $FFFFFC00 dmmtrig= 32 'multimeter trigger pin output (connect to dmmm ext trig) dmmplc=10 'multimeter power line cycles (meas time) dmmhigh=310000*dmmplc 'multimeter pulse high time, 1 power line cycle dmmlow=3100000*dmmplc 'multimeter pulse low time, 1 PLC dacnum = 1 'DAC number, 0=3v3 990R,.. 3=2v 75R start = 100_000 freq_step = 0_000 ms = sys_clk / 1_000 '=========================================================================== dat org kx hubset ##clk | %1111_01_00 'enable crystal+PLL, stay in 20MHz+ mode ky waitx ##20_000_000/100 'wait ~10ms for crystal+PLL to stabilize kz hubset ##clk | %1111_01_11 'now switch to PLL running at 80MHz wrpin #%11111_0,#rx_pin wxpin ##nco | 7,#rx_pin dirh #rx_pin wrpin #%1_11110_0,#tx_pin wxpin ##nco | 7,#tx_pin dirh #tx_pin 'START CODE mov p, #0 'pin number drvh #dmmtrig 'trigger output, idle high waitx ##20000000 'main DAC stepping code here nxtpin mov i,#0 'temp variable mov j,#0 'DAC steps, counts 0..255 'take a reading with fast drive 0v (GIO) wrpin #0,p drvl p call #pulsevm 'take a reading with fast drive 0v (GIO) wrpin #0,p drvl p call #pulsevm nxtdac mov i, j shl i,#8 or i, pinmode 'overlay DAC pin command wrpin i,p 'set pin to DAC output mode drvh p 'output high call #pulsevm add j,#1 cmp j,#256 wcz if_ne jmp #nxtdac 'take a reading with fast drive 3v3 (VIO) wrpin #0,p drvh p call #pulsevm 'take a reading with fast drive 3v3 (VIO) wrpin #0,p drvh p call #pulsevm { nxtdac2 sub j,#1 mov i, j shl i,#8 or i, pinmode 'overlay DAC pin command wrpin i,p 'set pin to DAC mode drvh p 'output high call #pulsevm cmp j,#0 wcz if_ne jmp #nxtdac2 } 'release pin ready for next pin wrpin #0,p drvl p wrpin #0,p fltl p 'release pin add p,#1 'next pin cmp p,#32 wcz if_ne jmp #nxtpin 'STOP cogstop #0 jmp #$ 'all done pulsevm waitx ##dmmhigh '*340M tot for 100PLC, 34M for 10PLC at 80MHz drvl #dmmtrig 'DMM initiates on downslope by default waitx ##dmmlow 'guard time while conversion takes place drvh #dmmtrig ret wait4enter testp #rx_pin wc if_nc jmp #wait4enter rdpin pa,#rx_pin shr pa,#24 cmp pa,#13 wcz if_ne jmp #wait4enter add j,#1 jmp #nxtdac '=========================================================================== getct timer addct1 timer,delay mov xfreq,##start mov test_steps,#200 new_freq call #calc_nco mov sample_count,#10 loc ptrb,#@buffer main setq freq ' xcont streamer,#0 getxacc gtz_x mov gtz_y,0-0 qvector gtz_x,gtz_y 'convert to rh0,theta getqx rho 'get rho,theta results getqy theta wrlong theta,ptrb++ pollct1 wc if_nc jmp #main call #update djnz sample_count,#main call #std_dev mov pb,mean call #hex8 mov pb,sd call #hex8 callpa #13,#send_char 'next freq. callpa #10,#send_char add xfreq,##freq_step djnz test_steps,#new_freq jmp #$ 'all done '_dacmode long %0000_0000_000_1011100000000_01_00000_0 'Goertzel DAC, also used as ADC '=========================================================================== calc_nco qmul xfreq,##$8000_0000 getqx freq1 getqy freq1a setq freq1a qdiv freq1,##sys_clk getqx freq ret '=========================================================================== update addct1 timer,delay mov pb,xfreq call #dec loc ptra,#@msg1 'Hz call #print loc ptra,#@msg2 'x= call #print mov pb,gtz_x call #hex8 loc ptra,#@msg3 'y= call #print mov pb,gtz_y call #hex8 loc ptra,#@msg4 'rho= call #print mov pb,rho call #hex8 loc ptra,#@msg5 'theta= call #print mov pb,theta call #hex8 callpa #13,#send_char callpa #10,#send_char ret wcz '=========================================================================== std_dev loc ptrb,#@buffer rdlong mean,ptrb++ rep @.loop,#9 rdlong pa,ptrb++ add mean,pa wc rcr mean,#1 .loop part2 loc ptrb,#@buffer mov sd,#0 rep @.loop,#10 rdlong pa,ptrb++ sub pa,mean abs pa qmul pa,pa getqx pa add sd,pa .loop qsqrt sd,#0 getqx sd ret mean long 0 sd long 0 '=========================================================================== hex8 callpa #"$",#send_char mov digits,#8 .loop getnib pa,pb,#7 cmp pa,#9 wcz if_a add pa,#"A"-10 if_be add pa,#"0" call #send_char rol pb,#4 djnz digits,#.loop callpa #" ",#send_char ret wcz '=========================================================================== dec mov lzb,#0 mov dvx,##1_000_000_000 mov digits,#10 .loop qdiv pb,dvx getqx pa wz if_nz mov lzb,#1 add pa,#"0" testb lzb,#0 wc if_nc_and_z mov pa,#" " call #send_char getqy pb qdiv dvx,#10 getqx dvx djnz digits,#.loop callpa #" ",send_char ret '=========================================================================== send_char rdpin junk,#tx_pin wc if_c jmp #send_char wypin pa,#tx_pin ret wcz print rdbyte pa,ptra++ wz if_z ret wcz call #send_char jmp #print '=========================================================================== st long 0 fn long 0 lzb long 0 sample_count long 0 sample_size long 0 set_freq long 0 digits long 0 dvx long 0 junk long 0 test_steps long 0 xfreq long 0 freq1 long 0 freq1a long 0 delay long sys_clk / 5 timer long 0 gtz_x long 0 gtz_y long 0 rho long 0 theta long 0 'adcmode long %0000_0000_000_10001_10000000_01_00000_0 '*** dacmode 'pinmode long %0000_0000_000_10110_00000000_00_00000_0 'DAC2 123R pinmode long %0000_0000_000_10100_00000000_00_00000_0 + dacnum<<16 'DAC3 75R '*** Current source tests. '** positive current source (dmm to ground) 'pinmode long %0000_0000_000_0000_0_00110000_00_00000_0 '10uA 'pinmode long %0000_0000_000_0000_0_00101000_00_00000_0 '100uA 'pinmode long %0000_0000_000_0000_0_00100000_00_00000_0 '1ma '** negative current source (dmm to 3v3) 'pinmode long %0000_0000_000_0000_0_00000110_00_00000_0 '10uA 'pinmode long %0000_0000_000_0000_0_00000101_00_00000_0 '100uA 'pinmode long %0000_0000_000_0000_0_00000100_00_00000_0 '1ma dacmode long %10110_00000000_01_00000_0 'streamer long $0100_0000 + (adc_in << 17) + 10000 freq long 0 i long 0 j long 0 p byte 0 orgh $400 msg1 byte "Hz ",0 msg2 byte "X=",0 msg3 byte "Y=",0 msg4 byte "rho=",0 msg5 byte "theta=",0 buffer