Basic Stamp Midi

Basic Stamp II MIDI input/output This program demonstrates how to get MIDI output using a Basic Stamp IIsx. The circuit connected to the Basic Stamp is shown below. The +5v power source for the circuit below comes from the DIP pin #21. The program uses I/O pin #8 (DIP pin #13) for the MIDI output, but you can change the program to use any output pin for MIDI out. The buffer op-amp does not seem to be necessary. The primary function used in this program is the serout function. The first parameter to serout is the output pin (0-15,16). The second parameter is the baude mode which is set to the value 2,500,000/31,250 - 20 = 60. Where 31,250 is the data bit rate of the MIDI serial protocol.
'{$STAMP BS2SX}
'' 
'' Programmer:     Craig Stuart Sapp 
'' Creation Date:  Sun 07-11-1999
'' Last Modified:  Tue 07-13-1999
'' Filename:       cout.bsx
'' Syntax:         Basic Stamp IIsx
''
'' Description:    This program sends out the MIDI note middle C
''                 once every second.  The note remains on for
''                 1/2 of a second, and then is turned off for
''                 1/2 of a second. 
''                 The MIDI note-on message is [$90, 60, 127], where
''                    $90 = 144 = MIDI note-on command
''                     60       = Middle C as a MIDI note number
''                    127       = attack velocity (very loud)
''                 The MIDI note-off message is [$90, 60, 0], where
''                    $90 = a MIDI note-on command unless velocity is 0
''                     60 = the MIDI key to turn off
''                      0 = attack velocity of zero (i.e., turn note off)
''		
''  The MIDI Output Circuit connected between 5v power and pin 8 is:
''     +5V to 220 Ohm to MIDI 2; MIDI 4 to 220 Ohm to a pin.
''

outpin     con     8    ' output pin on which to send MIDI data
baudmode   con    60    ' baude mode for serout: (2500000/31250)-20 msec
                        ' note that this value should be 12 for BS2.
                        ' Serial rate for MIDI is 31,250 data bits/sec.
outpause   con     0    ' pause time in units of 0.4 millisec between bytes
                        ' on the BS2, units are 1.0 millisec

' According to BASIC Stamp Programming Manual v1.9, page 208:
' "Unused pins that are not connected to circuitry should be set to output" 
' to minimize power consumption. 
' which is done here:
DIRS = %1111111111111111
' Don't set pins connected to input circuitry to be output, or you can
' damage the Basic Stamp.


top:
   serout outpin, baudmode, outpause, [$90, 60, 127]
   pause 493            
   serout outpin, baudmode, outpause, [$90, 60, 0]
   pause 492
   goto top:

' Note that the pause times of 493 and 492 are the values
' needed (found empirically) to get a total period of 
' 1000 milliseconds for the loop.  A three-byte MIDI message
' takes about 1 millisecond to send.
(http://devices.sapp.org/micro/stamp2sx/cout/cout.bsx)

----
result var word
tabval var word
tabval2 var word



input 1

noteon var word
   
	rcheck 
        	high 0
       		pause 1
       		RCTIME 0,1,result
        	if result < 223 and result > 0 then send
                
goto rcheck
    
send: lookdown result,<=[1,2,8,15,20,25,33,37,45,49,54,62,67,73,78,85,93,98,103,
110,117,122,129,135,140,145,152,158,164,170,175,182,188,194,200,205,213,220,225],tabval
      serout 7, $8000+12, [144,tabval+20,127]  'the resistor value won't be the same
      gosub send2				' every time, so you gotta
      serout 7, $8000+12, [128,tabval+20,127]	' pick the highest value that it shows up
      return					' as through trial n error to make your table
send2: high 0
      pause 1
      RCTIME 0,1,noteon
      if noteon > 225 then send3
      lookdown noteon,<=[1,2,8,15,20,25,33,37,45,49,54,62,67,73,78,85,93
,98,103,110,117,122,129,135,140,145,152,158,164,170,175,182,188,194,200,205,213,220,225],tabval2
    
      if tabval2=tabval then send
      return
send3:  
     noteon = result         ' this takes care of an unacceptable value from the POT 
     return		     ' measurement... 

' this code could be much more elegant, but it works... lemme know if you do something
' cool w/it.
' thanks to Jon Radenberg's basic stamp2 "knob box" for the inspiration for this project
' http://www.geopath.com/~jraden/knobs.html ----

'         		 MIDI CODE TX
' Programs to emit MIDI CODE from a BSII starting from the 
' reading of three pots and four buttons 
' DESCRIPTION: 
' It is a console to send out MIDI code with four 
' buttons for the emission of note_on code and three pots 
' for the emission of control-change code (Main Volume - Bread and 
' Expression) .A selection button 
' allows, by means of successive pulsations to select among those 
' analogical entrances with the pots and the digital inputs from the buttons in
' in two banks of four buttons.The midi code emission is always made in the one 
' channel 0 and the notes correspond the C3 (36) from now on. 
' The selection recycles among 5 steps: 1) four low buttons, 2) four high buttons. 
' 3) pot 1, 4) Joystick with two pots, 5) 3th Pot and joystick 
' Roberto Gomez [robby@abaconet.com.ar]
'
'
'HARDWARE:
'P0 Joystick vertical pot
'P1 Joystick Horizontal pot
'P2 3th Pot
'
'P4 Joystick Led
'P5 3th pot led
'P6 First four buttons led
'P7 Seconds four buttons led
'P8 Input button 1
'P9 Input button 2
'P10 Input button 3
'P11 Input button 4
'P12 Selection button
'P13 MIDI Output
'P14 LCD Clock          Only for debug 
'P15 LCD Data 

'VARIABLES:
Display	    data	0,1,2,4,8,12
Pot1		con   0
Pot2		con	  1
Pot3		con   2
LedPot1	    con   4   
LedJoy	    con	  5
LedBan1	    con	  6
LedBan2	    con	  7
Pul1		con	  8
Pul2		con	  9
Pul3		con	  10
Pul4		con	  11
Selec		con	  12		
Midiout	    con	  13
ClkLcd	    con	  14
DataLcd	    con	  15
Nota 		var	  byte
Not1		var	  byte
Not2		var	  byte
Seleccion	var	  nib		'Selector position
x		    var	  nib
y		    var   word
VarBut	    var   byte		'Button command var
TipoMens	var   byte		'Mensage type
Dato		var	  byte		
cuenta	    var	  word
ValPot	    var   byte(3)
Control	    var	  nib
Leds		var	  nib
Sel		    var	  bit
z		    var	  nib
c		    var   byte
boton		var   nib

'INICIALITATION:

DIRS=%1110000011110000

'The start is in the first four buttons bank 


Seleccion=0
VarBut=0					
Dato=$24					'First note

serout Midiout,12,[$FA]			'Send Start (FAH)

Main:		
	
loop:		
		Button Selec,0,255,0,VarBut,1,accion
		Seleccion = Seleccion + 1
		if Seleccion > 5 then otra
		read display+seleccion,c
		OutB = c				'Correspondig led on
		pause 1000
		goto loop
otra:		Seleccion = 0:goto loop		

Accion:	Pause 2000
		Seleccion = Seleccion - 1		'First Selection = 0
Loopot:	Branch Seleccion,[Accion1,Accion2,Pote1,Joy,JoyPot]		

Accion1:	
		x=8 
Loop1:	Button x,0,255,0,VarBut,1,boton1
		x=x+1
		if x>12 then accion1
		goto loop1
boton1:
		x=x-8
		
Branchon:	Branch x,[Notaon1,Notaon2,Notaon3,Notaon4,main]
		goto main						
Branchoff1:	Branch x,[Notaoff1,Notaoff2,Notaoff3,Notaoff4,main]
		goto main
Notaon1:
		Nota = $24
		gosub EnvPulon
		goto Levanta1
Notaoff1:   
		Nota =$24
		gosub EnvPulOff
		goto accion1
Notaon2:
		Nota = $25
		gosub EnvPulon
		goto Levanta1
Notaoff2:   
		Nota =$25
		gosub EnvPulOff
		goto accion1
Notaon3:
		Nota = $26
		gosub EnvPulon
		goto Levanta1
Notaoff3:   
		Nota =$26
		gosub EnvPulOff
		goto accion1
Notaon4:
		Nota = $27
		gosub EnvPulon
		goto Levanta1
Notaoff4:   
		Nota =$27
		gosub EnvPulOff
		goto accion1

Accion2:	
		x=8 
loop2:	Button x,0,255,0,VarBut,1,boton2
		x=x+1
		if x>12 then accion2
		goto loop2
Boton2:
		x=x-8
		Branch x,[Notaon5,Notaon6,Notaon7,Notaon8,main]
		goto main						
Branchoff2:	Branch x,[Notaoff5,Notaoff6,Notaoff7,Notaoff8,main]
		goto main

Notaon5:
		Nota = $28
		gosub EnvPulon
		goto Levanta2
Notaoff5:   
		Nota =$28
		gosub EnvPulOff
		goto accion2

Notaon6:
		Nota = $29
		gosub EnvPulon
		goto Levanta2
Notaoff6:   
		Nota =$29
		gosub EnvPulOff
		goto accion2

Notaon7:
		Nota = $2A
		gosub EnvPulon
		goto Levanta2
Notaoff7:   
		Nota =$2A
		gosub EnvPulOff
		goto accion2

Notaon8:
		Nota = $2B
		gosub EnvPulon
		goto Levanta2
Notaoff8:   
		Nota =$2B
		gosub EnvPulOff
		goto accion2

Pote1:	
								'3th Pot
        TipoMens = $B0			
		Control = 7				'Main Volumen
		x=2
		High Pot3
		Pause 1
		RCtime Pot3,1,cuenta
		If cuenta > 300 then bien		
		cuenta = 300
Bien:		ValPot(x) = cuenta - 300	
		If NOT ValPot(x)>127 then Sigue1
		ValPot(x)=127
sigue1:	gosub EnvPot
		goto Reci
Joy:	
							'Joystick Pot
		TipoMens = $B1			'Canal 2
		Control = 10			'Pan Controller
  		x=0
		High Pot1
		Pause 1
		RCtime Pot1,1,cuenta
		If cuenta > 300 then bien1		
		cuenta = 300
bien1:	ValPot(x) = cuenta - 300
		If NOT ValPot(x)>127 then Sigue2
		ValPot(x)=127
sigue2:	gosub EnvPot
		TipoMens = $B2			'Canal 3
		Control = 11			'Expression Controller
		x=1
		High Pot2
		Pause 1
		RCtime Pot2,1,cuenta
		If cuenta > 300 then bien2		
		cuenta = 300
bien2:	ValPot(x)=cuenta - 300
		If NOT ValPot(x)>127 then Sigue3
		ValPot(x)=127
sigue3:	gosub EnvPot
		goto Reci
JoyPot:	

		TipoMens = $B1
		Control = 10
		x=0
		High Pot1
		Pause 1
		RCtime Pot1,1,cuenta
		If cuenta > 300 then bien3		
		cuenta = 300
bien3:		ValPot(x) = cuenta - 300
		If NOT ValPot(x)>127 then Sigue4
		ValPot(x)=127
Sigue4:	gosub EnvPot
		TipoMens = $B2
		Control = 11	
		x=1
		High Pot2
		Pause 1
		RCtime Pot2,1,cuenta
		If cuenta > 300 then bien4		
		cuenta = 300
bien4:	ValPot(x) = cuenta - 300
		If NOT ValPot(x)>127 then Sigue5
		ValPot(x)=127
Sigue5:	gosub EnvPot
		TipoMens = $B0
		Control = 7
		x=2
		High Pot3
		Pause 1
		RCtime Pot3,1,cuenta 
		If cuenta > 300 then bien5		
		cuenta = 300
bien5:	ValPot(x) = cuenta - 300
		If NOT ValPot(x)>127 then Sigue6
		ValPot(x)=127
Sigue6:	gosub EnvPot

Reci:
		C=IN12
		
		If C=0 then main
	
		goto loopot		

EnvPulon:
		serout Midiout,12,[$93,Nota,64]
		'Debug  "NOTAON:",hex Nota,13
		Return
		
EnvPuloff:
		serout Midiout,12,[$83,Nota,64]
		'Debug "NOTAOFF:",hex Nota,13
		Return

EnvPot:
		serout Midiout,12,[TipoMens,Control,ValPot(x)]
		'Debug hex ?TipoMens ,? ValPot(x),13		
		Return

Levanta1:	
		z=x+8
NoLev1:	Button z,1,255,0,VarBut,0,NoLev1
		Branch x,[Notaoff1,Notaoff2,Notaoff3,Notaoff4,main]

Levanta2:	
		z=x+8
NoLev2:	Button z,1,255,0,VarBut,0,NoLev2
		Branch x,[Notaoff5,Notaoff6,Notaoff7,Notaoff8,main]
end
---- it was a laser-based interactive midi instrument I built for the burning man arts festival. I have a number of boards put together that do multiple switches into the midi output. (http://www.zenchemical.com/burningman/congruence) ---- MIDI output Very easy to wire up. Use the Stamp II "serout" command, with baud rate number of 12 (which corresponds to the MIDI rate of 31250 baud). You need to know something about the format of MIDI commands (look here and here). You'll be sending three or four bytes down the line in this sort of format:
SEROUT 15,12,0,[144,60,80]
The numbers in the square brackets are a MIDI note-on message 
      144 = "This is a note-on, on MIDI channel 1"
       60 = "Middle C"
       80 = "Medium loud" 
MIDI input Well, I did once establish that it is possible, but it is extremely unreliable. Wiring it up is a little more complicated too, as it involves an optoisolator chip and a few other components. The problem is that the Stamp, having no interrupt, will miss bytes unless you are there at the right moment to catch them with the SERIN command. Then you will have to write a MIDI parser to determine what the received bytes mean. (http://mrogalsky.web.wesleyan.edu/otherthings/voltage-midi/stampMIDI.html) ----
' BASIC Stamp II "MIDI LightHarp" 
' with 6 photocells, Nat. Semi. 1 of 8 multiplexer CD4051BCN, and
' Nat. Semi. ADC0831
' based on Parallax A/D application notes
' Matt Rogalsky April 1996


CS con 0        ' chip select is pin 0
ADCdata con 1   ' ADC data out is pin 1
CLK con 2       ' ADC clock is pin 2

MUXa	con 3	' MUX channel select lines
MUXb	con 4
MUXc	con 5

threshold var byte  ' threshold below which a photocell 
threshold = 100     ' will send a MIDI note-on message

AD0	var byte    ' to hold data shifted in from ADC
AD1	var byte    ' for each of 6 photocells
AD2	var byte
AD3	var byte
AD4	var byte
AD5	var byte

flag0	var byte	' flags to indicate if photocell was triggered
flag1	var byte
flag2	var byte
flag3	var byte
flag4	var byte
flag5	var byte

key0	var byte	' MIDI note numbers assigned to photocells
key1	var byte
key2	var byte
key3	var byte
key4	var byte
key5	var byte

key0 = 60		' 60 = middle C
key1 = 62		' 62 = D
key2 = 64		' 64 = E
key3 = 65		' 65 = F
key4 = 67		' 67 = G
key5 = 69		' 69 = A


high CS			' deselect ADC to start

loop:				' MAIN LOOP
 do0:
  gosub select0
  gosub sample0
 do1:
  gosub select1
  gosub sample1  
 do2:
  gosub select2
  gosub sample2  
 do3:
  gosub select3
  gosub sample3  
 do4:
  gosub select4
  gosub sample4  
 do5:
  gosub select5
  gosub sample5
 goto loop


' **** send MIDI note-ons on MIDI channel 1, using Stamp pin 15 ********
' note-on velocity is a constant of 80

note0:
  serout 15,12,0,[144,key0,80]		
  flag0 = 0
  goto do1

note1:
  serout 15,12,0,[144,key1,80]
  flag1 = 0
  goto do2

note2:
  serout 15,12,0,[144,key2,80]
  flag2 = 0
  goto do3

note3:
  serout 15,12,0,[144,key3,80]
  flag3 = 0
  goto do4

note4:
  serout 15,12,0,[144,key4,80]
  flag4 = 0
  goto do5

note5:
  serout 15,12,0,[144,key5,80]
  flag5 = 0
  goto do0


' ******* sample photocells 0-5, after selecting MUX channel *****

sample0:
  low CS                                       ' activate ADC
  shiftin ADCdata,CLK,msbpost,[AD0\9]          ' shift in data
  high CS                                      ' deactivate ADC
  if AD0 < threshold and flag0 = 1 then note0
  if AD0 > threshold then flag0high
  return

sample1:
  low CS		
  shiftin ADCdata,CLK,msbpost,[AD1\9]
  high CS
  if AD1 < threshold and flag1 = 1 then note1
  if AD1 > threshold then flag1high
  return

sample2:
  low CS		
  shiftin ADCdata,CLK,msbpost,[AD2\9]
  high CS
  if AD2 < threshold and flag2 = 1 then note2
  if AD2 > threshold then flag2high
  return

sample3:
  low CS		
  shiftin ADCdata,CLK,msbpost,[AD3\9]
  high CS				
  if AD3 < threshold and flag3 = 1 then note3
  if AD3 > threshold then flag3high
  return

sample4:
  low CS		
  shiftin ADCdata,CLK,msbpost,[AD4\9]
  high CS
  if AD4 < threshold and flag4 = 1 then note4
  if AD4 > threshold then flag4high
  return

sample5:
  low CS		
  shiftin ADCdata,CLK,msbpost,[AD5\9]
  high CS				
  if AD5 < threshold and flag5 = 1 then note5
  if AD5 > threshold then flag5high
  return


' ************* select channels 0-5 of MUX *************

select0:			
  low MUXa
  low MUXb
  low MUXc 
  return

select1:
  high MUXa
  low MUXb
  low MUXc
  return

select2:
  low MUXa
  high MUXb
  low MUXc
  return

select3:
  high MUXa
  high MUXb
  low MUXc
  return

select4:
  low MUXa
  low MUXb
  high MUXc
  return

select5:
  high MUXa
  low MUXb
  high MUXc
  return


' ****************** set flags high ******************

flag0high:
  flag0 = 1
  goto do1

flag1high:
  flag1 = 1
  goto do2

flag2high:
  flag2 = 1
  goto do3

flag3high:
  flag3 = 1
  goto do4

flag4high:
  flag4 = 1
  goto do5

flag5high:
  flag5 = 1
  goto do0

----

' "green lunchbox" general purpose voltage to midi controller
' based on Parallax A/D application notes
' Matt Rogalsky December 1997

' select 1 of 16 multiplexer (MC14067)
' and read data from ADC0831

' pins 0,1,2 are used to control the ADC chip
' pins 3,4,5,6 are used to select the MUX channel

' results are sent out (reduced to 7 bits from 8) as 
' controllers 20-35 on midi channel 1
' latest value is only sent if it is different from the
' previous one

CS con 0          ' chip select is pin 0
ADCdata con 1     ' ADC data out is pin 1
CLK con 2         ' ADC clock is pin 2

AD0  var byte     ' to hold data shifted in from ADC
AD1  var byte     ' for each of 16 channels
AD2  var byte
AD3  var byte
AD4  var byte
AD5  var byte
AD6  var byte	
AD7  var byte	
AD8  var byte
AD9  var byte
AD10 var byte
AD11 var byte
AD12 var byte	
AD13 var byte	
AD14 var byte
AD15 var byte

pAD0  var byte     ' to hold previous data shifted in from ADC
pAD1  var byte     ' for each of 16 channels
pAD2  var byte
pAD3  var byte
pAD4  var byte
pAD5  var byte
pAD6  var byte	
pAD7  var byte	
pAD8  var byte
pAD9  var byte
pAD10 var byte
pAD11 var byte
pAD12 var byte	
pAD13 var byte	
pAD14 var byte
pAD15 var byte

high CS           ' deselect ADC to start

loop:               ' MAIN LOOP
 do0:
  gosub select0
  gosub sample0
 do1:
  gosub select1
  gosub sample1  
 do2:
  gosub select2
  gosub sample2  
 do3:
  gosub select3
  gosub sample3  
 do4:
  gosub select4
  gosub sample4  
 do5:
  gosub select5
  gosub sample5
 do6:
  gosub select6
  gosub sample6
 do7:
  gosub select7
  gosub sample7
 do8:
  gosub select8
  gosub sample8
 do9:
  gosub select9
  gosub sample9
 do10:
  gosub select10
  gosub sample10
 do11:
  gosub select11
  gosub sample11
 do12:
  gosub select12
  gosub sample12
 do13:
  gosub select13
  gosub sample13
 do14:
  gosub select14
  gosub sample14
 do15:
  gosub select15
  gosub sample15
 goto loop


' *** send MIDI CC 20 on MIDI channels 1-16, using Stamp pin 15 ***

cc0:
  serout 15,12,0,[176,20,AD0]
   pAD0 = AD0		
  goto do1

cc1:
  serout 15,12,0,[176,21,AD1]
   pAD1 = AD1		
  goto do2

cc2:
  serout 15,12,0,[176,22,AD2]
   pAD2 = AD2		
  goto do3

cc3:
  serout 15,12,0,[176,23,AD3]
   pAD3 = AD3		
  goto do4

cc4:
  serout 15,12,0,[176,24,AD4]
   pAD4 = AD4		
  goto do5

cc5:
  serout 15,12,0,[176,25,AD5]
   pAD5 = AD5		
  goto do6

cc6:
  serout 15,12,0,[176,26,AD6]
   pAD6 = AD6		
  goto do7

cc7:
  serout 15,12,0,[176,27,AD7]
   pAD7 = AD7		
  goto do8

cc8:
  serout 15,12,0,[176,28,AD8]
   pAD8 = AD8		
  goto do9

cc9:
  serout 15,12,0,[176,29,AD9]
   pAD9 = AD9		
  goto do10

cc10:
  serout 15,12,0,[176,30,AD10]
   pAD10 = AD10		
  goto do11

cc11:
  serout 15,12,0,[176,31,AD11]
   pAD11 = AD11		
  goto do12

cc12:
  serout 15,12,0,[176,32,AD12]
   pAD12 = AD12		
  goto do13

cc13:
  serout 15,12,0,[176,33,AD13]
   pAD13 = AD13		
  goto do14

cc14:
  serout 15,12,0,[176,34,AD14]
   pAD14 = AD14		
  goto do15

cc15:
  serout 15,12,0,[176,35,AD15]
   pAD15 = AD15		
  goto do0


' ****** sample photocells 0-15, after selecting MUX channel *****

sample0:
  low CS                                    ' activate ADC
  shiftin ADCdata,CLK,msbpost,[AD0\9]       ' shift in data
  high CS                                   ' deactivate ADC
   AD0 = AD0 >> 1                           ' divide by 2
  if AD0 <> pAD0 then cc0                   ' if new value, send as cc
  return

sample1:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD1\9]		
  high CS									
   AD1 = AD1 >> 1							
  if AD1 <> pAD1 then cc1					
  return

sample2:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD2\9]		
  high CS									
   AD2 = AD2 >> 1							
  if AD2 <> pAD2 then cc2					
  return

sample3:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD3\9]		
  high CS									
   AD3 = AD3 >> 1							
  if AD3 <> pAD3 then cc3					
  return

sample4:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD4\9]		
  high CS									
   AD4 = AD4 >> 1							
  if AD4 <> pAD4 then cc4					
  return

sample5:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD5\9]		
  high CS									
   AD5 = AD5 >> 1							
  if AD5 <> pAD5 then cc5					
  return

sample6:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD6\9]		
  high CS									
   AD6 = AD6 >> 1							
  if AD6 <> pAD6 then cc6					
  return

sample7:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD7\9]		
  high CS									
   AD7 = AD7 >> 1							
  if AD7 <> pAD7 then cc7					
  return

sample8:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD8\9]		
  high CS									
   AD8 = AD8 >> 1							
  if AD8 <> pAD8 then cc8					
  return

sample9:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD9\9]		
  high CS									
   AD9 = AD9 >> 1							
  if AD9 <> pAD9 then cc9					
  return

sample10:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD10\9]		
  high CS									
   AD10 = AD10 >> 1							
  if AD10 <> pAD10 then cc10					
  return

sample11:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD11\9]		
  high CS									
   AD11 = AD11 >> 1							
  if AD11 <> pAD11 then cc11				
  return

sample12:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD12\9]		
  high CS									
   AD12 = AD12 >> 1							
  if AD12 <> pAD12 then cc12					
  return

sample13:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD13\9]		
  high CS									
   AD13 = AD13 >> 1						
  if AD13 <> pAD13 then cc13					
  return

sample14:
  low CS								
  shiftin ADCdata,CLK,msbpost,[AD14\9]		
  high CS									
   AD14 = AD14 >> 1							
  if AD14 <> pAD14 then cc14					
  return

sample15:
  low CS									
  shiftin ADCdata,CLK,msbpost,[AD15\9]	
  high CS						
   AD15 = AD15 >> 1				
  if AD15 <> pAD15 then cc15			
  return


' ********** select channels 0-15 of MUX ***********

select0:
  low 3
  low 4
  low 5
  low 6
  return

select1:
  high 3
  low 4
  low 5
  low 6
  return

select2:
  low 3
  high 4
  low 5
  low 6
  return

select3:
  high 3
  high 4
  low 5
  low 6
  return

select4:
  low 3
  low 4
  high 5
  low 6
  return

select5:
  high 3
  low 4
  high 5
  low 6
  return

select6:
  low 3
  high 4
  high 5
  low 6
  return

select7:
  high 3
  high 4
  high 5
  low 6
  return

select8:
  low 3
  low 4
  low 5
  high 6
  return

select9:
  high 3
  low 4
  low 5
  high 6
  return

select10:
  low 3
  high 4
  low 5
  high 6
  return

select11:
  high 3
  high 4
  low 5
  high 6
  return

select12:
  low 3
  low 4
  high 5
  high 6
  return

select13:
  high 3
  low 4
  high 5
  high 6
  return

select14:
  low 3
  high 4
  high 5
  high 6
  return

select15:
  high 3
  high 4
  high 5
  high 6
  return


View this page in: Espanol, Dutch, German, French, Italian, or Portuguese