'*********************************************************************** '* * '* SERVOMOTOR TRIPLE * '* * '*********************************************************************** ' Este programa demuestra como comandar tres servomotores, utilizando ' la Interfaz para el Puerto Paralelo + el Conversor A/D de 3 canales '********************** IMPORTANTE ************************* ' El conversor se utiliza con una resolucion de 5 bits ' por lo tanto los jumpers J1, J2 y J3 deben estar abiertos '************************************************************ 'INICIALIZACION DE VARIABLES haciaport = 0 DIM conversion(3) DIM liberomotor(3) DIM frenomotor(3) DIM giroderecha(3) DIM giroizquierda(3) liberomotor(1) = 60 '111100 en binario liberomotor(2) = 51 '110011 en binario liberomotor(3) = 15 '001111 en binario frenomotor(1) = 3 '000011 en binario frenomotor(2) = 12 '001100 en binario frenomotor(3) = 48 '110000 en binario giroderecha(1) = 2 '000010 en binario giroderecha(2) = 8 '001000 en binario giroderecha(3) = 32 '100000 en binario giroizquierda(1) = 1 '000001 en binario giroizquierda(2) = 4 '000100 en binario giroizquierda(3) = 16 '010000 en binario DIM prendebit(7) DIM apagabit(7) prendebit(0) = 1 '00000001 en binario prendebit(1) = 2 '00000010 en binario prendebit(2) = 4 '00000100 en binario prendebit(3) = 8 '00001000 en binario prendebit(4) = 16 '00010000 en binario prendebit(5) = 32 '00100000 en binario prendebit(6) = 64 '01000000 en binario prendebit(7) = 128 '10000000 en binario apagabit(0) = 254 '11111110 en binario apagabit(1) = 253 '11111101 en binario apagabit(2) = 251 '11111011 en binario apagabit(3) = 247 '11110111 en binario apagabit(4) = 239 '11101111 en binario apagabit(5) = 223 '11011111 en binario apagabit(6) = 191 '10111111 en binario apagabit(7) = 127 '01111111 en binario ' INICIO CUERPO PRINCIPAL DEL PROGRAMA '** Selecciono el port a ser usado (LPT1 o LPT2) ** port: CLS PRINT "Ingrese el port a usar" PRINT PRINT "1= Lpt1 (0x378)" PRINT "2= Lpt2 (0x278)" PRINT "9= salir" INPUT I SELECT CASE I CASE 1 entrada = 889 salida = 888 GOTO inicio CASE 2 entrada = 633 salida = 632 GOTO inicio CASE 9 END CASE ELSE GOTO port END SELECT inicio: OUT salida, 0 'Inicializo ports de salida GOSUB sendclock 'Envio el clock mediant el pin TTL7 OUT salida, 0 'dejo todo en cero CLS PRINT "Indique el motor que desea mover (1, 2, 3 o 9 para salir)"; PRINT PRINT PRINT "Presione 9 para salir del programa" PRINT PRINT INPUT motor IF motor = 9 THEN GOTO salida IF motor < 1 OR motor > 3 THEN GOTO inicio CLS PRINT "Ingrese el valor deseado (0 a 31)"; PRINT PRINT INPUT valor IF motor < 0 OR motor > 31 THEN GOTO inicio ' ******************************************************* ' Inicio conversion para averiguar la ubicaci˘n actual ' ******************************************************* otraconversion: ' comienza nueva conversion conversion(1) = 0 conversion(2) = 0 conversion(3) = 0 '****************************************************** '* Modificar este valor cuando se desee trabajar * '* con menos bits de resolucion. * '* * '* El valor inicial de bitactual debe ser: * '* cantidad de bits - 1 * '* * '* Por ejemplo: si deseamos tener una resolucion * '* de 6 bits, entonces este valor debe ser igual a 5 * '* * '****************************************************** bitactual = 4 'configurado para 5 bits de resolucion '****************************************************** '****************************************************** otrobit: '** enciendo el bit a ser testeado ** conversion(1) = conversion(1) OR prendebit(bitactual) conversion(2) = conversion(2) OR prendebit(bitactual) conversion(3) = conversion(3) OR prendebit(bitactual) '** Inicio conversion del primer canal ** OUT salida, conversion(1) 'coloco CONVERSION(1) a la salida del 'puerto TTL de la interfaz FOR z = 1 TO 100 ' retrazo para estabilizar se¤ales NEXT z comparador = INP(entrada) 'leo la salida del comprarador leebit = comparador AND 8 'si el bit 3 del port de entrada 'es igual a 1, entonces 'leebit sera igual a 8 'de lo contrario leebit sera igual a 0 ' si la salida del comparador es 1 entonces no me pase, por lo que ' dejo el bit encendido, de lo contrario lo apago IF leebit = 0 THEN conversion(1) = conversion(1) AND apagabit(bitactual) END IF '** Inicio conversion del segundo canal ** OUT salida, conversion(2) 'coloco CONVERSION(2) a la salida del 'puerto TTL de la interfaz FOR z = 1 TO 100 ' retrazo para estabilizar se¤ales NEXT z comparador = INP(entrada) 'leo la salida del comprarador leebit = comparador AND 16 'si el bit 4 del port de entrada 'es igual a 1, entonces 'leebit sera igual a 16 'de lo contrario leebit sera igual a 0 ' si la salida del comparador es 1 entonces no me pase, por lo que ' dejo el bit encendido, de lo contrario lo apago IF leebit = 0 THEN conversion(2) = conversion(2) AND apagabit(bitactual) END IF '** Inicio conversion del tercer canal ** OUT salida, conversion(3) 'coloco CONVERSION(3) a la salida del 'puerto TTL de la interfaz FOR z = 1 TO 100 ' retrazo para estabilizar se¤ales NEXT z comparador = INP(entrada) 'leo la salida del comprarador leebit = comparador AND 32 'si el bit 5 del port de entrada 'es igual a 1, entonces 'leebit sera igual a 32 'de lo contrario leebit sera igual a 0 ' si la salida del comparador es 1 entonces no me pase, por lo que ' dejo el bit encendido, de lo contrario lo apago IF leebit = 0 THEN conversion(3) = conversion(3) AND apagabit(bitactual) END IF bitactual = bitactual - 1 'decremento puntero para afectar 'otro bit IF bitactual = -1 THEN GOTO finconversion 'si ya compare todos los bits 'voy a imprimirlos en pantalla GOTO otrobit 'sino continuo la conversion '******************************************************************* ' Una vez terminada la conversio A/D, checkeo si debo o no ' mover los motores y en que direccion '******************************************************************* finconversion: IF conversion(motor) < valor THEN haciaport = giroizquierda(motor) ELSEIF conversion(motor) > valor THEN haciaport = giroderecha(motor) ELSE haciaport = frenomotor(motor) END IF OUT salida, haciaport 'fijo valor en port de salida GOSUB sendclock 'llamo rutina para enviar clock ' Si haciaport=frenomotor entonces es por que ya se llego al valor deseado ' Sino debo seguir checkeando el valor IF haciaport = frenomotor(motor) THEN CLS LOCATE 8, 25 PRINT "El valor solicitado fue "; valor LOCATE 10, 25 PRINT "El motor est  posicionado en "; conversion(motor) LOCATE 20, 1 PRINT "Presione cualquier tecla para continuar" loop1: IF INKEY$ = "" THEN GOTO loop1 GOTO inicio 'comienzo otra vez ELSE GOTO otraconversion 'sino sigo comparando END IF '******************************************************************* ' Rutina para enviar un pulso de clock por el pin TTL7 ' Este pulso fija la salida del 74HC374 usado para ' activar los motores '******************************************************************** sendclock: FOR z = 1 TO 1000 ' retrazo para estabilizar se¤ales NEXT z enviaclock = haciaport AND 127 ' pongo a cero el bit 7 OUT salida, enviaclock FOR z = 1 TO 1000 ' retrazo para estabilizar se¤ales NEXT z enviaclock = haciaport OR 128 ' pongo a uno el bit 7 OUT salida, enviaclock FOR z = 1 TO 1000 ' retrazo para estabilizar se¤ales NEXT z enviaclock = haciaport AND 127 ' pongo a cero el bit 7 OUT salida, enviaclock RETURN '******************* Sale del Programa *********************** salida: OUT salida, 0 ' reseteo ports de salida FOR z = 1 TO 100 ' retrazo para estabilizar se¤ales NEXT z OUT salida, 128 FOR z = 1 TO 100 ' retrazo para estabilizar se¤ales NEXT z OUT salida, 0 'dejo en cero las salidas CLS END 'finalizo el programa