| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
muyo_85
Registrado: 15 Jul 2007 Mensajes: 10 Ubicación: Argentina
| Publicado: 17/11/2007 7:19 am | | | Título: puerto paralelo |
| buenas!! tengo una consulta estoy haciendo en c un control para un autito por medio de unos motores comunes de c.c. la parte de los movimientos(adelante, atras, izquierda, derecha) ya logre q funcione a traves de una interfaz y mandando bits al 0x378, pero me piden que le agregue un sensor de proximidad eso tambien lo tengo hecho pero ahora viene mi gran problema yo a la salida del sensor cuando se activa tengo 5v que deseo llevar a la direccion 0x379, 0x40; que seria el pin 10 del db 25 el tema es que no se me ocurre como leer ese dato por borland c++.
bueno cualquier ayuda sera agredecida.
saludos |
| | Volver arriba | |  | scMaverick
Registrado: 11 Oct 2005 Mensajes: 314 Ubicación: Costa Rica
| Publicado: 20/11/2007 1:00 pm | | | Título: |
| Bueno pues si ya tienes la interfaz montada en C++ supongo que estas usando la funcion outport(Nump_puerto,dato), pues para leer no hay nada mas que usar inport(Num_puerto) y te devuelve un byte de la misma forma que le mandas al outport. Si aun no habias hecho nada en C con estos comandos pues entonces buscate un poco en internet, la bronca es que esto solo funciona en windows98, si quiere 2000 xp entonces tendras que usar alguna API que ya ande por ahi. Busca en google! _________________ MaVeRiCk para SERCAS Industry y Screaming Minds http://www.sercasindustry.tk |
| | Volver arriba | |  | muyo_85
Registrado: 15 Jul 2007 Mensajes: 10 Ubicación: Argentina
| Publicado: 20/11/2007 2:12 pm | | | Título: gracias |
| si las funciones las conozcos y las estoy usando pero no logro q c me de bola cuando mando un bit en 1 aca te dejo el programa para q lo veas y si me podes dar una mano te agradecria muchisimo.
#include<stdio.h> #include<conio.h> #include<dos.h> #include<ctype.h>
#define IRQ1 0x9 #define irq7 0x0f #define FORWARD 0x01 #define BACKBARD 0x07 #define LEFT 0x05 #define RIGHT 0x03 #define STOP 0x00
void interrupt far teclado(void); void InterrupInit(void); void InterruptEnd(void); void InterrupInit1(void); void InterruptEnd1(void); void adelante(void); void atras(void); void izquierda(void); void derecha(void); void parar(void); void puerto(void); char menu (void); void control(void); void botones (void);
void (interrupt far *OldHandler)(void); void (interrupt far *OldHandler1)(void);
char i,puertop=0,inicio,flag=0,teclaon=1,f='w',b='s',l='a',r='d',p='x'; int port;
int main(void) {char c;
FILE *fp; fp=fopen("c:\\inicio.txt","r"); while ((c=fgetc(fp))!=EOF) printf("%c",c); while(!kbhit()) { } fclose(fp);
puerto(); while(1) { inicio=menu(); if(inicio==1) botones(); if(inicio==2) control(); if(inicio==3) exit(0); } }
char menu (void) { char opcion=0;
while(opcion<1 || opcion>3) { clrscr(); printf("1)Configurar Teclado"); printf("\n2)Operar puerto paralelo"); printf("\n3)Salir"); printf("\nElija opcion:"); scanf("%d",&opcion); } return opcion; }
void botones (void) { f=0; b=0; l=0; r=0; p=0; while(f<'a'|| f>'z') { clrscr(); printf("Ingrese tecla para avanzar:"); f=getchar(); } while((b<'a'|| b>'z') || b==f) { clrscr(); printf("Ingrese tecla para retorceder:"); b=getchar(); } while((l<'a'|| l>'z') || l==f || l==b) { clrscr(); printf("Ingrese tecla para girar a la izquierda:"); l=getchar(); } while((r<'a'|| r>'z') || r==f || r==b || r==l) { clrscr(); printf("Ingrese tecla para girar a la derecha:"); r=getchar(); } while((p<'a'|| p>'z') || p==f || p==b || p==l || p==r) { clrscr(); printf("Ingrese tecla para parar:"); p=getchar(); } return; }
void control(void) { InterrupInit(); InterrupInit1(); while(flag==0) { if (puerto==1) printf("Esta por chocar"); if(teclaon==1) { if(puertop==1) printf("Esta por chocar") i=getch(); if(i==f) adelante(); if(i==b) atras(); if(i==l) izquierda(); if(i==r) derecha(); if(i==p) parar(); i=toupper(i); if(i=='Q') { clrscr(); printf("CHAU"); InterruptEnd(); InterruptEnd1(); flag=1; outportb(0x378,0x00); } teclaon=0; }
}return ; }
void InterrupInit(void) {
disable(); OldHandler = getvect(irq1); setvect(irq1,teclado); enable(); }
void InterrupInit1(void) {
disable(); OldHandler = getvect(irq7); setvect(irq7,intpuerto); enable(); }
void InterruptEnd(void) { disable(); setvect(irq1,OldHandler); enable();
}
void InterruptEnd1(void) { disable(); setvect(irq7,OldHandler); enable(); }
void interrupt far teclado(void) { teclaon=1; OldHandler(); outportb(0x20,0x20); }
void interrupt far intpuerto(void) { puertop=1; OldHandler1(); outportb(0x20,0x20); }
void puerto(void) { clrscr(); printf("Elija direccion del puerto paralelo\n(Ingresar datos como hexadecimal):"); scanf("%x",&port); printf("%x",port); return; } void adelante(void) { printf("\nadelante"); outportb(port,FORWARD); } void atras(void) { printf("\natras"); outportb(port,BACKBARD); } void izquierda(void) { printf("\nizquierda"); outportb(port,LEFT); } void derecha(void) { printf("\nderecha"); outportb(port,RIGHT); } void parar(void) { printf("\nparar"); outportb(port,STOP); }
Control de Coche por Puerto Paralelo
En este programa se utilizan los conceptos de interrupciones junto con los de archivos para complementarse en una tarea entretenida como es manejar un objeto por uno de los puertos mas utilizados de los programaores: el puerto paralelo.
El software se trato de simplificar al maximo, para permitir la deteccion sencilla y prematura de errores que pudieran surgir.
El programa consiste con la inicializacion del puerto. Luego se desplegara un menu que le permitira setear la teclas de control, el acceso al puerto y la salida del programa.
Por omision: Adelante: w Atras: s Izquierda: a Derecha: d Parar: x
bueno cualquier ayuda sera bienvenida. por cierto el programa lo corre en xp con un programa llamado userport saludos |
| | Volver arriba | |  | | scMaverick
Registrado: 11 Oct 2005 Mensajes: 314 Ubicación: Costa Rica
| Publicado: 20/11/2007 2:53 pm | | | Título: |
| OK, hay una parte en la descripcion de la tarea que dice: El software se trato de simplificar al maximo, para permitir la deteccion sencilla y prematura de errores que pudieran surgir. Lo cual no estas cumpliendo, el codigo esta super largo y enredado, tienes demasiadas mini funciones y todas las variables son globales (lo cual no es bueno). Estas usando muchas cuestiones de interrupciones que al final no entiendo para que las usas, no se como funcionara el auto pero me parece que estan enviando a cada rato un 0x20 al puerto y cuando se presiona un tecla se envia el valor al puerto para que gire o algo, pero no entiendo porq si al final este mismo codigo sera sobreescrito por el 0x20. Peor bueno, si ya lograste girarlo esta bien. Ahora, creo que el problema lo tienes al tratar de saber si el coche va a chocar o no, pues lo que veo es que no has puesto por ningun lado el codigo para leer del puerto, recuerda que el pp tiene 8 bits de salida y 5 de entrada en modo unidireccional, para leer los bits de entrada tienes que leer en la direccion BASE+2, o algo asi como 0x378+2. Leer esto te da tambien un byte pero los unicos bits que importan son los 5 mas bajos. Mirate esto solo por si acaso: http://www.modelo.edu.mx/univ/virtech/circuito/paralelo.htm
Antes de continuar te recomendaria que simplificaras ese codigo lo mas posible, que uses variables locales donde lo amerite y reduzcas la cantidad de funciones, pues hay muchas repetidas que podrian ser una sola.
Dime que piensas, nos vemos mañana! _________________ MaVeRiCk para SERCAS Industry y Screaming Minds http://www.sercasindustry.tk |
| | Volver arriba | |  | muyo_85
Registrado: 15 Jul 2007 Mensajes: 10 Ubicación: Argentina
| Publicado: 22/11/2007 5:24 pm | | | Título: gracias |
| buenas, si creo que tenes razón en que el codigo esta un poco enredado, pasa que lo fui haciendo como se me venia a la mente y con muy pocas modificaciones al probar la interfaz me funciono no lo toque, pero te voy a hacer caso trtando de simplificarlo un poco y leyendo lo que me pasate. cualquier novedad te aviso. muchas gracias por el aporte. saludos... |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |