From: Walter Fetter Lages Date: Sun, 20 May 2018 05:43:36 +0000 (-0300) Subject: Create a real-time library to access the AIC hardware. X-Git-Tag: v1.4.2^0 X-Git-Url: http://git.ece.ufrgs.br/?a=commitdiff_plain;h=3a4fd7bbe8ab36c7f6ce522c5e88d1671cf96389;p=aic.git Create a real-time library to access the AIC hardware. Criado o programa DoorDaemon, para implementar a abertura de uma porta conectada no sinal de freio da AIC atraves da Internet, utilizando um protocolo CHAP com sha-1. Criada a biblioteca aicio.mpp.lib, com funcoes implementadas que podem ser chamadas a partir de modulos de tempo real em C para acessar o hardware da AIC. Codigos fontes dos metodos nativos que acessam o hardware modificados para usarem a biblioteca aicio.mpp.lib. Criado o programa PID, que implementa em tempo real o prototipo de um controlador PID, com transferencia de referencias e variaveis de saida entre a interface com o usuario e o modulo de tempo real. Criados os programas BrakeRtTest e IndexRtTest para de teste do freio e do indice em tempo real em C. --- diff --git a/.gitignore b/.gitignore index c77d130..e40e516 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Project specific # TINI executable *.tini +*.mpp +*.lst +*.tlib # Text editor # Backup files diff --git a/BrakeRtTest/BrakeRtTest.java b/BrakeRtTest/BrakeRtTest.java new file mode 100644 index 0000000..83373db --- /dev/null +++ b/BrakeRtTest/BrakeRtTest.java @@ -0,0 +1,74 @@ +/****************************************************************************** + + Actuator Interface Card + Brake Real Time Test + User Interface Module + Copyright (C) 2005 Walter Fetter Lages + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +import com.dalsemi.system.*; + +public class BrakeRtTest +{ + public static native int startRealtime(int period); + public static native void stopRealtime(); + + public static void main(String[] args) + { + System.out.println("BrakeRtTest"); + System.out.println("Copyright (C) Walter Fetter Lages, 2005.\n"); + + int tfms=0; + if(args.length==1) + { + tfms=Integer.parseInt(args[0]); + } + else + { + System.out.println("Usage:\tBrakeRtTest ms"); + System.exit(1); + } + + System.out.print("Loading native library..."); + System.loadLibrary("braketest.tlib"); + System.out.println("done."); + + int us=10000; + System.out.print("Starting real-time timer with "+us+" us period..."); + int period=startRealtime(us); + System.out.println("done."); + System.out.println("Effective period: "+period+" us."); + + System.out.println("Running BrakeRtTest for "+tfms+" ms..."); + long t0=TINIOS.uptimeMillis(); + long t=0; + while(t <= tfms) + { + t=TINIOS.uptimeMillis()-t0; + System.out.print("t="+t+" ms"); + } + System.out.println("...done."); + + System.out.print("Stoping real-time timer..."); + stopRealtime(); + System.out.println("done."); + } +} diff --git a/BrakeRtTest/Makefile b/BrakeRtTest/Makefile new file mode 100644 index 0000000..08076f8 --- /dev/null +++ b/BrakeRtTest/Makefile @@ -0,0 +1,45 @@ +CLASSPATH=-classpath /opt/tini/bin/tini.jar:/opt/tini/bin/tiniclasses.jar +APIDBPATH=-d /opt/tini/bin/tini.db +TINIRTAIPATH=${HOME}/src/tini/rtai +LIBPATH=-PATH ${TINIRTAIPATH}/lib/rtai.jar +JAVAFLAGS=-O -target 1.1 -source 1.3 +ASMINC=-I/opt/tini/native/lib +ASMOPT=-f 1.15 -p 390 -l +ASMMACRO=/opt/tini/native/bin/Linux/macro +ASM=/opt/tini/native/bin/Linux/a390 +CC=sdcc +CFLAGS=-mTININative -S --use-accelerator +CINCLUDE=-I${TINIRTAIPATH}/include -I../include +CMPFLAGS=${CFLAGS} ${CINCLUDE} + +all: BrakeRtTest.tini + +BrakeRtTest.class: BrakeRtTest.java + javac ${CLASSPATH} ${JAVAFLAGS} BrakeRtTest.java + +braketest.mpp: braketest.a51 + ${ASMMACRO} ${ASMINC} -e- braketest.a51 + +globals.mpp: globals.a51 + ${ASMMACRO} ${ASMINC} -e- globals.a51 + +braketest.tlib: braketest.mpp globals.mpp ../lib/aicio.mpp.lib + cat braketest.mpp globals.mpp ../lib/aicio.mpp.lib > tmp.mpp + echo end >> tmp.mpp + ${ASM} ${ASMOPT} tmp.mpp + mv tmp.tlib braketest.tlib + mv tmp.lst braketest.lst + +braketest.a51: braketest.c + ${CC} ${CMPFLAGS} braketest.c + +BrakeRtTest.tini: BrakeRtTest.class braketest.tlib + java ${CLASSPATH} TINIConvertor -n braketest.tlib -f BrakeRtTest.class ${APIDBPATH} -o BrakeRtTest.tini + + +clean: + rm -f *.bak *~ BrakeRtTest.class braketest.tlib braketest.mpp braketest.lst braketest.a51 globals.mpp tmp.mpp tmp.lst + +distclean: clean + rm -f BrakeRtTest.tini + diff --git a/BrakeRtTest/braketest.c b/BrakeRtTest/braketest.c new file mode 100644 index 0000000..fdcdc2a --- /dev/null +++ b/BrakeRtTest/braketest.c @@ -0,0 +1,98 @@ +/****************************************************************************** + + Actuator Interface Card + Brake Real Time Test + Real Time Module + Copyright (C) 2005 Walter Fetter Lages + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#include + +#define BASE 0x800000 + +void initialize(void) +{ + brake_initialize(BASE); +} + +/* public static native int startRealtime(int period) */ +long Native_startRealtime(void) _JavaNative +{ + volatile long period = NatLib_LoadInt(0); + + _asm + + mov T2CON,#00h ; clear TR2 = disable timer 2 + anl IE,#0dfh ; clear ET2 = disable timer 2 interrupt + + mov dps,#1 + mov dptr,#braketest + mov a,#2bh ; timer 2 + call System_InstallInterrupt + mov dps,#00h + + anl CKCON,#0dfh ; clear T2M = timer 2 uses clock/12 + mov T2MOD,#00h ; clear DCEN = counts up only + +; TINI oscillator is 18432000 => counter=0c400h=100Hz + mov RCAP2L,#00h ; count reload LSB + mov TL2,#00h ; count LSB + mov RCAP2H,#0c4h ; count reload MSB + mov TH2,#0c4h ; count MSB + + orl IP,#20h ; set PT2 = set timer 2 interrupt to high priority + orl IE,#20h ; set ET2 = enable timer 2 interrupt + + mov T2CON,#04h ; set TR2 = enable timer 2 + _endasm; + + initialize(); + + return period; +} + +/* public static native void stopRealtime() */ +void Native_stopRealtime(void) _JavaNative +{ + _asm + mov T2CON,#00h ; clear TR2 = disable timer 2 + anl IE,#0dfh ; clear ET2 = disable timer 2 interrupt + anl IP,#0dfh ; clear PT2 = set timer 2 interrupt to normal priority + _endasm; +} + +static void int2ack(void) +{ + _asm + anl T2CON,#7fh ; clear TF2 = clears timer 2 overflow + _endasm; +} + +static void braketest(void) interrupt +{ + static int time=0; + + int2ack(); + + if(time) brake_apply(); else brake_release(); + time=~time; +} + diff --git a/BrakeRtTest/globals.a51 b/BrakeRtTest/globals.a51 new file mode 100644 index 0000000..ab84e84 --- /dev/null +++ b/BrakeRtTest/globals.a51 @@ -0,0 +1,29 @@ +;****************************************************************************** +; +; Actuator Interface Card +; Brake Real Time Test +; Real Time Module Global Variables +; Copyright (C) 2005 Walter Fetter Lages +; +; This program is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +; +; You can also obtain a copy of the GNU General Public License +; at . +; +;*******************************************************************************/ + + +braketest_time_1_1: db 0,0,0,0 + end diff --git a/Changes b/Changes index a1474cd..f17f430 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,23 @@ +2005.08.12 Criado o programa DoorDaemon, para implementar a abertura de + uma porta conectada no sinal de freio da AIC atraves da + Internet, utilizando um protocolo CHAP com sha-1. + +2005.06.03 Criada versao 1.4.2 + + Criada a biblioteca aicio.mpp.lib, com funcoes implementadas + que podem ser chamadas a partir de modulos de tempo real em + C para acessar o hardware da AIC. Codigos fontes dos metodos + nativos que acessam o hardware modificados para usarem a + biblioteca aicio.mpp.lib. + + Criado o programa PID, que implementa em tempo real o + prototipo de um controlador PID, com transferencia de + referencias e variaveis de saida entre a interface com o + usuario e o modulo de tempo real. + + Criados os programas BrakeRtTest e IndexRtTest para de teste + do freio e do indice em tempo real em C. + 2005.01.06 Criada versao 1.4.1 2004.12.05 Corrigido bug nas inicializacao das classes AIC_CAN e diff --git a/DoorDaemon/DoorDaemon.java b/DoorDaemon/DoorDaemon.java new file mode 100644 index 0000000..19a2f44 --- /dev/null +++ b/DoorDaemon/DoorDaemon.java @@ -0,0 +1,140 @@ +/****************************************************************************** + + Actuator Interface Card + Door Daemon + Copyright (C) 2005 Walter Fetter Lages + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +import br.ufrgs.eletro.AIC.*; +import com.dalsemi.system.*; +import com.dalsemi.tininet.*; +import java.net.*; + +class DoorDaemon extends Thread +{ + private static final int BASE=0x800000; + private static final int DD_PORT=9880; + + private TINIDatagramSocket ddsock; + + static AIC aic; + + public static void main(String[] args) + { + int i; + int hostarg=0; + + System.out.println("AIC Door Daemon"); + System.out.println("Copyright (C) 2005 Walter Fetter Lages .\n"); + + try + { + aic=new AIC(BASE,24.0,20e3,2000); + + TINIDatagramSocket ddsock=new TINIDatagramSocket(DD_PORT); + + byte[] buff= new byte[256]; + DatagramPacket p=new DatagramPacket(buff,256); + + byte[] rmadd= new byte[18]; + + for(;;) + { + + ddsock.receive(p,rmadd,0); + + Chap chap=new Chap(rmadd); + chap.start(); + sleep(1000); + chap.stop(); + } + } + catch (Exception all) + { + all.printStackTrace(); + } + } +} + + +class Chap extends DoorDaemon +{ + // socket for transmitting challenge + private TINIDatagramSocket chsock; + private InetAddress chaddr; + private int chport; + + public Chap(byte[] rmadd) + { + try + { + chsock=new TINIDatagramSocket(); + int chip=(((int)rmadd[12]) << 24) | (((int)rmadd[13]) << 16) | (((int)rmadd[14]) << 8) | (int)rmadd[15]; + chaddr=InetAddress.getByName(rmadd[12]+"."+rmadd[13]+"."+rmadd[14]+"."+rmadd[15]); + chport=(((int)rmadd[16]) << 8) | (int)rmadd[17]; + } + catch (Exception all) + { + all.printStackTrace(); + } + } + + public void run() + { + int challenge=Security.getRandom(); + byte[] chbuff=new byte[4]; + + byte[] passwd="abcd".getBytes(); + + for(int i=0;i < 4;i++) + { + chbuff[i]=(byte)((challenge >> (8*i)) & 0xff); + passwd[i]=(byte)(chbuff[i] ^ passwd[i]); + } + byte[] hash=Security.hashMessage(passwd); + + try + { + DatagramPacket chp=new DatagramPacket(chbuff,4,chaddr,chport); + chsock.send(chp); + + byte[] respbuff= new byte[256]; + DatagramPacket respp=new DatagramPacket(respbuff,256); + + chsock.receive(respp); + + if(respbuff==hash) + { + aic.on(); + aic.brake.release(); + sleep(1000); + aic.brake.apply(); + aic.off(); + } + } + catch (Exception all) + { + all.printStackTrace(); + } + } +} + + diff --git a/DoorDaemon/Makefile b/DoorDaemon/Makefile new file mode 100644 index 0000000..61af6de --- /dev/null +++ b/DoorDaemon/Makefile @@ -0,0 +1,25 @@ +CLASSPATH=-classpath /opt/tini/bin/tini.jar:/opt/tini/bin/tiniclasses.jar:/opt/tini/bin/modules.jar:../lib/AIC.jar +APIDBPATH=-d /opt/tini/bin/tini.db +DEPPATH=-p /opt/tini/bin/modules.jar +DEPFILE=-x /opt/tini/bin/owapi_dep.txt +DEPNAME= +#-add CAN +LIBPATH=-path ../lib/AIC.jar +NATLIB=-n brake.tlib -n encoder.tlib -n index.tlib -n pwm.tlib +JAVAFLAGS=-O -target 1.1 -source 1.3 +TARGET= aic1 aic2 aic3 aic4 aic5 + +all: DoorDaemon.tini + +DoorDaemon.class: DoorDaemon.java ../lib/AIC.jar + javac ${JAVAFLAGS} ${CLASSPATH} DoorDaemon.java + +DoorDaemon.tini: DoorDaemon.class ../lib/AIC.jar + java ${CLASSPATH} BuildDependency ${DEPNAME} ${DEPFILE} ${DEPPATH} -f DoorDaemon.class ${APIDBPATH} -o DoorDaemon.tini ${LIBPATH} ${NATLIB} + +clean: + rm -f *.bak *~ *.class + +distclean: clean + rm -f DoorDaemon.tini + diff --git a/IndexRtTest/IndexRtTest.java b/IndexRtTest/IndexRtTest.java new file mode 100644 index 0000000..d0805b0 --- /dev/null +++ b/IndexRtTest/IndexRtTest.java @@ -0,0 +1,76 @@ +/****************************************************************************** + + Actuator Interface Card + Index Real Time Test + User Interface Module + Copyright (C) 2005 Walter Fetter Lages + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +import com.dalsemi.system.*; + +public class IndexRtTest +{ + public static native int startRealtime(int period); + public static native void stopRealtime(); + public static native boolean getIndex(); + + public static void main(String[] args) + { + System.out.println("IndexRtTest"); + System.out.println("Copyright (C) Walter Fetter Lages, 2005.\n"); + + int tfms=0; + if(args.length==1) + { + tfms=Integer.parseInt(args[0]); + } + else + { + System.out.println("Usage:\tIndexRtTest ms"); + System.exit(1); + } + + System.out.print("Loading native library..."); + System.loadLibrary("indextest.tlib"); + System.out.println("done."); + + int us=10000; + System.out.print("Starting real-time timer with "+us+" us period..."); + int period=startRealtime(us); + System.out.println("done."); + System.out.println("Effective period: "+period+" us."); + + System.out.println("Running IndexRtTest for "+tfms+" ms..."); + long t0=TINIOS.uptimeMillis(); + long t=0; + while(t <= tfms) + { + t=TINIOS.uptimeMillis()-t0; + System.out.print("t="+t+" ms"); + System.out.println("\tindex="+getIndex()); + } + System.out.println("...done."); + + System.out.print("Stoping real-time timer..."); + stopRealtime(); + System.out.println("done."); + } +} diff --git a/IndexRtTest/Makefile b/IndexRtTest/Makefile new file mode 100644 index 0000000..31c4b17 --- /dev/null +++ b/IndexRtTest/Makefile @@ -0,0 +1,45 @@ +CLASSPATH=-classpath /opt/tini/bin/tini.jar:/opt/tini/bin/tiniclasses.jar +APIDBPATH=-d /opt/tini/bin/tini.db +TINIRTAIPATH=${HOME}/src/tini/rtai +LIBPATH=-PATH ${TINIRTAIPATH}/lib/rtai.jar +JAVAFLAGS=-O -target 1.1 -source 1.3 +ASMINC=-I/opt/tini/native/lib +ASMOPT=-f 1.15 -p 390 -l +ASMMACRO=/opt/tini/native/bin/Linux/macro +ASM=/opt/tini/native/bin/Linux/a390 +CC=sdcc +CFLAGS=-mTININative -S --use-accelerator +CINCLUDE=-I${TINIRTAIPATH}/include -I../include +CMPFLAGS=${CFLAGS} ${CINCLUDE} + +all: IndexRtTest.tini + +IndexRtTest.class: IndexRtTest.java + javac ${CLASSPATH} ${JAVAFLAGS} IndexRtTest.java + +indextest.mpp: indextest.a51 + ${ASMMACRO} ${ASMINC} -e- indextest.a51 + +globals.mpp: globals.a51 + ${ASMMACRO} ${ASMINC} -e- globals.a51 + +indextest.tlib: indextest.mpp globals.mpp ../lib/aicio.mpp.lib + cat indextest.mpp globals.mpp ../lib/aicio.mpp.lib > tmp.mpp + echo end >> tmp.mpp + ${ASM} ${ASMOPT} tmp.mpp + mv tmp.tlib indextest.tlib + mv tmp.lst indextest.lst + +indextest.a51: indextest.c + ${CC} ${CMPFLAGS} indextest.c + +IndexRtTest.tini: IndexRtTest.class indextest.tlib + java ${CLASSPATH} TINIConvertor -n indextest.tlib -f IndexRtTest.class ${APIDBPATH} -o IndexRtTest.tini + + +clean: + rm -f *.bak *~ IndexRtTest.class indextest.tlib indextest.mpp indextest.lst indextest.a51 globals.mpp tmp.mpp tmp.lst + +distclean: clean + rm -f IndexRtTest.tini + diff --git a/IndexRtTest/globals.a51 b/IndexRtTest/globals.a51 new file mode 100644 index 0000000..acdc2d9 --- /dev/null +++ b/IndexRtTest/globals.a51 @@ -0,0 +1,29 @@ +;****************************************************************************** +; +; Actuator Interface Card +; Index Real Time Test +; Real Time Module Global Variables +; Copyright (C) 2005 Walter Fetter Lages +; +; This program is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +; +; You can also obtain a copy of the GNU General Public License +; at . +; +;*******************************************************************************/ + + +index: db 0,0,0,0 + end diff --git a/IndexRtTest/indextest.c b/IndexRtTest/indextest.c new file mode 100644 index 0000000..8b7c916 --- /dev/null +++ b/IndexRtTest/indextest.c @@ -0,0 +1,103 @@ +/****************************************************************************** + + Actuator Interface Card + Brake Real Time Test + Real Time Module + Copyright (C) 2005 Walter Fetter Lages + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#include + +#define BASE 0x800000 + +extern volatile long index; + +void initialize(void) +{ + index_initialize(BASE); +} + +/* public static native int startRealtime(int period) */ +long Native_startRealtime(void) _JavaNative +{ + volatile long period = NatLib_LoadInt(0); + + _asm + + mov T2CON,#00h ; clear TR2 = disable timer 2 + anl IE,#0dfh ; clear ET2 = disable timer 2 interrupt + + mov dps,#1 + mov dptr,#indextest + mov a,#2bh ; timer 2 + call System_InstallInterrupt + mov dps,#00h + + anl CKCON,#0dfh ; clear T2M = timer 2 uses clock/12 + mov T2MOD,#00h ; clear DCEN = counts up only + +; TINI oscillator is 18432000 => counter=0c400h=100Hz + mov RCAP2L,#00h ; count reload LSB + mov TL2,#00h ; count LSB + mov RCAP2H,#0c4h ; count reload MSB + mov TH2,#0c4h ; count MSB + + orl IP,#20h ; set PT2 = set timer 2 interrupt to high priority + orl IE,#20h ; set ET2 = enable timer 2 interrupt + + mov T2CON,#04h ; set TR2 = enable timer 2 + _endasm; + + initialize(); + + return period; +} + +/* public static native void stopRealtime() */ +void Native_stopRealtime(void) _JavaNative +{ + _asm + mov T2CON,#00h ; clear TR2 = disable timer 2 + anl IE,#0dfh ; clear ET2 = disable timer 2 interrupt + anl IP,#0dfh ; clear PT2 = set timer 2 interrupt to normal priority + _endasm; +} + +static void int2ack(void) +{ + _asm + anl T2CON,#7fh ; clear TF2 = clears timer 2 overflow + _endasm; +} + +static void indextest(void) interrupt +{ + int2ack(); + + index=index_read(); +} + +/* public static native boolean getIndex() */ +long Native_getIndex(void) _JavaNative +{ + return index; +} + diff --git a/Makefile b/Makefile index 0d112af..c2075f1 100644 --- a/Makefile +++ b/Makefile @@ -9,8 +9,9 @@ PACKAGES= doc \ JointTest \ MotorReset \ MotorTest \ - PIDDaemon \ + PID \ StrobeTest \ + DoorDaemon \ aicd \ braketst \ encodertst \ diff --git a/PID/Makefile b/PID/Makefile index f801da0..3d26167 100644 --- a/PID/Makefile +++ b/PID/Makefile @@ -9,7 +9,7 @@ ASMMACRO=/opt/tini/native/bin/Linux/macro ASM=/opt/tini/native/bin/Linux/a390 CC=sdcc CFLAGS=-mTININative -S --use-accelerator -CINCLUDE=-I${TINIRTAIPATH}/include +CINCLUDE=-I${TINIRTAIPATH}/include -I../include CMPFLAGS=${CFLAGS} ${CINCLUDE} all: PID.tini @@ -23,8 +23,8 @@ pid.mpp: pid.a51 globals.mpp: globals.a51 ${ASMMACRO} ${ASMINC} globals.a51 -pid.tlib: pid.mpp globals.mpp - cat pid.mpp globals.a51 > tmp.mpp +pid.tlib: pid.mpp globals.mpp ../lib/aicio.mpp.lib + cat pid.mpp ../lib/aicio.mpp.lib globals.mpp > tmp.mpp ${ASM} ${ASMOPT} tmp.mpp mv tmp.tlib pid.tlib mv tmp.lst pid.lst diff --git a/PID/PID.java b/PID/PID.java index 5771b2a..4a78bc5 100644 --- a/PID/PID.java +++ b/PID/PID.java @@ -62,13 +62,14 @@ public class PID System.out.println("Running PID for "+tfms+" ms..."); long t0=TINIOS.uptimeMillis(); long t=0; - while(t <= tfms) + while(t <= tfms || true) { t=TINIOS.uptimeMillis()-t0; System.out.print("t="+t+" ms"); float ref=((float)t)/2; - setReference(ref); - System.out.println("\treference="+ref+"\toutput="+getOutput()); +// setReference(ref); + System.out.print("\treference="+ref); + System.out.println("\toutput="+getOutput()); } System.out.println("...done."); diff --git a/PID/globals.a51 b/PID/globals.a51 index bf5b08d..4bae99a 100644 --- a/PID/globals.a51 +++ b/PID/globals.a51 @@ -26,6 +26,7 @@ output: db 0,0,0,0 -th: db 0,0 +;th: db 0,0 reference: db 0,0,0,0 +controller_time_1_1: db 0,0,0,0 end diff --git a/PID/pid.c b/PID/pid.c index c27d19c..f2ee2ef 100644 --- a/PID/pid.c +++ b/PID/pid.c @@ -24,9 +24,18 @@ *******************************************************************************/ +#include + +#define BASE 0x800000 + extern volatile float output; extern volatile float reference; +void initialize(void) +{ + brake_initialize(BASE); +} + /* public static native int startRealtime(int period) */ long Native_startRealtime(void) _JavaNative { @@ -57,6 +66,8 @@ long Native_startRealtime(void) _JavaNative mov T2CON,#04h ; set TR2 = enable timer 2 _endasm; + + initialize(); return period; } @@ -80,8 +91,13 @@ static void int2ack(void) static void controller(void) interrupt { + static int time=0; + int2ack(); + if(time) brake_apply(); else brake_release(); + time=~time; + output=reference; } diff --git a/include/aicio.h b/include/aicio.h new file mode 100644 index 0000000..c5a186e --- /dev/null +++ b/include/aicio.h @@ -0,0 +1,128 @@ +/****************************************************************************** + Actuator Interface Card + I/O Interface Library + + Copyright (C) 2005 Walter Fetter Lages + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#ifndef _AICIO_H +#define _AICIO_H + +/** @file aicio.h +* I/O Interface Library +* @author Walter Fetter Lages +* @since AIC-1.4.2 +*/ + +/** @defgroup aicio AIC I/O Interface +@{ +*/ + +/** Initializes brake +* @param base Base address for on board devices +* @since AIC-1.4.2 +*/ +extern void brake_initialize(unsigned long base); + +/** Applies the electromagnetic brake +* @since AIC-1.4.2 +*/ +extern void brake_apply(void); + +/** Releases the electromagnetic brake +* @since AIC-1.4.2 +*/ +extern void brake_release(void); + +/** Initializes Index +* @param base Base address for on board devices +* @since AIC-1.4.2 +*/ +extern void index_initialize(unsigned long base); + +/** Reads the sync-switch +* @return the sync-switch state +* @since AIC-1.4.2 +*/ +extern unsigned long index_read(void); + +/** Sets the frequency of PWM in cycles of 10MHz +* @param count number of cycles from 10 to 65530. Default +* value is 500 +* @since AIC-1.4.2 +*/ +extern void pwm_set_count(unsigned int count); + +/** Sets the frequency of PWM +* @param frequency frequency in Hz from 152.60Hz to 1MHz. Default +* value is 20KHz +* @since AIC-1.4.2 +*/ +extern void pwm_set_freq(float frequency); + +/** Returns the frequency of PWM +* @return PWM frequency in Hz +* @since AIC-1.4.2 +*/ +//extern double pwm_get_freq(void); + +/** PWM initialization +* @param base Base address for on board devices +* @param min_count MIN_COUNT +* @param count frequency of PWM in cycles of 10MHz. Number of cycles +* from 10 to 65530. +* @since AIC-1.4.2 +*/ +extern void pwm_initialize(unsigned long base,unsigned int min_count,unsigned int count); + +/** Finalizes the PWM +* @since AIC-1.4.2 +*/ +extern void pwm_finalize(void); + +/** Sets the duty-cycle of PWM +* @param dutycycle to be used by PWM as a float from 0 to 1.0 +* @return the count value programmed to the PWM timer +* @since AIC-1.4.2 +*/ +extern unsigned long pwm_set_duty(float dutycycle); + +/** Sets the duty-cycle of PWM +* @param dutycycle to be used by PWM as a int from 0 to 1000000 +* @return the count value programmed to the PWM timer +* @since AIC-1.4.2 +*/ +extern unsigned long pwm_set_duty(unsigned long dutycycle); + +/** Turns the PWM on +* @since AIC-1.4.2 +*/ +extern void pwm_on(void); + +/** Turns the PWM off +* @since AIC-1.4.2 +*/ +extern void pwm_off(void); + +/** +@} +*/ +#endif diff --git a/include/apiequ.inc b/include/apiequ.inc deleted file mode 120000 index af5d244..0000000 --- a/include/apiequ.inc +++ /dev/null @@ -1 +0,0 @@ -/opt/tini/native/lib/apiequ.inc \ No newline at end of file diff --git a/lib/Makefile b/lib/Makefile index 0767d0f..5c14870 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -5,7 +5,7 @@ JAVAFLAGS=-O -target 1.1 -source 1.3 NATINC=/opt/tini/native/lib ASMINC=../include -TINIINC=${ASMINC}/tini.inc ${ASMINC}/tinimacro.inc ${ASMINC}/ds80c390.inc +TINIINC=${ASMINC}/tini.inc ${ASMINC}/tinimacro.inc ${ASMINC}/ds80c390.inc ${ASMINC}/apiequ.inc ASMOPT=-f 1.15 -p 390 -l ASMMACRO=/opt/tini/native/bin/Linux/macro ASM=/opt/tini/native/bin/Linux/a390 @@ -29,7 +29,7 @@ CMP= g++ CMPFLAGS= ${FLAGS} ${INCLUDE} LDFLAGS= ${LIBDIR} ${LIBS} -all: AIC.jar libaic.a +all: AIC.jar libaic.a aicio.mpp.lib ${PKGPATH}/PLD.class: PLD.java javac ${JAVAFLAGS} ${CLASSPATH} -d . PLD.java @@ -72,22 +72,32 @@ ${ASMINC}/tinimacro.inc: ${NATINC}/tinimacro.inc ${ASMINC}/ds80c390.inc: ${NATINC}/ds80c390.inc ln -s ${NATINC}/ds80c390.inc ${ASMINC}/ds80c390.inc + +${ASMINC}/apiequ.inc: ${NATINC}/apiequ.inc + ln -s ${NATINC}/apiequ.inc ${ASMINC}/apiequ.inc brake.mpp: brake.a51 ${TINIINC} ${ASMINC}/aicpld.inc - ${ASMMACRO} -I${ASMINC} brake.a51 + ${ASMMACRO} -I${ASMINC} -e- brake.a51 -brake.tlib: brake.mpp - ${ASM} ${ASMOPT} brake.mpp +brake.tlib: tlib/brake.mpp brake.mpp + cat tlib/brake.mpp brake.mpp > brake.tmp.mpp + echo end >> brake.tmp.mpp + ${ASM} ${ASMOPT} brake.tmp.mpp +tlib/brake.mpp: tlib/brake.a51 + $(MAKE) -C tlib brake.mpp + index.mpp: index.a51 ${TINIINC} ${ASMINC}/aicpld.inc - ${ASMMACRO} -I${ASMINC} index.a51 + ${ASMMACRO} -I${ASMINC} -e- index.a51 -index.tlib: index.mpp - ${ASM} ${ASMOPT} index.mpp - -t.tlib: t.mpp - ${ASM} ${ASMOPT} t.mpp +index.tlib: tlib/index.mpp index.mpp + cat tlib/index.mpp index.mpp > index.tmp.mpp + echo end >> index.tmp.mpp + ${ASM} ${ASMOPT} index.tmp.mpp +tlib/index.mpp: tlib/index.a51 + $(MAKE) -C tlib index.mpp + encoder.mpp: encoder.a51 ${TINIINC} ${ASMINC}/aicpld.inc ${ASMMACRO} -I${ASMINC} encoder.a51 @@ -138,20 +148,27 @@ aichostcan.o: aichostcan.cpp ../include/aichostcan.h ../include/aicnet.h libaic.a: aic.o aicudp.o aiccan.o aicsim.o aichost.o aichostudp.o aichostcan.o ar -crvs libaic.a aic.o aicudp.o aiccan.o aicsim.o aichost.o aichostudp.o aichostcan.o +aicio.mpp.lib: brake.mpp index.mpp + cat brake.mpp index.mpp > aicio.mpp.lib + install: install -m 0644 libaic.a ${LIBINST} install -m 0644 AIC.jar ${LIBINST} install -m 0755 -d ${INCLUDEINST}/cpp install -m 0644 ../include/*.h ${INCLUDEINST}/cpp + $(MAKE) -C tlib install clean: rm -rf *.o *~ *.bak *.class ../include/{*.bak,*~} br *.tlib *.mpp ${TINIINC} *.lst + $(MAKE) -C tlib clean distclean: clean rm -rf AIC.jar *.a + $(MAKE) -C tlib distclean uninstall: rm ${LIBINST}/libaic.a rm ${LIBINST}/AIC.jar rm ${INCLUDEINST}/cpp/aic.h rm ${INCLUDEINST}/cpp/aicnet.h + $(MAKE) -C tlib uninstall diff --git a/lib/brake.a51 b/lib/brake.a51 index 1a01b96..3f77038 100644 --- a/lib/brake.a51 +++ b/lib/brake.a51 @@ -1,8 +1,8 @@ ;****************************************************************************** ; ; Actuator Interface Card -; Brake Native Methods -; Copyright (C) 2004 Walter Fetter Lages +; Brake Functions +; Copyright (C) 2005 Walter Fetter Lages ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by @@ -30,38 +30,30 @@ $include(tinimacro.inc) $include(aicpld.inc) $include(aicmacro.inc) -; Native library initialization routine -; This routine must exist -; This routine must be at offset 0 -; If -f and -p options are used, a390 relocates this routine -; to another offset -; Label is meaningless and is not used by Java Sytem.LoadLibrary() -lib_init: - clr a ; success - ret - ; data saved in big-endian mode ; Brake base address -base: db 0,0,0 +brake_base: db 0,0,0 ; Initializes Brake -; private static native void initialize(int base); -native_initialize: - clr a - lcall Natlib_LoadPrimitive ; get parameter in R3:R2:R1:R0 +; void brake_initialize(unsigned long base); +brake_initialize: + mov r0,dpl ; parameter in b:dpx:dph:dpl + mov r1,dph ; BUG IN SDCC MANUAL! + mov r2,dpx + mov r3,b mov dptr,#CONTROL ; compute brake address lcall Add_Dptr1_24 ; dptr=dptr+R2:R1:R0 - STORE24 #base ; store brake address + STORE24 #brake_base ; store brake address clr a ; success ret ; Applies the electromagnetic brakes -; public static native void apply() -native_apply: - LOAD24 #base ; get brake address +; void brake_apply(void) +brake_apply: + LOAD24 #brake_base ; get brake address SET_STRETCH STRETCH @@ -77,9 +69,9 @@ native_apply: ret ; Releases the electromagnetic brake -; public static native void release() -native_release: - LOAD24 #base ; get brake address +; void brake_release(void) +brake_release: + LOAD24 #brake_base ; get brake address SET_STRETCH STRETCH diff --git a/lib/index.a51 b/lib/index.a51 index e3a0ebf..bff12f8 100644 --- a/lib/index.a51 +++ b/lib/index.a51 @@ -1,8 +1,8 @@ ;****************************************************************************** ; ; Actuator Interface Card -; Index Native Methods -; Copyright (C) 2004 Walter Fetter Lages +; Index Function +; Copyright (C) 2005 Walter Fetter Lages ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by @@ -30,39 +30,31 @@ $include(tinimacro.inc) $include(aicpld.inc) $include(aicmacro.inc) -; Native library initialization routine -; This routine must exist -; This routine must be at offset 0 -; If -f and -p options are used, a390 relocates this routine -; to another offset -; Label is meaningless and is not used by Java Sytem.LoadLibrary() -lib_init: - clr a ; success - ret - ; data saved in big-endian mode ; Index base address -base: db 0,0,0 +index_base: db 0,0,0 ; Initializes Index -; private static final native void initialize(int base); -native_initialize: - clr a - lcall Natlib_LoadPrimitive ; get parameter in R3:R2:R1:R0 +; void index_initialize(unsigned long base); +index_initialize: + mov r0,dpl ; parameter in b:dpx:dph:dpl + mov r1,dph ; BUG IN SDCC MANUAL! + mov r2,dpx + mov r3,b mov dptr,#CONTROL ; compute index address lcall Add_Dptr1_24 ; dptr=dptr+R2:R1:R0 - STORE24 #base ; store index address + STORE24 #index_base ; store index address clr a ; success ret ; Reads the sync-switch ; returns the sync-switch state -; public static native boolean read() -native_read: - LOAD24 #base ; get index address +; unsigned long index_read(void) +index_read: + LOAD24 #index_base ; get index address SET_STRETCH STRETCH @@ -73,11 +65,11 @@ native_read: RESTORE_STRETCH r0 anl a,#01h - mov r0,a ; return value in R3:R2:R1:R0 - clr a ; sucess - mov r1,a - mov r2,a - mov r3,a + mov dpl,a ; return value in b:dpx:dph:dpl + clr a ; BUG IN SDCC MANUAL! + mov dph,a + mov dpx,a + mov b,a ret diff --git a/lib/pwm.a51 b/lib/pwm.a51 index 89878c0..7370e5b 100644 --- a/lib/pwm.a51 +++ b/lib/pwm.a51 @@ -1,8 +1,8 @@ ;****************************************************************************** ; ; Actuator Interface Card -; PWM Native Methods -; Copyright (C) 2004 Walter Fetter Lages +; PWM Functions +; Copyright (C) 2004, 2005 Walter Fetter Lages ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by @@ -31,36 +31,27 @@ $include(i8254.inc) $include(aicpld.inc) $include(aicmacro.inc) -; Native library initialization routine -; This routine must exist -; This routine must be at offset 0 -; If -f and -p options are used, a390 relocates this routine -; to another offset -; Label is meaningless and is not used by Java Sytem.LoadLibrary() -lib_init: - clr a ; success - ret ; data saved in big-endian mode ; PWM base address -pwmbase: db 0,0,0 +pwm_base: db 0,0,0 ; PWM frequency in cycles of 10MHz -max_count: db 0,0 +pwm_max_count: db 0,0 ; minimal value to load in PWM -min_count: db 0,0 +pwm_min_count: db 0,0 ; Control Register base address -ctrlbase: db 0,0,0 +pwm_ctrl_base: db 0,0,0 ; Sets the frequency of PWM in cycles of 10MHz -; public static native void setCount(int count) -native_setCount: - clr a - lcall Natlib_LoadPrimitive ; get parameter in R3:R2:R1:R0 +; void pwm_set_count(unsigned int count) +pwm_set_count: + mov r0,dpl ; parameter in dph:dpl + mov r1,dph ; BUG IN SDCC MANUAL! -set_count: LOAD24 #pwmbase ; get PWM address + LOAD24 #pwm_base ; get PWM address mov a,#CTRL_8254 ; compute control register address ADD_DPTR_0_A @@ -70,7 +61,7 @@ set_count: LOAD24 #pwmbase ; get PWM address SET_STRETCH STRETCH ENTER_PCE_SPACE_AND_PUSH_STATE #0 - mov a,#RATE_BIN_8254 ; set timer 0 mode + mov a,#RATE_BIN_8254 ; set timer 0 mode movx @dptr,a mov a,#ONE_SHOT_BIN_8254 ; set timer 1 mode @@ -96,7 +87,7 @@ set_count: LOAD24 #pwmbase ; get PWM address EXIT_PCE_SPACE_AND_POP_STATE inc DPS ; save count - mov dptr,#max_count + mov dptr,#pwm_max_count movx @dptr,a ; store count msB inc dptr mov a,r2 ; store count lsB @@ -126,8 +117,8 @@ duty50: inc dptr ; point dptr to timer 1 ret ; Initializes PWM -; private static native void initialize(int base,int min_count,int count); -native_initialize: +; void pwm_initialize(unsigned long base,unsigned int min_count,unsigned int count); +pwm_initialize: clr a lcall Natlib_LoadPrimitive ; get first parameter in R3:R2:R1:R0 @@ -138,7 +129,7 @@ native_initialize: mov dptr,#CONTROL ; compute Control address lcall Add_Dptr1_24 ; dptr=dptr+R2:R1:R0 - STORE24 #ctrlbase ; store Control register address + STORE24 #pwm_ctrl_base ; store Control register address pop R2_B0 pop R1_B0 @@ -147,11 +138,11 @@ native_initialize: mov dptr,#PWM ; compute PWM address lcall Add_Dptr1_24 ; dptr=dptr+R2:R1:R0 - STORE24 #pwmbase ; store PWM address + STORE24 #pwm_base ; store PWM address mov a,#1h lcall Natlib_LoadPrimitive ; get second parameter in R3:R2:R1:R0 - mov dptr,#min_count ; stores it + mov dptr,#pwm_min_count ; stores it mov a,r1 movx @dptr,a inc dptr @@ -161,16 +152,16 @@ native_initialize: mov a,#2h lcall Natlib_LoadPrimitive ; get third parameter in R3:R2:R1:R0 - ljmp set_count ; fall over to native_setCount + ljmp pwm_set_count ; fall over to native_setCount ; Finalizes PWM -; public native void finalize() -native_finalize: - LOAD24 #pwmbase ; get pwm address +; void finalize(void) +pwm_finalize: + LOAD24 #pwm_base ; get pwm address inc DPS ; get count msB - mov dptr,#max_count + mov dptr,#pwm_max_count movx a,@dptr mov r1,a inc dptr ; get count lsB @@ -180,14 +171,16 @@ native_finalize: SET_STRETCH STRETCH - ljmp duty50 ; fall over to native setCounter + ljmp duty50 ; fall over to native pwm_set_count ; Sets the duty-cycle of PWM -; public static native int setDuty(int dutycycle) -native_setDuty: - clr a - lcall Natlib_LoadPrimitive ; get parameter in R3:R2:R1:R0 +; unsigned long pwm_set_duty(unsigned long dutycycle) +pwm_set_duty: + mov r0,dpl ; parameter in b:dpx:dph:dpl + mov r1,dph ; BUG IN SDCC MANUAL! + mov r2,dpx + mov r3,b mov a,r3 ; ensures R3:R2:R1:R0 >= 0 jnb ACC.7,parmpos @@ -234,7 +227,7 @@ waitshift: mov a,MCNT1 mov MCNT1,#00h ; R1:R0 * max_count using mov MB,r0 ; math accelarator mov MB,r1 - mov dptr,#max_count ; load max_count in R1_B1:R0:B1 + mov dptr,#pwm_max_count ; load max_count in R1_B1:R0:B1 movx a,@dptr mov R1_B1,a inc dptr @@ -276,7 +269,7 @@ waitdiv: mov a,MCNT1 subb a,r1 mov r1,a - mov dptr,#min_count ; check if count < min_count + mov dptr,#pwm_min_count ; check if count < min_count movx a,@dptr mov r3,a inc dptr @@ -311,7 +304,7 @@ countabove: clr c ; check if count > max_count-min_count mov r0,R2_B0 mov r1,R3_B0 -countok: LOAD24 #pwmbase ; get PWM address +countok: LOAD24 #pwm_base ; get PWM address mov a,#TIMER1_8254 ; compute timer 1 address ADD_DPTR_0_A @@ -329,22 +322,22 @@ countok: LOAD24 #pwmbase ; get PWM address RESTORE_STRETCH r0 ; restore original stretch value - mov r0,b ; return count in R3:R2:R1:R0 - - clr a ; success + mov dpl,b ; return count in b:dbx:dph:dpl + mov dph,r1 + + clr a - mov r2,a - mov r3,a + mov dpx,a + mov b,a ret ; Turns the PWM on -; public static native void on() - -native_on: - LOAD24 #ctrlbase ; get control register address +; void pwm_on(void) +pwm_on: + LOAD24 #pwm_ctrl_base ; get control register address SET_STRETCH STRETCH @@ -359,9 +352,9 @@ native_on: ret ; Turns the PWM off -; public static native void off() -native_off: - LOAD24 #ctrlbase ; get control register address +; void pwm_off(void) +pwm_off: + LOAD24 #pwm_ctrl_base ; get control register address SET_STRETCH STRETCH diff --git a/lib/tlib/Makefile b/lib/tlib/Makefile new file mode 100644 index 0000000..b7a128d --- /dev/null +++ b/lib/tlib/Makefile @@ -0,0 +1,64 @@ +CLASSPATH=-classpath /opt/tini/bin/tini.jar:/opt/tini/bin/tiniclasses.jar:/opt/tini/bin/modules.jar:. +APIDBPATH=-d /opt/tini/bin/tini.db +PKGPATH=br/ufrgs/eletro/AIC +JAVAFLAGS=-O -target 1.1 -source 1.3 + +NATINC=/opt/tini/native/lib +ASMINC=../../include +TINIINC=${ASMINC}/tini.inc ${ASMINC}/tinimacro.inc ${ASMINC}/ds80c390.inc +ASMOPT=-f 1.15 -p 390 -l +ASMMACRO=/opt/tini/native/bin/Linux/macro +ASM=/opt/tini/native/bin/Linux/a390 + +CFLAGS = -O2 -Wall -march=i486 +INCLUDE = -I. -I${HOME}/include + +CPPFLAGS = +CPPINCLUDE = -I${HOME}/include/cpp -I/usr/local/include/cpp -I../../include +LIB = ${HOME}/lib + +LIBINST=/usr/local/lib +INCLUDEINST=/usr/local/include + +INCLUDE=${CINCLUDE} ${CPPINCLUDE} +FLAGS= ${CFLAGS} ${CPPFLAGS} -DDEBUG +LIBDIR=${CLIBDIR} ${CPPLIBDIR} +LIBS=${CLIBS} ${CPPLIBS} + +CMP= g++ +CMPFLAGS= ${FLAGS} ${INCLUDE} +LDFLAGS= ${LIBDIR} ${LIBS} + +all: brake.mpp index.mpp encoder.mpp pwm.mpp + + +${ASMINC}/tini.inc: ${NATINC}/tini.inc + ln -s ${NATINC}/tini.inc ${ASMINC}/tini.inc + +${ASMINC}/tinimacro.inc: ${NATINC}/tinimacro.inc + ln -s ${NATINC}/tinimacro.inc ${ASMINC}/tinimacro.inc + +${ASMINC}/ds80c390.inc: ${NATINC}/ds80c390.inc + ln -s ${NATINC}/ds80c390.inc ${ASMINC}/ds80c390.inc + +brake.mpp: brake.a51 ${TINIINC} + ${ASMMACRO} -I${ASMINC} -e- brake.a51 + +index.mpp: index.a51 ${TINIINC} + ${ASMMACRO} -I${ASMINC} -e- index.a51 + +encoder.mpp: encoder.a51 ${TINIINC} + ${ASMMACRO} -I${ASMINC} encoder.a51 + +pwm.mpp: pwm.a51 ${TINIINC} + ${ASMMACRO} -I${ASMINC} pwm.a51 + +install: + +clean: + rm -rf *.o *~ *.bak *.class ../include/{*.bak,*~} br *.tlib *.mpp ${TINIINC} *.lst + +distclean: clean + rm -rf AIC.jar *.a + +uninstall: diff --git a/lib/tlib/brake.a51 b/lib/tlib/brake.a51 new file mode 100644 index 0000000..d3c3324 --- /dev/null +++ b/lib/tlib/brake.a51 @@ -0,0 +1,77 @@ +;****************************************************************************** +; +; Actuator Interface Card +; Brake Native Methods +; Copyright (C) 2004, 2005 Walter Fetter Lages +; +; This program is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +; +; You can also obtain a copy of the GNU General Public License +; at . +; +;******************************************************************************* + +$include(tini.inc) +$include(ds80c390.inc) +$include(tinimacro.inc) + +$include(aicpld.inc) +$include(aicmacro.inc) + +; Native library initialization routine +; This routine must exist +; This routine must be at offset 0 +; If -f and -p options are used, a390 relocates this routine +; to another offset +; Label is meaningless and is not used by Java Sytem.LoadLibrary() +lib_init: + clr a ; success + ret + +; Initializes Brake +; private static native void initialize(int base); +native_initialize: + clr a + lcall Natlib_LoadPrimitive ; get parameter in R3:R2:R1:R0 + + mov b,r3 ; SDCC parameters in b:dpx:dph:dpl + mov dpx,r2 ; BUG IN SDCC MANUAL! + mov dph,r1 + mov dpl,r0 + + lcall brake_initialize + + clr a ; success + ret + +; Applies the electromagnetic brakes +; public static native void apply() +native_apply: + + lcall brake_apply + + clr a ; success + ret + +; Releases the electromagnetic brake +; public static native void release() +native_release: + + lcall brake_release + + clr a ; success + ret + + end diff --git a/lib/tlib/encoder.a51 b/lib/tlib/encoder.a51 new file mode 100644 index 0000000..c9cc67d --- /dev/null +++ b/lib/tlib/encoder.a51 @@ -0,0 +1,159 @@ +;****************************************************************************** +; +; Actuator Interface Card +; Encoder Native Methods +; Copyright (C) 2004 Walter Fetter Lages +; +; This program is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +; +; You can also obtain a copy of the GNU General Public License +; at . +; +;******************************************************************************* + +$include(tini.inc) +$include(ds80c390.inc) +$include(tinimacro.inc) + +$include(aicpld.inc) +$include(aicmacro.inc) + +; Native library initialization routine +; This routine must exist +; This routine must be at offset 0 +; If -f and -p options are used, a390 relocates this routine +; to another offset +; Label is meaningless and is not used by Java Sytem.LoadLibrary() +lib_init: + clr a ; success + ret + +; data saved in big-endian mode +; Encoder base address +base: db 0,0,0 + +; Initializes Encoder +; private static native void initialize(int base); +native_initialize: + clr a + + lcall Natlib_LoadPrimitive ; get parameter in R3:R2:R1:R0 + + mov dptr,#ENCODER ; compute encoder address + lcall Add_Dptr1_24 ; dptr=dptr+R2:R1:R0 + + STORE24 #base ; store encoder address + + SET_STRETCH STRETCH + + ENTER_PCE_SPACE_AND_PUSH_STATE #0 + clr a ; clear encoder + movx @dptr,a + EXIT_PCE_SPACE_AND_POP_STATE + + RESTORE_STRETCH r0 + + clr a ; sucess + ret + +; Finalizes Encoder +; public native void finalize() +native_finalize: + + ; fall-through to native_clear: + +; Clears the counter on the quadrature decoder chip +; public void clear() +native_clear: + LOAD24 #base ; get encoder address + + SET_STRETCH STRETCH + + ENTER_PCE_SPACE_AND_PUSH_STATE #0 + clr a + movx @dptr,a ; clear counter + EXIT_PCE_SPACE_AND_POP_STATE + + RESTORE_STRETCH r0 + + clr a ; success + ret + +; Gets the count on the quadrature decoder chip +; return the number of pulses (in 2-complement) since the last time +; the counter was cleared +; public static native int getCount() +native_getCount: + LOAD24 #base ; get encoder address + + SET_STRETCH STRETCH + + ENTER_PCE_SPACE_AND_PUSH_STATE #0 + movx a,@dptr ; get count high byte + mov r1,a ; return value in R3:R2:R1:R0 + + rlc a ; sign extension to 32 bits + clr a ; r1 > 0 extend with 0s + jnc posextend + cpl a ; r1 < 0 extend with 1s +posextend: mov r2,a ; return value in R3:R2:R1:R0 + mov r3,a + + inc dptr + movx a,@dptr ; get count low byte + EXIT_PCE_SPACE_AND_POP_STATE + + RESTORE_STRETCH r0 + + mov r0,a ; return value in R3:R2:R1:R0 + + clr a ; success + ret + + +; Gets the count and clearsthe counter on the quadrature decoder chip +; return the number of pulses (in 2-complement) since the last time +; the counter was cleared +; public static native int getCountAndClear() +native_getCountAndClear: + LOAD24 #base ; get encoder address + + SET_STRETCH STRETCH + + ENTER_PCE_SPACE_AND_PUSH_STATE #0 + movx a,@dptr ; get count high byte + mov r1,a ; return value in R3:R2:R1:R0 + + rlc a ; sign extension to 32 bits + clr a ; r1 > 0 extend with 0s + jnc posextend1 + cpl a ; r1 < 0 extend with 1s +posextend1: mov r2,a ; return value in R3:R2:R1:R0 + mov r3,a + + inc dptr + movx a,@dptr ; get count low byte + movx @dptr,a ; clear counter + EXIT_PCE_SPACE_AND_POP_STATE + + RESTORE_STRETCH r0 + + mov r0,a ; return value in R3:R2:R1:R0 + + clr a ; success + ret + + end + diff --git a/lib/tlib/index.a51 b/lib/tlib/index.a51 new file mode 100644 index 0000000..4e6e22e --- /dev/null +++ b/lib/tlib/index.a51 @@ -0,0 +1,75 @@ +;****************************************************************************** +; +; Actuator Interface Card +; Index Native Methods +; Copyright (C) 2004, 2005 Walter Fetter Lages +; +; This program is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +; +; You can also obtain a copy of the GNU General Public License +; at . +; +;******************************************************************************* + +$include(tini.inc) +$include(ds80c390.inc) +$include(tinimacro.inc) + +$include(aicpld.inc) +$include(aicmacro.inc) + +; Native library initialization routine +; This routine must exist +; This routine must be at offset 0 +; If -f and -p options are used, a390 relocates this routine +; to another offset +; Label is meaningless and is not used by Java Sytem.LoadLibrary() +lib_init: + clr a ; success + ret + + +; Initializes Index +; private static final native void initialize(int base); +native_initialize: + clr a + lcall Natlib_LoadPrimitive ; get parameter in R3:R2:R1:R0 + + mov b,r3 ; SDCC parameters in b:dpx:dph:dpl + mov dpx,r2 ; BUG IN SDCC MANUAL! + mov dph,r1 + mov dpl,r0 + + lcall index_initialize + + clr a ; success + ret + +; Reads the sync-switch +; returns the sync-switch state +; public static native boolean read() +native_read: + lcall index_read ; SDCC returns value in b:dpx:dph:dpl + + mov r0,dpl ; java native return value in R3:R2:R1:R0 + mov r1,dph + mov r2,dpx + mov r3,b + + clr a ; sucess + ret + + end + diff --git a/lib/tlib/pwm.a51 b/lib/tlib/pwm.a51 new file mode 100644 index 0000000..ff7601d --- /dev/null +++ b/lib/tlib/pwm.a51 @@ -0,0 +1,140 @@ +;****************************************************************************** +; +; Actuator Interface Card +; PWM Native Methods +; Copyright (C) 2004, 2005 Walter Fetter Lages +; +; This program is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +; +; You can also obtain a copy of the GNU General Public License +; at . +; +;******************************************************************************* + +$include(tini.inc) +$include(ds80c390.inc) +$include(tinimacro.inc) + +$include(i8254.inc) +$include(aicpld.inc) +$include(aicmacro.inc) + +; Native library initialization routine +; This routine must exist +; This routine must be at offset 0 +; If -f and -p options are used, a390 relocates this routine +; to another offset +; Label is meaningless and is not used by Java Sytem.LoadLibrary() +lib_init: + clr a ; success + ret + +; Sets the frequency of PWM in cycles of 10MHz +; public static native void setCount(int count) +native_setCount: + clr a + lcall Natlib_LoadPrimitive ; get parameter in R3:R2:R1:R0 + ; only the lower 16 bits are usefull + + mov dph,r1 ; SDCC parameters in dph:dpl + mov dpl,r0 ; BUG IN SDCC MANUAL! + + lcall pwm_set_count + + clr a ; success + ret + +; Initializes PWM +; private static native void initialize(int base,int min_count,int count); +native_initialize: + clr a + lcall Natlib_LoadPrimitive ; get first parameter in R3:R2:R1:R0 + + push R0_B0 + push R1_B0 + push R2_B0 + + mov dptr,#CONTROL ; compute Control address + lcall Add_Dptr1_24 ; dptr=dptr+R2:R1:R0 + + STORE24 #ctrlbase ; store Control register address + + pop R2_B0 + pop R1_B0 + pop R0_B0 + + mov dptr,#PWM ; compute PWM address + lcall Add_Dptr1_24 ; dptr=dptr+R2:R1:R0 + + STORE24 #pwmbase ; store PWM address + + mov a,#1h + lcall Natlib_LoadPrimitive ; get second parameter in R3:R2:R1:R0 + mov dptr,#min_count ; stores it + mov a,r1 + movx @dptr,a + inc dptr + mov a,r0 + movx @dptr,a + + mov a,#2h + lcall Natlib_LoadPrimitive ; get third parameter in R3:R2:R1:R0 + + ljmp set_count ; fall over to native_setCount + + +; Finalizes PWM +; public native void finalize() +native_finalize: + lcall pwm_finalize + ret + +; Sets the duty-cycle of PWM +; public static native int setDuty(int dutycycle) +native_setDuty: + clr a + lcall Natlib_LoadPrimitive ; get parameter in R3:R2:R1:R0 + + mov b,r3 ; SDCC parameters in b:dpx:dph:dpl + mov dpx,r2 ; BUG IN SDCC MANUAL! + mov dph,r1 + mov dpl,r0 + + lcall pwm_set_duty ; SDCC returns value in dph:dpl + + mov r0,dpl ; java native return value in R3:R2:R1:R0 + mov r1,dph + mov r2,dpx + mov r3,b + + clr a ; sucess + ret + + +; Turns the PWM on +; public static native void on() + +native_on: + lcall pwm_on + ret + +; Turns the PWM off +; public static native void off() +native_off: + lcall pwm_off + ret + + end + diff --git a/trtai/PID/Makefile b/trtai/PID/Makefile new file mode 100644 index 0000000..d917cc9 --- /dev/null +++ b/trtai/PID/Makefile @@ -0,0 +1,44 @@ +CLASSPATH=-classpath /opt/tini/bin/tini.jar:/opt/tini/bin/tiniclasses.jar +APIDBPATH=-d /opt/tini/bin/tini.db +TINIRTAIPATH=${HOME}/src/tini/rtai +LIBPATH=-PATH ${TINIRTAIPATH}/lib/rtai.jar +JAVAFLAGS=-O -target 1.1 -source 1.3 +ASMINC=-I/opt/tini/native/lib +ASMOPT=-f 1.14 -p 390 -l +ASMMACRO=/opt/tini/native/bin/Linux/macro +ASM=/opt/tini/native/bin/Linux/a390 +CC=sdcc +CFLAGS=-mTININative -S --use-accelerator +CINCLUDE=-I${TINIRTAIPATH}/include +CMPFLAGS=${CFLAGS} ${CINCLUDE} + +all: PID.tini + +PID.class: PID.java + javac ${CLASSPATH} ${JAVAFLAGS} PID.java + +pid.mpp: pid.a51 + ${ASMMACRO} ${ASMINC} -e- pid.a51 + +globals.mpp: globals.a51 + ${ASMMACRO} ${ASMINC} globals.a51 + +pid.tlib: pid.mpp globals.mpp ${TINIRTAIPATH}/lib/globals.mpp + cat pid.mpp ${TINIRTAIPATH}/lib/globals.mpp globals.a51 > tmp.mpp + ${ASM} ${ASMOPT} tmp.mpp + mv tmp.tlib pid.tlib + mv tmp.lst pid.lst + +pid.a51: pid.c + ${CC} ${CMPFLAGS} pid.c + +PID.tini: PID.class pid.tlib + java ${CLASSPATH} TINIConvertor -n pid.tlib -f PID.class ${APIDBPATH} -o PID.tini + + +clean: + rm -f *.bak *~ PID.class pid.tlib pid.mpp pid.lst pid.a51 globals.mpp tmp.mpp tmp.lst + +distclean: clean + rm -f PID.tini + diff --git a/trtai/PID/PID.java b/trtai/PID/PID.java new file mode 100644 index 0000000..a0f5c33 --- /dev/null +++ b/trtai/PID/PID.java @@ -0,0 +1,78 @@ +/****************************************************************************** + + Actuator Interface Card + PID + User Interface Module + Copyright (C) 2005 Walter Fetter Lages + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +import com.dalsemi.system.*; + +public class PID +{ + public static native int startRealtime(int period); + public static native void stopRealtime(); + public static native void setReference(int reference); + public static native int getOutput(); + + public static void main(String[] args) + { + System.out.println("PID"); + System.out.println("Copyright (C) Walter Fetter Lages, 2005.\n"); + + int tfms=0; + if(args.length==1) + { + tfms=Integer.parseInt(args[0]); + } + else + { + System.out.println("Usage:\tPID ms"); + System.exit(1); + } + + System.out.print("Loading native library..."); + System.loadLibrary("pid.tlib"); + System.out.println("done."); + + int us=10000; + System.out.print("Starting real-time timer with "+us+" us period..."); + int period=startRealtime(us); + System.out.println("done. Effective period: "+period+" us."); + + System.out.print("Running PID for "+tfms+" ms..."); + long t0=TINIOS.uptimeMillis(); + long t=0; + while(t <= tfms) + { + t=TINIOS.uptimeMillis()-t0; + System.out.print("t="+t+" ms"); + int ref=(int)t/2; + setReference(ref); + System.out.println("\treference="+ref+"\toutput="+getOutput()); + } + System.out.println("...done."); + + System.out.print("Stoping real-time timer..."); + stopRealtime(); + System.out.println("done."); + } +} diff --git a/trtai/PID/globals.a51 b/trtai/PID/globals.a51 new file mode 100644 index 0000000..bf5b08d --- /dev/null +++ b/trtai/PID/globals.a51 @@ -0,0 +1,31 @@ +;****************************************************************************** +; +; Actuator Interface Card +; PID +; Real Time Module Global Variables +; Copyright (C) 2005 Walter Fetter Lages +; +; This program is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +; +; You can also obtain a copy of the GNU General Public License +; at . +; +;*******************************************************************************/ + + +output: db 0,0,0,0 +th: db 0,0 +reference: db 0,0,0,0 + end diff --git a/trtai/PID/pid.c b/trtai/PID/pid.c new file mode 100644 index 0000000..d5fd00e --- /dev/null +++ b/trtai/PID/pid.c @@ -0,0 +1,71 @@ +/****************************************************************************** + + Actuator Interface Card + PID + Real Time Module + Copyright (C) 2005 Walter Fetter Lages + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + You can also obtain a copy of the GNU General Public License + at . + +*******************************************************************************/ + +#include + +#include + +extern volatile long *output; +extern volatile pthread_t th; +extern volatile long *reference; + +/* By now this is not actually a thread as it should be, + but a function that is called at each timer interrupt */ +void *count(void *arg) +{ +// volatile long *output=(volatile long *)arg; +// for(;;) +// { +// rt_wait_period(); + *output=*reference; +// } +} + +RTIME Native_startRealtime(void) _JavaNative +{ + volatile long period = NatLib_LoadInt(0); + RTIME count=micro2count(period); + start_rt_timer(count); + pthread_create(&th,NULL,count,output); + return count2micro(count); +} + +void Native_stopRealtime(void) _JavaNative +{ + pthread_cancel(th); + stop_rt_timer(); +} + + +long Native_getOutput(void) _JavaNative +{ + return output; +} + +void Native_setReference(void) _JavaNative +{ + *reference = NatLib_LoadInt(0); +}