Add Scroogle to your search area in Firefox 2.0 Install the 'Scroogle Scraper' search plugin.

October 2008


Maybe you want to create some cool new UI using an actual slider (i.e., a variable resistor) to control something (like motor speed.) Well, that’s where the ADC0838 comes in. Below is some Parallax Spin code that will read in data on the first channel of that chip (and display the value back over a serial connection.) The chip actually has eight channels (you select which one you’re interested in through the built in MUX), but this code is hardwired, so to speak, to just read the first one.

Notes:

VCC, VDD mean + voltage
VSS is Ground

connect Vref (chip pin 12) to +

test 5v input: + to CH0 (chip pin 1)

SE bar (chip pin 13) to gnd

ground COM (Chip pin 9) for single ended

tie Agnd (Chip pin 11) to gnd
tie Dgnd (Chip pin 10) to gnd

ADC0838 8-Channel Mux
 CH0 +-1-|___|-20-+ Vcc
 CH1 + 2       19 + V+
 CH2 + 3       18 + CS bar
 CH3 + 4       17 + DI
 CH4 + 5       16 + CLK
 CH5 + 6       15 + SARS
 CH6 + 7       14 + DO
 Ch7 + 8       13 + SE bar
 COM + 9       12 + Vref
Dgnd +-10------11-+ Agnd

Single Ended MUX Mode (table 2)
SGL/DIF bar is 1
ODD/SIGN is 0
Select 1 is 0
Select 0 is 0

Setup (address MUX)
1- CS bar goes low
2- Start pulsing CLK (data read on rising edge), while sending data into DI
Rising 1
Start Bit: 1
Rising 2
SGL/DIF bar: 1
Rising 3
ODD/SIGN: 0
Rising 4
Select Bit 1: 0
Rising 5
Select Bit 0: 0
Output
1- CS bar stays low
2- pulse CLK while reading data on DO on falling edge
Falling 1..7
MSB 7..1
Falling 9..13
LSB 1..7

Here’s the SPIN code:

'**********************************
'*    ADC 0838 Channel 0 Debug    *
'**********************************
 
'adapted from Bryan Kobe June
 
CON
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000
 
' pin configuration
 
  clk     = 1
  cs      = 0
  dataout = 2
  datain  = 3
 
'P0: CS bar (chip pin 18)
'P1: CLK (chip pin 16)
'P2: DO (chip pin 14) [data out from the chip to the propeller, its an INPUT to the propeller]
'P3: DI (chip pin 17) [data from propeller TO the chip, its an OUTPUT from the propeller]
 
OBJ
  bs2   : "BS2_Functions"
  debug : "FullDuplexSerial"
  num   : "Numbers"
 
VAR
  byte ADC             ' Analog to Digital Channel Din Value.  Set using CON values.
  long datar           ' 8 Bit return value from conversion
 
PUB main
  dira[cs]~~         'set Chip Select to output
  outa[cs] := 0      'set Chip Select bar to low
  dira[clk]~~        'set clk pin to output
  outa[clk]:=0       'set clock pin low
  dira[datain]~~       'set DI data in pin to an output
  dira[dataout]~      'set DO data out pin to an input
 
debug.start(31,30,0,57600)
   debug.str(string("ADC0838 Channel Debug"))
 
repeat
  debug.str(string("Ch.0 = "))
  debug.str(num.ToStr(GetADC(0), Num#dec))
  waitcnt(5_000_000 + cnt+50000)
 
 
PRI GetADC( chan ) : value
  ADC := %11000          ' channel 0
  datar := write(ADC)    ' write MUX Address to start conversion for ADC channel and set result to the datar value
  return datar
 
PRI write( ADCaddr ) : ADC_value
  outa[cs] := 0                                         'set Chip Select bar LOW, activating the ADC chip
  bs2.SHIFTOUT(datain, clk, ADCaddr, BS2#MSBFIRST, 5 )  'shift out the addressing byte to the ADC via DI pin on ADC
  ADC_value := bs2.SHIFTIN(dataout, clk, BS2#MSBPOST, 8 ) 'shift in the byte from the ADC via the DO pin on the ADC
                                                        'the first byte is a start bit, to initiate reading sequence
  outa[cs]:=1                                           'set Chip Select bar HIGH, de-activating the ADC chip
  return ADC_value                                      'return value of the ADC

Here’s a quick example of weighted round robin in php.

//weighted round robin
 
define("START_WEIGHT", 1);
class printer
{
  private $name;
  private $weight;
  private $normalizedWeight;
  public function printer($name,$weight=START_WEIGHT)
  {
    $this->name=$name;
    $this->weight=$weight;
  }
  public function getName() { return $this->name; }
  public function getWeight() { return $this->weight; }
  public function setWeight($weight) { $this->weight=$weight; }
  public function getNormalizedWeight(){ return $this->normalizedWeight; }
  public function setNormalizedWeight($weight) { $this->normalizedWeight=$weight; }
 
}
 
$printerList=array();
$printerList[]=new printer("printer1",1);
$printerList[]=new printer("printer2",2);
$printerList[]=new printer("printer3",4);
$printerList[]=new printer("printer4",1);
 
$jobList=array(‘job1′,‘job2′,‘job3′,‘job4′,‘job5′,‘job6′,‘job7′,‘job8′,‘job9′,‘job10′,‘job11′,‘job12′,‘job13′,‘job14′,‘job15′,‘job16′);
 
$min=2147483647; //a large number
foreach($printerList as $printer)
{
  $min=($printer->getWeight()<$min)?$printer->getWeight():$min;
}
foreach($printerList as $printer)
{
  $printer->setNormalizedWeight($printer->getWeight()/$min);
}
 
$jobCount=count($jobList);
while($jobCount>0)
{
  foreach($printerList as $printer)
  {
    $jobCount=count($jobList);
    if ($jobCount>0)
    {
      $jobList=jobPush($printer,$jobList,$jobCount);
    }
  }
}
 
function jobPush($printer,$jobList,$jobCount)
{
  for($x=0;$x<$printer->getNormalizedWeight();$x++)
  {
    if ($jobCount>0)
    {
      $job=array_shift($jobList);
      $jobCount–;
      echo($printer->getName()." getting ".$job."n");
    }
  }
  echo("n");
  return $jobList;
}

Send to a friend * Print this page * Join the club * Talk with my robot * Advertise here * Search this Site * Donate * Link to me


Web hosting by Utah Hub *  Powered by CreativeTap *  In association with Segomo
Unless otherwise noted, Copyright 2004-2006, Ryan Byrd. All Rights Reserved.
Ryan Byrd dot net -- probably the coolest site in Utah