From: scottlivingston Date: Wed, 29 Sep 2010 05:25:48 +0000 (+0000) Subject: Forgot to include goodfet.adc (ADC10 client) in last commit. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=5f1d4bb4482fcbf8042a1b79a00f445195456e7e Forgot to include goodfet.adc (ADC10 client) in last commit. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@737 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/goodfet.adc b/client/goodfet.adc new file mode 100755 index 0000000..84126be --- /dev/null +++ b/client/goodfet.adc @@ -0,0 +1,142 @@ +#!/usr/bin/env python +""" +ADC10 client (currently only supports x2274 chip, on the GoodFET31 +board, where pin 5 of JTAG header is sampled.) + +Scott Livingston +Sep 2010. +""" + +import matplotlib as mpl +import matplotlib.pyplot as plt +import time + +import sys +from GoodFET import GoodFET + +############# +# Some constants (not really immutable...) +############# +ADC10APP = 0x74 +ADC10_INIT = 0x81 +ADC10_UNINIT = 0x82 +MONITORAPP = 0x00 +NOK = 0x7E + + +def man_sample(count=1): + """Obtain a single, instantaneous ADC10 sample +of channel A5 (pin 5 of JTAG header on the GoodFET31 board). + +This may be repeated count times (default is 1). +Result is returned as a list. +Failed samples are indicated by -1. +""" + if count < 1: + return [-1,] + result = [] + client.writecmd( ADC10APP, ADC10_INIT, 0 ) # Initialize ADC10 module + while count > 0: + data = client.writecmd( ADC10APP, 0x83, 0 ) # Get a sample + if len(data) > 0: + samp = ord(data[0]) + (ord(data[1]) << 8) + else: + samp = -1 + result.append(samp) + count -= 1 + return result + +def nsample(count=10, t_sample=3, clock_div=8): + """Obtain a sequence of count samples, at constant rate. + +(Copied from firmware/include/adc.h) + +t_sample is ``sample-and-hold time''; this is written directly to +ADC10SHTx field of ADC10CTL0 register; possible values in binary are +00 => 4 ADC10CLK ticks, +01 => 8 ADC10CLK ticks, +10 => 16 ADC10CLK ticks, +11 => 64 ADC10CLK ticks. + +clock_div is the value by which to divide SMCLK (which is assumed to +be 16 MHz), then giving ADC10CLK. Possible values are 1..8 +Cf. Fig. 20-1 (on page 585?) of the msp430x2xxx family manual. + +To estimate the sampling rate, use +(SMCLK/clock_div)/(13+t_sample_ticks), where ``t_sample_ticks'' is the +number of ticks corresponding to t_sample (see above). E.g., 16 MHz +SMCLK (as on the GoodFET31, and others?), t_sample := 11 (binary) and +clock_div := 8 gives a sampling rate of approx. 25.97 kSps. +Similarly, e.g., 16 MHz, t_sample=00, clock_div=5 yields approx. 188 kSps. + +Returns a list. +Failure is indicated by -1 (within the list). +""" + if count < 0: + return [-1,] + client.writecmd( ADC10APP, ADC10_INIT, 0 ) # Initialize ADC10 module + data = client.writecmd( ADC10APP, 0x84, 3, # ADC10_NSAMPLE + [count & 0xff, + t_sample & 0x03, + clock_div & 0x0f] ) + result = [] + for k in range(client.count/2): + result.append( ord(data[k*2]) + (ord(data[k*2+1]) << 8) ) + return result + +############# +# Main entry: +############# +#if __name__ == "__main__": +if len(sys.argv) == 1: + print "Usage: %s verb [objects]\n" % sys.argv[0] + print "%s sample [N]" % sys.argv[0] + print "%s sequence [N]" % sys.argv[0] + print """ +Warning: only known to work for x2274 chip, on GoodFET31 board. +""" + sys.exit() + +# Initialize and open connection to GoodFET +client = GoodFET() +client.verbose = False # Dump activity to terminal +client.serInit( timeout=10 ) # UART comm timeout (in seconds) + + +# Handle each possible ADC10 verb in turn + +if sys.argv[1] == "sample": #0x83 + if len(sys.argv) == 2: + count = 1 + print "Requesting a single sample..." + else: + count = int(sys.argv[2]) + if count < 1: + print "Error: number of requested samples must be at least 1." + exit(-1) + print "Requesting %d samples..." % count + result = man_sample(count) + print result + +elif sys.argv[1] == "sequence": + if len(sys.argv) == 2: + count = 0 + print "Requesting max sampling sequence length..." + else: + count = int(sys.argv[2]) + if count < 1: + print "Error: number of requested samples must be at least 1." + exit(-1) + print "Requesting sampling sequence of length %d..." % count + #result = nsample(count, 0, 5) + #print result + while True: + result = nsample(count, 0, 5) + plt.clf() + plt.plot(result,'.-') + plt.ylim([0, 1023]) + plt.draw() + time.sleep(.3) + + #plt.savefig('figs/test-' + str(int(time.time())) + '.png') +