# Problemas Utilizando mi Puerto Paralelo



## serch2708 (Feb 26, 2010)

Hola a todos ya se que hay muchos que estan haciendo esto mismo y que ya hay tutoriales para hacer esto pero yo tengo una duda en particular con mi programacion y me gustaria que me ayudaran. Este es mi proyecto y al correrlo te da opciones para ver que deseas hacer, de hecho si funciona bien, pero un problema es que cuando le das a una opcion te imprime 2 veces las opciones de nuevo, pondre imagenes para ser mas explicito 
Asi inicia mi programa:







Y asi se desarrolla mi programa:






Les agradeceria que me ayudaran a corregir mi programacion para que no se imprima 2 veces y tambien me gustaria que me dijeran si hay alguna manera para que no tenga que presionar Enter osea que solo con presionar la W o la D o la opcion que quiera y funciona, solo con presionar la tecla y sin presionar el Enter.
Esta es mi programacion les agradeceria mucho su ayuda y si quieren copiarlo para que lo usen :




```
#include <stdio.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
 int c='s';          
 char orden, Avanza = 'W', Retrocede = 'S', Derecha = 'D', Izquierda = 'A', Levanta_brazo = 'T', Baja_brazo = 'G', Abre_pinza = 'Y', Cierra_pinza = 'H', Limpiar = 'C';
 
 while (tolower(c)=='s')
 {
  printf("\nW = Avanza\n");
  printf("S = Retrocede\n");
  printf("D = Derecha\n");
  printf("A = Izquierda\n");
  printf("T = Levanta_brazo\n");
  printf("G = Baja_brazo\n");
  printf("Y = Abre_pinza\n");
  printf("H = Cierra_pinza\n");
  printf("C = Limpiar\n");
  printf("Elije la accion (Solo mayusculas) (W/S/D/A/T/G/Y/H/C): ");
  scanf("%c",&orden);
  
  if (orden==Avanza)
   outport(0x378, 0x1);
  else if (orden==Retrocede)
   outport(0x378, 0x8);
  else if (orden==Derecha)
   outport(0x378, 0x5);
  else if (orden==Izquierda)
   outport(0x378, 0x3);
  else if (orden==Levanta_brazo)
   outport(0x378, 0x10);
  else if (orden==Baja_brazo)
   outport(0x378, 0x20);
  else if (orden==Abre_pinza)
   outport(0x378, 0x40);
  else if (orden==Cierra_pinza)
   outport(0x378, 0x80);
  else if (orden==Limpiar)
   outport(0x378, 0x00);
 }
 getch();
 return 25;
}
```


----------



## elbrujo (Feb 26, 2010)

Primero, para que el menu quede arriba y salga una sola vez tenes que tenerlo en una estructura separada que solamente rebote alli cuando termine de ejecutar la orden anterior.

Segundo, no te deja seleccionar otra opcion mientras termine, claro.. estas en la misma estructura.. el flujo del programa dice eso.. si quisieras que saque el menu mientras hace la accion, deberias armar dos estructuras una dentro de otra. Tienes el return al final hasta que no llegue ahi y encima haga una pausa no rebota.. 

Imagina que tiene que funcionar como un flip flop. En un ciclo saca el menu cuando le das una opcion entra en el otro estado y el menu desaparece hasta que termina ese estado volviendo al anterior. Tambien puedes dejar siempre quieto el menu si lo quitas del while. En una palabra como armes la estructura es como fluye el programa..

Si quieres evitar el enter, le puedes poner la instruccion de final de linea por cada vez que hace get, concatenada.

Si sabes armar funciones el main queda mas limpio desde el momento que al tocar la tecla que corresponde va a la funcion la ejecuta y vuelve al bucle.

El tema de mayusculas y minusculas no queda bien que obligues que debe ser de tal modo y encima veo que si toca cualquier cosa, que hace? no saca ningun cartel que diga, pone bien el dedo!.. opcion incorrecta..

No se como es la electronica pero veo que la orden se mantiene en el tiempo.. es decir el puerto queda escribiendo habilitado esa instruccion hasta que toquen otra tecla!.. se quema todo!!.. deberias dar la orden esperar un lapso, en caso que no tengas control de proceso, y liberar el canal del puerto.. con eso todo lo que tengas concetado alli.

En el caso de cierra pinza, bueno ahi tenemos que ver hasta cuando cierra la pinza.. si corta la energia.. se cae lo que agarra?

Hay que elaborar mejor todas esas cosas.. haa limpia la pantalla cuando no quieres ver lo anterior!..


----------



## serch2708 (Feb 26, 2010)

Hola elbrujo te agradezco mucho tu ayuda pero yo apenas estoy empezando en esto y este diagrama lo logra muy duras penas y buscando por aqui y por alla asi que te agradeceria si me lo pudieses modificar y pasarmelo modificado, claro si tienes tiempo, y no se si tambien me puedas ayudar para eso de los tiempos es decir que al dar la accion esta dure un determinado momento


----------



## elbrujo (Feb 26, 2010)

Te recomiendo que leas y preguntes. No tiene sentido que lo resuelva ya que haria lo que a mi me parece y el proyecto es tuyo. Te tire varias puntas para que puedas seguir..

Con respecto al retardo de la accion de pinza si tenes un final de recorrido en la mecanica no se va a quemar pero si apaga el bit, para que sepas que arrancas con una verdad.. esta apagado..

Sino tiene final de carrera la mecanica pero tienes un swich que te devuelve que termino, eso lo puedes entrar al puerto para saber en que momento debe cambiar el bit.

Y sino mide el tiempo y le das un poco mas.. quedara haciendo fuerza por unos segundos y parara..


Programar no es cortar y pegar.. primero resuelve desde el analisis que quieres que haga y despues te sientas a escribir que haga eso..


----------



## tecnogirl (Mar 1, 2010)

serch2708: En breve... para solucionar el problema saca este grupo de lineas del while y ponlas antes del mismo:

printf("\nW = Avanza\n");
printf("S = Retrocede\n");
printf("D = Derecha\n");
printf("A = Izquierda\n");
printf("T = Levanta_brazo\n");
printf("G = Baja_brazo\n");
printf("Y = Abre_pinza\n");
printf("H = Cierra_pinza\n");
printf("C = Limpiar\n");
printf("Elije la accion (Solo mayusculas) (W/S/D/A/T/G/Y/H/C): ");

El resto dejalo tal cual. Hazlo y me cuentas. Saludos.


----------



## serch2708 (Mar 3, 2010)

Pues no tecnogirl al hacer lo que me dijiste y correrlo solo se imprime una vez las opciones pero al elegir una no sucede nada ni me da las opciones de nuevo. Gracias por tu ayuda y espero que me puedas dar mas.


----------



## antiworldx (Mar 3, 2010)

esa funcionsita que usas para hacer una pausa, getch(), no sirve solo para hacer pausa.
Bueno, esta funcion, te regresa el valor ascci de la tecla presionada... asi que hasta puedes manejar enter y backspace o flechas.
De tal forma, usas esto...
a = getch(); y listo
en a tienes el valor ascci extendido de la tecla presionada.
Aaaa verdad?

Y tu problema de doble menu, es un error de logica... no estas limpiando la variable despues de usarla, y a reseva de ver el resto del codigo, necesitas poner esto al final de las comprobaciones... como un c = 0;
  .
  .
  .
 else if (orden==Limpiar)
   outport(0x378, 0x00);
 c = 0;
 }

Necesito ver el codigo completo, ya que tu error esta entre el main y el valor que regresa tolower(), y asi saber donde debe de limpiar esa variable.
Pero intenta eso que te dije a ver que resultado, si no resulta, pon el codigo completo y sale... esta facil, es error comun de novatos.

Salu2!


----------



## tecnogirl (Mar 3, 2010)

Yo sospecho de la funcion scanf(), una de las mas dificiles de manejar bien, para mi. Reemplazala con esta:

orden = getche() ;

Si vuelve a fallar, te recomiendo que corras el programa en modo de "debug" para ver qué es lo que esta mal.

Saludos.


----------



## elbrujo (Mar 3, 2010)

Lo que esta mal es el flujo y las estructuras.. Si sacas la seleccion del menu fuera del while te anda una sola vez, y es logico. Debes hacer como dije antes dos estructuras donde una contenga a la otra. Cuando esta en una, no esta en la otra... Si espera el dato no esta accionado.. y si esta accionando no espera el dato.. son dos momentos..


----------



## serch2708 (Mar 3, 2010)

antiworldx dijo:


> esa funcionsita que usas para hacer una pausa, getch(), no sirve solo para hacer pausa.
> Bueno, esta funcion, te regresa el valor ascci de la tecla presionada... asi que hasta puedes manejar enter y backspace o flechas.
> De tal forma, usas esto...
> a = getch(); y listo
> ...



Si lo se soy un NOVATO  emm no te entendi bien a lo del a= getch(), pero si hice lo de poner c=0 al final de las comprobaciones pero no sucede nada solo me deja hacerlo una vez.

Y ahi esta el codigo completo del programa pero de todos modos lo pondre de nuevo:


#include <stdio.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
 int c='s';          
 char orden, Avanza = 'W', Retrocede = 'S', Derecha = 'D', Izquierda = 'A', Levanta_brazo = 'T', Baja_brazo = 'G', Abre_pinza = 'Y', Cierra_pinza = 'H', Limpiar = 'C';

 while (tolower(c)=='s')
 {
  printf("\nW = Avanza\n");
  printf("S = Retrocede\n");
  printf("D = Derecha\n");
  printf("A = Izquierda\n");
  printf("T = Levanta_brazo\n");
  printf("G = Baja_brazo\n");
  printf("Y = Abre_pinza\n");
  printf("H = Cierra_pinza\n");
  printf("C = Limpiar\n");
  printf("Elije la accion (Solo mayusculas) (W/S/D/A/T/G/Y/H/C): ");
  scanf("%c",&orden);

  if (orden==Avanza)
   outport(0x378, 0x1);
  else if (orden==Retrocede)
   outport(0x378, 0x8);
  else if (orden==Derecha)
   outport(0x378, 0x5);
  else if (orden==Izquierda)
   outport(0x378, 0x3);
  else if (orden==Levanta_brazo)
   outport(0x378, 0x10);
  else if (orden==Baja_brazo)
   outport(0x378, 0x20);
  else if (orden==Abre_pinza)
   outport(0x378, 0x40);
  else if (orden==Cierra_pinza)
   outport(0x378, 0x80);
  else if (orden==Limpiar)
   outport(0x378, 0x00);
  c=0;
 }
 getch();
 return 0;
}


Gracias por todo espero su ayuda 



tecnogirl dijo:


> Yo sospecho de la funcion scanf(), una de las mas dificiles de manejar bien, para mi. Reemplazala con esta:
> 
> orden = getche() ;
> 
> ...


 
No tecnogirl no me funciono pero muchas gracias espero tu ayuda


----------



## tecnogirl (Mar 3, 2010)

Que plataforma estas usando ?. No tiene un modo de funcionamiento  para depuracion (debug) ?. Eso te saca del apuro. Saludos.


----------



## antiworldx (Mar 3, 2010)

Muy bien, simplemente me confundi con la mentada funcion tolower(), pero ya investigue.

al parecer tu problema viene del mugroso scanf, que en lo personal, nunca me gusto, habiendo el hermoso y simple metodo cin<<.
Bueno, olvida lo de c=0, porque entonces si se saldra y solo lo ejecutara una vez. No se porque estas usando esa implementacion, pero asi dejalo por lo pronto.

te escribo tu codigo ya corregido. No lo he compilado, pero supongo que no debe marcar errores. Salu2!


```
#include <stdio.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
void main()
{
char orden;

while (orden!='S')
{
printf("\nW = Avanza\n");
printf("S = Retrocede\n");
printf("D = Derecha\n");
printf("A = Izquierda\n");
printf("T = Levanta_brazo\n");
printf("G = Baja_brazo\n");
printf("Y = Abre_pinza\n");
printf("H = Cierra_pinza\n");
printf("C = Limpiar\n");
printf("S = Salir\n");
printf("Elije la accion (Solo mayusculas) (W/S/D/A/T/G/Y/H/C/S): ");
orden = getch();

if (orden==A)
outport(0x378, 0x1);
else if (orden==R)
outport(0x378, 0x8);
else if (orden==D)
outport(0x378, 0x5);
else if (orden==I)
outport(0x378, 0x3);
else if (orden==L)
outport(0x378, 0x10);
else if (orden==B)
outport(0x378, 0x20);
else if (orden==A)
outport(0x378, 0x40);
else if (orden==C)
outport(0x378, 0x80);
else if (orden==L)
outport(0x378, 0x00);
}
}
```


----------



## serch2708 (Mar 4, 2010)

Pues no antiworldx emm si lo copio como me lo pones me tira problemas y no puedo utilizar el modo debug y estoy utilizando Turbo C++
Gracias por su ayuda y seguire esperando


----------



## elbrujo (Mar 4, 2010)

*Gracias por su ayuda y seguire esperando *

Esperando? habras querido decir buscando?


----------



## MVB (Mar 4, 2010)

No lei todo, pero ese problema va por el lado de limpiar el buffer.
Cuando utilizas scanf el solo lee unn caracter, entonces el salto de linea '\n' queda en el buffer, en la siguiente interacion el geth lee ese salto de linea y por eso te muestra el menu de nuevo.
Lo que debes hacer es poner otro  gecth() (creo que asi se llama) para que limpie el buffer


----------



## tecnogirl (Mar 4, 2010)

serch2708: Y la tercera es la vencida...

Adjunto mi version corregida de tu programa. Lo probe en la PC y me funciona sin problemas. Comprobe que tu version original si presenta el problema que relatas y ocurrio justo donde te dije, con la funcion scanf(), asi que la cambie, como te lo habia sugerido.


```
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
 int c = 'W';
 char orden, Avanza = 'W', Retrocede = 'S', Derecha = 'D' ;
 char Izquierda = 'A', Levanta_brazo = 'T', Baja_brazo = 'G';
 char Abre_pinza = 'Y', Cierra_pinza = 'H', Limpiar = 'C';
 while (c != 'X'){
 printf("\nW = Avanza\n");
 printf("S = Retrocede\n");
 printf("D = Derecha\n");
 printf("A = Izquierda\n");
 printf("T = Levanta_brazo\n");
 printf("G = Baja_brazo\n");
 printf("Y = Abre_pinza\n");
 printf("H = Cierra_pinza\n");
 printf("C = Limpiar\n");
 printf("X = Salir\n");  /* nueva opcion incluida */
 printf("Elije la accion (Solo mayusculas) (W/S/D/A/T/G/Y/H/C/X): ");
 orden = getche() ;
 if(orden == Avanza)  outport(0x378, 0x1);
 else if (orden == Retrocede) outport(0x378, 0x8);
 else if (orden == Derecha) outport(0x378, 0x5);
 else if (orden == Izquierda) outport(0x378, 0x3);
 else if (orden == Levanta_brazo) outport(0x378, 0x10);
 else if (orden == Baja_brazo) outport(0x378, 0x20);
 else if (orden == Abre_pinza) outport(0x378, 0x40);
 else if (orden == Cierra_pinza) outport(0x378, 0x80);
 else if (orden == Limpiar) outport(0x378, 0x00);
 c = orden ;
 }
 getch();
 return 25;
}
```
 
Saludos.


----------



## serch2708 (Mar 4, 2010)

De veras muchas gracias a todos por sus aportaciones gracias a ustedes logre esto, y si elbrujo mas bien me referia a buscar y muchas gracias tecnogirl me ayudaste demasiado ahora solo me queda agradecer y GRACIAS A TODOS!!!!


----------



## elbrujo (Mar 5, 2010)

Veremos como sigues con tu proyecto. Postea asi nos pones al tanto.


----------

