home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / virus / ddj0491.zip / GPIB-491.ASC < prev    next >
Text File  |  1991-03-19  |  6KB  |  193 lines

  1. _UNDERSTANDING THE GPIB_
  2. by Don Morgan
  3.  
  4. [LISTING ONE]
  5.  
  6. /* Scope.c */
  7. #include <stdio.h>
  8. #include "decl.h"    /* a header file containing declares pertinent to the 
  9.                         National Instruments library*/
  10.  
  11. /* Application program variables passed to GPIB functions */
  12. char rd[512];   /* read data buffer*/
  13. int  bd;        /* board number, in this case that representing controller  */
  14.  
  15. main()
  16. {
  17.  
  18. /* Assign unique identifier to board 0 and store in variable bd. Check for 
  19. error.*/
  20. if ((bd = ibfind ("GPIB0")) < 0) error();
  21. printf("\ninitializing controller");
  22. getch();
  23.  
  24. /* Send the Interface Clear (IFC). */
  25. if (ibsic (bd) & ERR) error();
  26.  
  27. /* Turn on Remote Enable (REN) signal so instrument can be programmed. */
  28. if (ibsre (bd,1) & ERR) error();
  29.  
  30. /* Put scope in remote mode by addressing it to listen, send Device Clear 
  31. (DCL) message to clear internal device functions, and address GPIB board to 
  32. talk. */
  33. ibcmd (bd,"?_@' ",4);
  34. if (ibsta & ERR) error();
  35.  
  36. /* Write the function, range, and trigger source instructions to scope. */
  37. ibwrt (bd,":bnc probe",10);
  38. if (ibsta & ERR) error();
  39.  
  40. ibwrt (bd,":acquire:type normal",20);
  41. if (ibsta & ERR) error();
  42.  
  43. ibwrt (bd,":timebase:range 5e-4",20);
  44. if (ibsta & ERR) error();
  45.  
  46. ibwrt (bd,":timebase:delay 0",17);
  47. if (ibsta & ERR) error();
  48.  
  49. ibwrt (bd,":timebase:reference center",26);
  50. if (ibsta & ERR) error();
  51.  
  52. ibwrt (bd,":timebase:mode triggered",24);
  53. if (ibsta & ERR) error();
  54.  
  55. ibwrt (bd,":channel1:probe 10",18);
  56. if (ibsta & ERR) error();
  57.  
  58. ibwrt (bd,":channel:range 1.2",18);
  59. if (ibsta & ERR) error();
  60.  
  61. ibwrt (bd,":trigger:mode edge",18);
  62. if (ibsta & ERR) error();
  63.  
  64. ibwrt (bd,":trigger:slope positive",23);
  65. if (ibsta & ERR) error();
  66.  
  67. ibwrt (bd,":trigger:level 300mv",20);
  68. if (ibsta & ERR) error();
  69.  
  70. ibwrt (bd,":trigger:source channel1",24 );
  71. if (ibsta & ERR) error();
  72.  
  73. /* Scope is now ready to go. Set up SRQ by first clearing internal 
  74. data structures. */
  75. ibwrt (bd,"*cls",4);
  76. if (ibsta & ERR) error();
  77.  
  78. /* Clear the trigger by issuing the command to return the bit. */
  79. ibwrt (bd,":ter?",5);
  80. if (ibsta & ERR) error();
  81.  
  82. /* Then make the scope a talker. */
  83. ibcmd (bd,"?_ G",4);
  84.  
  85. /* And become a listener. Read three bytes or stop when an EOI is received. */
  86. ibrd(bd,rd,3);
  87. if (ibsta & ERR) error();
  88.  
  89. /* When the data is in buffer issue an untalk and unlisten, then make the 
  90. controller a talker again and scope a listener. */
  91. ibcmd (bd,"?_@'",4);
  92.  
  93. /* Enable the SRQ bit within scope that will case an RQS on next trigger. */
  94. ibwrt (bd,"*sre 1",6);
  95.    if (ibsta & ERR) error();
  96.  
  97. /* Now wait for the trigger. */
  98. if (ibwait (bd,SRQI) & (ERR)) error();
  99.  
  100. /* If we are here, scope must have been triggered and must have asserted SRQ 
  101. command line. Do a serial poll. First unaddress bus devices and and send 
  102. Serial Poll Enable (SPE) command, followed by scope's talk address, and GPIB
  103. board's listen address. */
  104. ibcmd (bd,"?_\x18G ",5);      /*UNL UNT SPE TAD MLA*/
  105. if (ibsta & ERR) error();
  106.  
  107. /* Now read status byte. If it is 0x41, the scope has valid data to send; 
  108. otherwise it has a fault condition to report. */
  109. ibrd (bd,rd,1);
  110. if (ibsta & ERR) error();
  111. if ((rd[0] & 0xFF) != 0x41) error();
  112.                
  113. /* Note that if more than one device is attached to bus, each device must be 
  114. checked to see which issued the SRQ. */
  115.  
  116. /* Complete serial poll by sending the Serial Poll Disable (SPD) message. */
  117. if (ibcmd (bd,"\x19",1) & ERR) error();
  118.                
  119. /*Send scope untalk and unlisten; make controller talker and scope listener*/
  120. ibcmd (bd,"?_@'");
  121.                
  122. /*Tell the scope to print the screen and associated data*/
  123. ibwrt(bd,":hardcopy:page automatic",24);
  124. ibwrt(bd,":print?",7);
  125.                
  126. /*Make scope a talker and printer a listener; have controller get out of 
  127. the way for the transfer*/
  128. ibcmd(bd,"?_@!G",5);
  129. ibgts(bd,1);
  130.                
  131. /*Wait for the transfer to complete and reassert control over the bus*/
  132. ibwait(END);
  133.  
  134. /*The program terminates with an interface clear*/
  135. ibsic (bd);
  136. }
  137.  
  138. /* Simple error routine that reads system variables and returns them. */
  139. error()
  140.  {
  141.    printf("\nGPIB function call error:");
  142.    printf("\nibsta=0x%x, iberr=0x%x,",ibsta,iberr);
  143.    printf("\nibcnt=0x%x\n",ibcnt);
  144.  }
  145.  
  146.  
  147.  
  148. Example 1: 
  149.  
  150. (a)
  151.  
  152. OUT "IFC";       /*Interface Clear*/
  153.  
  154. (b)
  155.  
  156. OUT "REN";      /*Remote Enable*/
  157.  
  158. (c)
  159.  
  160. OUT "?_@'\0X14";  /*? = Unlisten (UNL), _ = Utalk (UNT),  @ = My Talk Address
  161.           of controller (MTA), ' = My Listen address of scope (MLA), 
  162.           0X14 = Device clear*/
  163.  
  164. (d)
  165.  
  166. OUT "?_@'";    /*UNL, UNT, MTA of controller, MLA of scope*/
  167. OUT ":ACQUIRE:TYPE NORMAL";
  168. ;              /*Now the device dependent configuration data*/
  169.  
  170. ;
  171. OUT ":TRIGGER:SOURCE CHANNEL1";
  172. OUT ":SRQ 1";    /*Enable SRQ on trigger, bit 1 of SRQ mask register*/
  173. OUT "?_";        /*UNL, UNT*/
  174.  
  175. (e)
  176.  
  177. OUT "?_\X18G ";     /*UNL, UNT, Serial Poll Enable  (SPE), Talk Address (TAD) 
  178.              of scope, MLA of controller*/
  179. IN &BUFFER;         /*Program puts Serial Poll Byte in a buffer*/
  180. OUT "\0X19";        /*Issue Serial Poll Disable (SPD)*/
  181.  
  182. (f)
  183.  
  184. OUT "?_@'";       /*UNL, UNT, MTA of controller, MLA of scope*/
  185. OUT "PRINT";      /*Tell scope to print*/
  186. OUT "?_@!G";      /*UNL, UNT, MTA of controller, MLA of printer/plotter, 
  187.            MTA of scope*/
  188. OUT "DATA";       /*Controller takes its own attention (ATN) line low to allow
  189.            scope to talk to printer/plotter*/
  190. WAIT "END";       /*Controller watches command lines for end or identify (EOI),
  191.            which means that the transfer is complete*/
  192.  
  193.