TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: antoniojdobarro en 13 de Febrero de 2011, 16:48:55
-
void retroceso (void) { /
output_high (avance_derecha);
output_high (avance_izquierda);
output_low (retroceso_derecha);
output_low (retroceso_izquierda);}
void avance (void) {
output_high (retroceso_derecha);
output_high (retroceso_izquierda);
output_low (avance_derecha);
output_low (avance_izquierda);
}
void rota_derecha (void) {
output_high (avance_derecha);
output_high (retroceso_izquierda);
output_low (avance_izquierda);
output_low (retroceso_derecha);
delay_ms(15);
output_high (avance_izquierda);
output_high (retroceso_derecha);
delay_ms(15);
output_low (avance_izquierda);
output_low (retroceso_derecha);
}
void main(void) {
int8 x;
x=0;
do{
switch(getchar()){
case 'q':
giro_izquierda();
break;
case 'w':
avance();
break;
case 'e':
giro_derecha();
break;
case 'z':
retrocede_izquierda();
break;
case 'x':
retroceso();
break;
case 'c':
retrocede_derecha();
break;
case 'a':
rota_izquierda();
break;
case 'd':
rota_derecha();
break;
case 'p':
output_high(led);
break;
case 'o':
output_low(led);
break;
case 's':
detencion();
break;
}
}
while (x<10);
}
El problema viene con las rutinas que tienen delay ya que si cambio de una a otra rápido se me queda el microchip bloqueado.
El pic está conectado al pc por COM.
Alguien tiene alguna idea de lo que puede pasar?
-
no entiendo a que te refieres con los problema de los delay... es la primera vez que escucho que un chip se bloque por eso jeje... :shock: explica un poco mas, yo no veo mucho problema en tu codigo, aunque yo en las subrutinas pondria pequeños delay en (us) entre una instruccion y otra (por costumbre nada mas)... :)
-
Yo emplearía un timer ya que si usas el puerto serie su interrupción te puede falsear el tiempo del delay, si estas en un delay y se va a la interrupción del puerto serie hasta que no termine ese codigo no terminara de hacer el delay
-
Bien, en las rutinas avance y retroceso puedo cambiarlas tan rápido y tantas veces como quiera avance-retroceso-avance-....
Pero en cuanto hago lo mismo con rota_derecha-rota_izquierda-rota_derecha pues se bloquea, es como si antes de que terminase la subrutina y la mando otra instrucción se quedase pillado.
-
Bien, en las rutinas avance y retroceso puedo cambiarlas tan rápido y tantas veces como quiera avance-retroceso-avance-....
Pero en cuanto hago lo mismo con rota_derecha-rota_izquierda-rota_derecha pues se bloquea, es como si antes de que terminase la subrutina y la mando otra instrucción
se quedase pillado.
Que electrónica usas? Puede ser que estés haciendo algún tipo de corto? Lo estas simulando con leds, o de verdad, ayudaría que enseñases algún esquema ya que hay un momento después del delay que pones a high el retroceso y el avance a la vez no se si eso te puede probocar un corto y que el micro se reinicie
-
(http://img266.imageshack.us/img266/8611/circuitol.jpg)
No se que ocurre con los delays, si los quito bien, de lo contrario si utilizo varias veces repetidamente esas órdenes se bloquea.
-
hay posibilidad de que pegues el codigo completo, o que subas el codigo con proteus para que lo podamos ver, y capaz que corregir de esa forma??
-
Sustituyo el RS232 por una consola, ya que el fallo sigue dándolo igual.
Es un cursor QWE--AD--ZXC (S- Detención).
El problema viene cuando pulso rápido diagonales ya que tienen delays QE o QC o ZC o ZE, se queda bloqueado mientras no termina alguna subrutina con delays.
-
porque en una misma sub rutina pones por ej:void rota_derecha (void) { //El tanque rota derecha
output_high (avance_derecha);
output_high (retroceso_izquierda);
output_low (avance_izquierda); (en estado bajo)
output_low (retroceso_derecha);
delay_ms(50);
output_high (avance_izquierda); (en estado alto)
output_high (retroceso_derecha);
delay_ms(50);
output_low (avance_izquierda); (y de nuevo en estado bajo)
output_low (retroceso_derecha);
}
es por algun inconveniente que hace el motor o que?, porque lo veo medio innecesario, para mi que dejaria solo como estado bajo, pero bueno si tiene algun porque y me lo podrias explicar te lo agradeceria =)
adjunto la modificacion que hice yo...
-
Bien, pasa primero que en este caso output_high se comporta como apagado debido a varias configuraciones que no vienen al caso.
La historia del low-high-low es que para que el tanque se desplace a la derecha al avanzar, realmente es como si la rueda derecha frenase-no frenase-frenase-no frenase, para no tener un todo uno. La rueda derecha es enciende-apaga-enciende y de ahí viene el problema con los delay, no lo entiendo muy bien, ya que si durante esa llamada a la subrutina el micro recibe otra orden, finiquito, se queda como esta y no reacciona.
-
los delay de cuanto tienen que ser especificamente????
-
En principio no lo se, los delay los pongo para no tener que girar todo o nada mientras avanzo.
Al principio cuando lo tenía directo con cable y pulsadores a las entradas perfecto.
Lo solucioné controlando cada rueda por separado y listo, sin delays, pero ahora me intriga eso de por que leches se queda clavado en una posición y no sale de su bucle.