00001
00027 #include <stdio.h>
00028 #include "gp3lib.h"
00029
00033 #define DEMO 1
00034
00035
00036
00037
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
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
00218 void gp3argincr(void)
00219 {
00220 gp3write(0x59);
00221 }
00222
00223
00224 void gp3argdecr(void)
00225 {
00226 gp3write(0x58);
00227 }
00228
00229 unsigned int gp3check(void)
00230 {
00231 gp3write(1);
00232 return gp3read();
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]);
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());
00286 gp3check();
00287 printf("gp3ready returns %d\n",gp3ready());
00288 printf("Closing port...\n");
00289 gp3closeport();
00290 return 0;
00291
00292 }
00293
00294 #endif