If you need floating point math with a Javelin, the PAK-I can easily interface to the Javelin. Here is a class that will let you access the PAK-I commands:

package com.al-williams;

import stamp.core.*;
/**
* PAK-I object
* <p>
* This class interfaces with a PAK-I using 2-wire mode
* Connect the PAK-I as shown in the manual.
*
*
* @version 1.0 15 Jan 2002
* @author Al Williams
*/

public class PAK1 {
  /** data pin */
  protected int datap;
  /** clock pin */
  protected int clkp;
 
  /** The high order 16-bit word of the 32-bit result */
  public int resultHigh;
  /** The low order 16-bit word of the 32-bit result */
  public int resultLow;
  /** Status of last operation */
  public int status;


  /** Set this option for rounding */
  public final static int ROUND=0x40;
  /** Set this option for saturation to infinity */
  public final static int SAT=0x80;

  /** Construct a PAK-I object
  @param datapin The pin connected to the PAK-I's SIN/SOUT pins
  @param clkpin The pin connected to the PAK-I's CLK pin
  */
  public PAK1(int datapin, int clkpin) {
  datap=datapin;
  clkp=clkpin;
  pakreset();
  }

public void pakreset() {
  CPU.writePin(datap,false); // data
  CPU.writePin(clkp,false); // clock
  CPU.writePin(clkp,true); // clock
  CPU.writePin(datap,true); // data
  CPU.writePin(clkp,false); // clock
  send(8);
  status=rcv();
  }

public void loadX(int highPart, int lowPart) {
  send(1);
  send(highPart>>8);
  send(highPart&0xFF);
  send(lowPart>>8);
  send(lowPart&0xFF);
  }

public void loadY (int highPart, int lowPart) {
  send(2);
  send(highPart>>8);
  send(highPart&0xFF);
  send(lowPart>>8);
  send(lowPart&0xFF);
  }

public int readX() {
  send(3);
  resultHigh=rcv()<<8;
  resultHigh+=rcv();
  resultLow=rcv()<<8;
  resultLow+=rcv();
  return resultLow;
  }

public void swap() {
  send(4);
  }

public int intLoadX(int n) {
  loadX(0,n);
  send(7);
  wait();
  status=rcv();
  return status;
  }

public int intLoadY(int n) {
  int rc;
  swap();
  rc=intLoadX(n);
  swap();
  return rc;
  }

public char digit(int n) {
  send(5);
  send(n);
  wait();
  return (char) rcv();
  }

public int chs() {
  send(0xA);
  wait();
  status=rcv();
  return status;
  }

public int mult() {
  send(0xC);
  wait();
  status=rcv();
  return status;
  }

public int div() {
  send(0xD);
  wait();
  status=rcv();
  return status;
  }

public int sub() {
  send(0xE);
  wait();
  status=rcv();
  return status;
  }

public void setOpt(int n) {
  send(0x10);
  send(n);
  }

public void abs() {
  send(0x11);
  }

public void sto(int n) {
  int r=0x12;
  if (n<0 || n>1) return;
  if (n==1) r+=0x80;
  send(r);
  }

public void rcl(int n) {
  int r=0x13;
  if (n<0 || n>1) return;
  if (n==1) r+=0x80;
  send(r);
  }

public void setDir(int n) {
  send(0x14);
  send(n);
  }

public int read() {
  send(0x15);
  return rcv();
  }

public void write(int n) {
  send(0x16);
  send(n);
  }

public void XtoY() {
  send(0x17);
  }

public void YtoX() {
  send(0x18);
  }

public int square() {
  XtoY();
  return mult();
  }

public void power(int n) {
  if (n==0) {
    intLoadX(1);
    return;
  }
  if (n==1) return;
  XtoY();
  while (--n!=0) {
    mult();
    }
  }

public int getXInt() {
  send(0xB);
  wait();
  status=rcv();
  return readX();
  }

public int add() {
  send(0xF);
  wait();
  status=rcv();
  return status;
  }

public void debug(int n) {
  debug(n,3);
  }

public void debug(int n, int debugPrec) {
  int i;
  System.out.print(digit(0)); // print sign
  for (i=n;i>0;i--)
  System.out.print(digit(i));
  System.out.print(".");
  for (i=0x81;i<=0x80+debugPrec;i++)
  System.out.print(digit(i));
  }


public void sqrt() {
  sqrt(0x7503,0x126F);
  }

public void sqrt(int sqrtLimitHigh,
  int sqrtLimitLow) {
  char sgn;
  sto(1); // save target number in R1
  loadY(makeUint(0x80,00),0);  // divide by 2
  div();
  sto(0); // R0=guess
  do {
    square();
    swap();
    rcl(1);
    sub();
    abs();
    loadY(sqrtLimitHigh,sqrtLimitLow); // tollerance .001
    sub();
    sgn=digit(0);
    if (sgn=='+') {
      rcl(0);
      square();
      swap();
      rcl(1);
      swap();
      sub();
      readX(); // store temporary
      rcl(0);
      swap();
      loadX(makeUint(0x80,00),0);  // load 2
      mult();
      swap();
// restore temporary
      loadX(resultHigh,resultLow);
      div();
      swap();
      rcl(0);
      sub();
      sto(0); // new guess
      }
    } while (sgn=='+');
    rcl(0);
  }


public static int makeUint(int highByte, int lowByte) {
   int work;
   if (highByte<=0x7F) return highByte<<8+lowByte;
   if (highByte==0x80 && lowByte==0) return -32768;
   lowByte--;
   lowByte^=0xFF;
   highByte^=0xFF; // sure to have top bit OFF
   return -((highByte<<8)+lowByte);
   }

protected void send(int n) {
  CPU.shiftOut(datap,clkp,8,CPU.SHIFT_MSB,n<<8);
  }


protected void wait() {
  while (CPU.readPin(datap));
  }

protected void clock() {
  CPU.writePin(clkp,true);
  CPU.writePin(clkp,false);
  }

protected int rcv() {
  return CPU.shiftIn(datap,clkp,8,CPU.PRE_CLOCK_MSB);
  } 

}

Using the class is easy. Here's a simple test program:

import stamp.core.*;
import com.al_williams.PAK1;

public class pak1test {

public static int makeUint(int highByte, int lowByte) {
return (highByte<<8)|lowByte;
}

public static void sqrttable(PAK1 pak1) {
int i;
for (i=1;i<=1000;i++) {
  pak1.intLoadX(i);
  pak1.debug(4);
  System.out.print(" ");
  pak1.sqrt();
  pak1.debug(2);
  System.out.println(" ");
  }
}



public static void main() {
  int v;
  PAK1 pak1=new PAK1(CPU.pin15,CPU.pin14);
  sqrttable(pak1);
  pak1.intLoadX(22);
  pak1.intLoadY(7);
  pak1.div(); // pi is almost = 22/7
  pak1.debug(1); // prints +3.142 (the 1 argument is digits b4 decimal)
  System.out.println("Done");
  pak1.setDir(0xFF); // Set spare I/O to output
  v=0xAA;
  while (true) {
    pak1.write(v); // write to I/O port
    v^=0xFF; // Flip from AA/55
    CPU.delay(100); // wait a bit so we can see LEDs flash
    }
  }
}

Site contents © 1997-2018 by AWC, Houston TX    (281) 334-4341