Main Page   Modules   File List   Globals  

gp3lib.c

Go to the documentation of this file.
00001 
00027 #include <stdio.h>
00028 #include "gp3lib.h"
00029 
00033 #define DEMO 1
00034 
00035 /* This is the part that should not change for each port */
00036 
00037 /* Private function sets argument */
00038 static void setarg(int arg)
00039 {
00040   if (arg<=255) 
00041     {
00042       gp3write(6+(arg&1));
00043       gp3write(0x80+(arg&1));
00044     }
00045   else 
00046     {
00047       int code=8 + (arg&1);
00048       gp3write(code+((arg>>8)&1));
00049       gp3write(0x80+(arg>>9));
00050       gp3write(0x80+((arg&0xFF)>>1));
00051     }
00052 }
00053 
00054 
00055 
00060 unsigned int gp3readword(void)
00061 {
00062   unsigned int rv;
00063   rv=gp3read()<<8;
00064   return rv+gp3read();
00065 }
00066 
00067 /* The remaining functions match the description in the GP3 manual */
00068 
00069 void gp3setLED(int onoff)
00070 {
00071  gp3write(0xC+(onoff&1));
00072 }
00073 
00074 unsigned int gp3a2d(int chan)
00075 {
00076   gp3write(0x30+((chan&7)<<1));
00077   return gp3readword();
00078 }
00079 
00080 void gp3high(int pin)
00081 {
00082   gp3write(0x11+(pin<<1));
00083 }
00084 
00085 void gp3low(int pin)
00086 {
00087   gp3write(0x10+(pin<<1));
00088 }
00089 
00090 void gp3toggle(int pin)
00091 {
00092   gp3write(0x20+(pin<<1));
00093 }
00094 
00095 int gp3input(int pin)
00096 {
00097   gp3write(0x21+(pin<<1));
00098   return gp3read();
00099 }
00100 
00101 void gp3settris(int tris)
00102 {
00103   gp3write(2 + (tris & 1));
00104   gp3write(0x80+(tris>>1));
00105 }
00106 
00107 unsigned int gp3gettris(void)
00108 {
00109   gp3write(0x56);
00110   return gp3read();
00111 }
00112 
00113 void gp3setpins(int byte)
00114 {
00115   gp3write(4+(byte&1));
00116   gp3write(0x80+(byte>>1));
00117 }
00118 
00119 unsigned int gp3getpins(void)
00120 {
00121   gp3write(0x57);
00122   return gp3read();
00123 }
00124 
00125 void gp3writeee(int address,int byte)
00126 {
00127   setarg(address);
00128   gp3write(0x50+(byte&1));
00129   gp3write(0x80+(byte>>1));
00130 }
00131 
00132 unsigned int gp3readee(int address)
00133 {
00134   setarg(address);
00135   gp3write(0x52);
00136   return gp3read();
00137 }
00138 
00139 void gp3pwm(int chan,int dc,int dfreq)
00140 {
00141   setarg(dfreq);
00142   gp3write((chan==-1)?0x54:(0x60+(chan<<1))+(dc&1));
00143   gp3write(0x80+(dc>>1));
00144 }
00145 
00146 unsigned int gp3count(int pin,unsigned int ms)
00147 {
00148   setarg(ms);
00149   gp3write(0x40+(pin<<1));
00150   return gp3readword();
00151 }
00152 
00153 unsigned int gp3rctime(int pin, int state)
00154 {
00155   gp3write(0xE);
00156   gp3write(0xA0+(state&1)+(pin<<1));
00157   return gp3readword();
00158 }
00159 
00160 unsigned int gp3pulsein(int pin, int state)
00161 {
00162   gp3write(0x70+(state&1)+(pin<<1));
00163   return gp3readword();
00164 }
00165 
00166 void gp3pulseout(int pin, int duration)
00167 {
00168   setarg(duration);
00169   gp3write(0x41+(pin<<1));
00170 }
00171 
00172 void gp3freq(int pin, int ms, int freq)
00173 {
00174   setarg(ms);
00175   gp3write(0xE);
00176   gp3write(0x80+(freq&1)+(pin<<1));
00177   gp3write(0x80+(freq>>8));
00178   gp3write(0x80+((freq&0xFF)>>1));
00179 }
00180 
00181 void gp3setcounter(int prescale,int ext)
00182 {
00183   int ps=0;
00184   switch (prescale)
00185     {
00186     case 1: ps=0; break;
00187     case 2: ps=2; break;
00188     case 4: ps=4; break;
00189     case 8: ps=6; break;
00190     }
00191   gp3write(0xE);
00192   gp3write(0x90+ps+(ext&1));
00193 }
00194 
00195 unsigned int gp3counter(void)
00196 {
00197   gp3write(0x5a);
00198   return gp3readword();
00199 }
00200 
00201 void gp3resetall(void)
00202 {
00203   gp3write(0x5c);
00204 }
00205 
00206 void gp3reset(void)
00207 {
00208   gp3write(0);
00209 }
00210 
00211 void gp3repeat(int count)
00212 {
00213   setarg(count-1);
00214   gp3write(0x5b);
00215 }
00216 
00217 /* increment ARG */
00218 void gp3argincr(void)
00219 {
00220   gp3write(0x59);
00221 }
00222 
00223 /* decrement ARG */
00224 void gp3argdecr(void)
00225 {
00226   gp3write(0x58);
00227 }
00228 
00229 unsigned int gp3check(void)
00230 {
00231   gp3write(1);
00232   return gp3read();  /* should be 0x33 */
00233 }
00234 
00235 
00241 #if DEMO
00242 
00247 void pause()
00248 {
00249   printf("Press ENTER\n");
00250   getchar();
00251 }
00252 
00256 int main(int argc, char *argv[])
00257 {
00258   if (argc<2)
00259     {
00260       fprintf(stderr,"Usage: gp3lib port\n");
00261       return 1;
00262     }
00263   if (gp3openport(argv[1])<0)
00264     {
00265       perror(argv[1]);  // This won't give real info in Windows
00266       return 1;
00267     }
00268   printf("Connect an LED to the hardware PWM out line and output #7\n");
00269   printf("Resetting GP3...\n");
00270   gp3resetall();
00271   printf("GP3 version code=%02X\n",gp3check());
00272   printf("Turning onboard LED and out 7 on...\n");
00273   gp3setLED(1);
00274   gp3high(7);
00275   pause();
00276   printf("Turning LEDs off...\n");
00277   gp3setLED(0);
00278   gp3low(7);
00279   printf("Reading A/D: ");
00280   printf("%d\n",gp3a2d(0));
00281   printf("Setting hardware PWM to 16...\n");
00282   gp3pwm(-1,16,2000);
00283   printf("Now 50%% PWM on pin 7 for 5 seconds...\n");
00284   gp3pwm(7,128,5000);
00285   printf("gp3ready returns %d\n",gp3ready());  // should print 0
00286   gp3check(); // wait for done
00287   printf("gp3ready returns %d\n",gp3ready());  // should print 1
00288   printf("Closing port...\n");
00289   gp3closeport();
00290   return 0;
00291 
00292 }
00293 
00294 #endif

Generated on Wed Feb 18 00:34:20 2004 for GP3LIB by doxygen1.2.18