'' ********************** '' * Background_Watch * '' ********************** '' '' Variable watcher object for Debugging '' connects to a PC with PropTerminal over the serial link '' needs 1 cog '' can generate and measure a frequency with the cog timers '' '' Author.... Andy Schenk, Insonix '' Date...... 31 MAR 2007 CON BAUDRATE = 115200 UPDATERT = 5 'updates per second ( < 15) change this if flickering VAR word vpntr[10] '10 variables max. (30 cont. words) word vlabl[10] 'pointer to label-string word vmdsz[10] 'disp mode/size word commnd 'to pass commands to assembly cog word param1 word param2[2] long cog PUB start(pin) : okay '' Starts variable_watcher object '' -- returns true if all parameters okay '' pin = tx out pin (normally pin 30) wordfill(@vpntr,-1,10) '-1 to all ptrs wordfill(@vlabl,0,24) 'clear all vars long[@vlabl] := clkfreq/BAUDRATE 'set bitticks long[@vlabl+4] := clkfreq/UPDATERT 'set update rate byte[@vlabl+8] := pin 'set pin okay &= cog := cognew(@entry, @vpntr) + 1 'start background cog PUB stop '' Stops object if cog cogstop(cog~ - 1) PUB watch_var(row, addr, label, size) : okay | m '' Adds a variable to watch -- returns true if ok '' '' row: row 1..10 on Display '' addr: pointer to variable or -1 = Off '' label: Type and variable-shortname '' first char in label: 'B'=byte 'W'=word 'L'=long 'S'=CogRAM(long) other=long '' second char in label: '$'=hex '%'=binary '=char other=decimal (long:signed; word,byte:unsigned) '' size: number of contiguous values to show ( > 1 = array) case byte[label] "B": m := 1 "W": m := 2 "S": m := 3 other: m := 4 case byte[label+1] "%": m += 32 "$": m += 16 "'": m += 48 row-- okay := row < 10 and row => 0 if okay vpntr[row] := addr vmdsz[row] := (size #> 1)<<8 + m vlabl[row] := label PUB wiggle_pin(pin, frq) | f '' sets the timer_a to toggle a pin with a frequency: frq in Hz (1 to clkfreq/2) '' to switch it off, set frq = 0 param1 := pin f := clkfreq>>4 long[@param2] := 1<<28 / f * (frq + frq/615) commnd := 1 repeat until commnd == 0 PUB count_freq(pin, on) '' starts a frequency-counter with timer_b on the pin (if on=1) (on=0 switch it off) '' the result stays in cogram at $1EF use: watch_var(n, $1EF, string("S Freq"), 1) to show param1 := pin long[@param2] := on commnd := 2 repeat until commnd == 0 DAT '****************************************** '* Assembly language variable watcher * '****************************************** org entry mov tp,par 'pointer to vlabl[0] add tp,#20 rdlong bittime,tp 'get bitticks add tp,#4 rdlong looptime,tp 'get update rate add tp,#4 rdbyte t2,tp 'get pin mov txmask,#1 shl txmask,t2 or outa,txmask 'idle = 1 or dira,txmask 'TXPin = output mov ltime,cnt add ltime,looptime mov seccnt,#1 bgloop movs lstrout,#title 'pointer to title call #lstrout mov t2,ina 'show pins mov t1,#32 call #bindigit mov rp,par 'pointer to vpntr[0] mov rcnt,#0 varrow mov txd,#13 'new line call #charout mov rp,par add rp,rcnt rdword vp,rp 'get vpntr cmp vp,p_off wz 'off? if_z jmp #nextrow add rp,#20 'to vlabl[] mov txd,#12 'set color call #charout mov txd,#5 call #charout rdword tp,rp call #strout 'show label string add rp,#20 rdbyte mdsz,rp 'mode add rp,#1 rdbyte arcnt,rp 'size mov txd,#12 'set color call #charout mov txd,#0 call #charout mov txd,#10 'set xpos call #charout mov txd,#11 cmp mdsz,#$24 wz 'Long bin? if_nz cmp mdsz,#$23 wz 'Long bin SPR? if_z mov txd,#7 call #charout arrloop mov t1,mdsz and t1,#$07 '= long/word/byte rdlong t2,vp 'get val cmp t1,#1 wz if_z rdbyte t2,vp cmp t1,#2 wz if_z rdword t2,vp cmp t1,#3 wz 'SPR? if_z movs rdcmem,vp 'yes read long cogmem if_z mov t1,#4 'and set size to 4 rdcmem if_z mov t2,0-0 mov t3,mdsz and t3,#$70 wz '= radix type if_z jmp #typdec sub t3,#$10 wz if_z jmp #typhex sub t3,#$10 wz if_z jmp #typbin jmp #typchr nextval mov t1,mdsz and t1,#$07 add vp,t1 'next indx cmp mdsz,#$31 wz 'chr? if_nz cmp arcnt,#1 wz 'space if not last if_nz mov txd,#32 if_nz call #charout djnz arcnt,#arrloop 'next indx in array nextrow add rcnt,#2 'to next var cmp rcnt,#20 wz if_nz jmp #varrow 'loop if not all rows mov tp,par add tp,#60 'point to command rdword t1,tp wz if_nz call #newcmd waitcnt ltime,looptime 'wait 1/10 second djnz seccnt,#bgloop mov t1,phsb 'read frqcounter mov phsb,#0 mov $1EF,t1 mov seccnt,#UPDATERT mov txd,#0 call #charout jmp #bgloop 'loop for ever typdec call #decout 'decimal out jmp #nextval typhex shl t1,#1 '= number of nibbles call #hexout jmp #nextval typbin shl t1,#3 '= number of bits call #binout jmp #nextval typchr mov txd,t2 'chr out and txd,#$FF cmp txd,#14 wc if_b mov txd,#46 call #charout jmp #nextval '------------- binout cmp t1,#16 wz 't2 binary out (digits in t1) if_z shl t2,#16 cmp t1,#8 wz if_z shl t2,#24 bindigit shl t2,#1 wc 'test bit mov txd,#"0" if_c mov txd,#"1" call #charout djnz t1,#bindigit bindigit_ret binout_ret ret '------------- hexout mov txd,#8 't2 hex out (size in t1) sub txd,t1 shl txd,#2 shl t2,txd 'to highest bits hexdigit mov txd,t2 shr txd,#28 '=nibble cmp txd,#10 wc if_nc add txd,#7 add txd,#$30 '=ascii call #charout shl t2,#4 djnz t1,#hexdigit hexout_ret ret '------------- decout mov t3,t2 wc 't2 decimal out if_c neg t2,t2 if_c mov txd,#"-" if_c call #charout mov t3,#0 'flag for '0's movs decdigit,#dectab mov deccnt,#9 decdigit mov t1,0-0 call #decdiv if_nz call #charout add decdigit,#1 djnz deccnt,#decdigit mov t1,#1 call #decdiv call #charout decout_ret ret decdiv neg txd,#1 'div txd=t2/t1 decdivlp add txd,#1 sub t2,t1 wc if_nc jmp #decdivlp add t2,t1 add txd,t3 wz,nr 'test 0/flg if_nz mov t3,#1 add txd,#$30 '=ascii decdiv_ret ret '------------- strout rdbyte txd,tp wz 'string out (main ram) strout_ret if_z ret call #charout add tp,#1 jmp #strout '------------- lstrout mov t1,0-0 'string (longs in cogram) out mov txd,t1 call #charout mov txd,t1 shr txd,#8 call #charout mov txd,t1 shr txd,#16 call #charout mov txd,t1 shr txd,#24 wz if_z jmp #lstrout_ret 'end? (zero in bit31..24) call #charout add lstrout,#1 jmp #lstrout lstrout_ret ret '------------- charout and txd,#$FF 'send 1 character mov txcnt,#10 or txd,#$100 'add stoppbit shl txd,#1 'add startbit mov dtime,cnt add dtime,bittime sendbit shr txd,#1 wc 'test LSB mov ti,outa if_nc andn ti,txmask 'bit=0 or if_c or ti,txmask 'bit=1 mov outa,ti waitcnt dtime,bittime 'wait 1 bit djnz txcnt,#sendbit '10 times waitcnt dtime,bittime '2 stopbits charout_ret ret '------------ newcmd add tp,#2 'read params rdword t2,tp add tp,#2 rdlong t3,tp cmp t1,#1 wz 'set wiggle? if_nz jmp #fcntcmd cmp t3,#0 wz add t2,a_ctrl if_z mov t2,#0 'off if frq=0 mov ctra,t2 'set timer mode/pin mov frqa,t3 'set timer freq mov t1,#1 shl t1,t2 'set output or dira,t1 jmp #endcmd fcntcmd cmp t1,#2 wz 'set freqcounter? if_nz jmp #endcmd cmp t3,#0 wz add t2,b_ctrl if_z mov t2,#0 'off if frq=0 mov ctrb,t2 'set timer mode/pin mov frqb,t3 'set timer freq endcmd sub tp,#4 'to cmd mov t1,#0 wrword t1,tp 'clr command newcmd_ret ret ' ' Initialized data ' 'looptime long 64_000_000 / 10 '1/10 second title byte 1,12,3,"background watch",12,7," 2 1 ",13 '36 byte "bit: 10987654321098765432109876543210",13 '40 byte 12,5,"S% ina ",12,0,0 '12 dectab long 1_000_000_000 long 100_000_000 long 10_000_000 long 1_000_000 long 100_000 long 10_000 long 1_000 long 100 long 10 decend long 1 p_off long $FFFF a_ctrl long %00100_000 << 23 'NCO/PWM b_ctrl long %01010_000 << 23 'POS detector ' ' Uninitialized data ' t1 res 1 t2 res 1 t3 res 1 tp res 1 ti res 1 rp res 1 vp res 1 rcnt res 1 arcnt res 1 mdsz res 1 deccnt res 1 dtime res 1 ltime res 1 bittime res 1 looptime res 1 txd res 1 txcnt res 1 txmask res 1 seccnt res 1