Control de un motor de CC por medio de la Terminal

Cualquier cosa relacionado con la programación de Microcontroladores PIC en C utilizando el compilador CCS.

Control de un motor de CC por medio de la Terminal

Notapor biblioman » Sab Oct 10, 2009 5:32 pm

Hola a todos. Aquí tenéis un nuevo ejemplo, en este caso el control de un pequeño motor de CC a través de la terminal.
Espero cualquier mejora o sugerencia.

Archivo Control_Motor_CC.h
Código: Seleccionar todo
#include <16F84A.h>
#FUSES NOWDT, XT, NOPUT
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8)
#bit   RB1=0x06.1  // Identificadores de bits
#bit   RB2=0x06.2

//Prototipos de las funciones
void instrucciones(void);
void derecha(void);
void izquierda(void);
void parar(void);
void mensaje(void);


Archivo Control_Motor_CC.c
Código: Seleccionar todo
/*--------------------------------------------------------*\
|  Control de un motor de CC por medio de la Terminal     |
|  autor: biblioman                                       |
|  www.aquihayapuntes.com                                 |
\*--------------------------------------------------------*/

#include "Control_Motor_CC.h"

int marcha=0;//variables globales
char sentido;

void main()
{

char M;

set_tris_b( 0b11111001 );     // Se configura la puerta B
RB1 = 0; // Se inicializa los bits de salida
RB2 = 0;                     

//llamada a la función instrucciones();
instrucciones();

while (true)
{
M=getc();

switch (M) {

    case 'i':
      izquierda();
      sentido='i';
      break;
    case 'd':
      derecha();
      sentido='d';
      break;
    case 'p':
      parar();     
      break;
    default :
      mensaje();   
      break;
   }
}
 
}

//Definición de funciones

void instrucciones() //instrucciones para el control del Motor
{
  puts("========= Control de un Motor de CC ==========");
  puts("Pulsa 'i' para giro a la izquierda");
  puts("Pulsa 'd' para giro a la derecha");
  puts("Pulsa 'p' para parar el motor");
}

void izquierda ()
{
     if ((marcha==1) && (sentido=='d')){ //si motor está en marcha -->derecha paro y espero 3s
      parar();
      delay_ms(3000);
      RB1=0;
      RB2=1;
      marcha=1;
      }
   else{
      RB1=0;
      RB2=1;
      marcha=1;
      }
}

void derecha ()
{
  if ((marcha==1)&& (sentido=='i')){ //motor en marcha --> izquierda, paro y espero 3s
   parar();
   delay_ms(3000);
   RB1=1;
   RB2=0;
   marcha=1;
   }
   else{
   RB1=1;
   RB2=0;
   marcha=1;
   
   }
}

void parar ()
{
  RB1=0;
  RB2=0;
  marcha=0;
}

void mensaje ()
{
   puts("Prueba de nuevo");
}


Un saludo
EL DNS lo tenéis aquí:
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Re: Control de un motor de CC por medio de la Terminal

Notapor QuijotescoXp » Dom Oct 11, 2009 12:21 am

Pues para no perder la costumbre y si a biblioman no le importa, anexo una revisión del código ya hecho, de la manera que uno lo haría.

Esta revisión no aporta nada que ya no esté hecho por el autor (biblioman), simplemente me ha parecido oportuno intentar abstraerse un poquito más en el manejo de funciones o mejor dicho de procedimientos (como es en este caso).

He eliminado el archivo de cabecera, ya que no tiene sentido si no se van a exportar los procedimientos.

El proyecto compila, pero no me ha dado tiempo a simularlo. A sí que todas las críticas constructivas serán bien recibidas.

Solamente he de decir que gracias a este foro, estoy aprendiendo muchas cosas que un informático normalmente no aprende, como por ejemplo el uso de un driver como el L298 (que no sabía ni que existía).

Espero que todos nos animemos y sigamos para adelante con este site.

Saludos.

Código: Seleccionar todo
#include <16F84A.h>

#FUSES NOWDT, XT, NOPUT

#use delay( clock = 4000000 )
#use rs232( baud = 9600, parity = N, xmit = PIN_A0, rcv = PIN_A1, bits = 8 )

#bit RB1=0x06.1  // Identificadores de bits
#bit RB2=0x06.2

/* DECLARACIÓN DE PROTOTIPOS *************************************************/

void instrucciones( void );
void setupDriver( short RB1Value, short RB2Value, char directionValue );
void setupPinOutRBx( short RB1Value, short RB2Value, BOOLEAN estaEnMarchaValue );

/* VARIABLES LOCALES *********************************************************/

static BOOLEAN estaEnMarcha;
static char    sentido;

/* MAIN PROGRAM **************************************************************/

void main()

   /* Setup I/O */
   set_tris_b( 0b11111001 ); // Se configura la puerta B
   RB1 = 0;                  // Se inicializa los bits de salida
   RB2 = 0;

   /* Setup values */
   estaEnMarcha = FALSE;
   
   /* Instrucciones para el control del Motor */
   instrucciones();

   while( TRUE )
   {
      switch( getc() )
      {
      case 'i':         
         setupDriver( 0, 1, 'i' );         
         break;
      case 'd':
         setupDriver( 1, 0, 'd' );         
         break;
      case 'p':
         setupDriver( 0, 0, 'p' );
         break;
      default :
         puts("Prueba de nuevo");
         break;
      }
   }
}

/* FUNCIONES PRIVADAS ********************************************************/

void instrucciones( void )
{
   /* Instrucciones para el control del Motor */
    puts("========= Control de un Motor de CC ==========");
    puts("Pulsa 'i' para giro a la izquierda");
    puts("Pulsa 'd' para giro a la derecha");
    puts("Pulsa 'p' para parar el motor");
}

void setupDriver( short RB1Value, short RB2Value, char directionValue )
{
   sentido = directionValue;

   if( 'p' == directionValue )
   {
      /* Se para el motor */
      setupPinOutRBx( 0, 0, FALSE );
   }
   else
   {
      if( estaEnMarcha && ( sentido != directionValue ) )
      {
         /* Si motor en marcha y sentido distinto*/
         setupPinOutRBx( 0, 0, FALSE );
       
         /* Espera de 3 segundos */
         delay_ms( 3000 );

         /* Se reanuda el giro según petición */
         setupPinOutRBx( RB1Value, RB2Value, TRUE );
      }
      else
      {
         /* Setup del giro según petición */
         setupPinOutRBx( RB1Value, RB2Value, TRUE );       
      }
   }
}

void setupPinOutRBx( short RB1Value, short RB2Value, BOOLEAN estaEnMarchaValue )
{
   RB1          = RB1Value;
   RB2          = RB2Value;   
   estaEnMarcha = estaEnMarchaValue;
}   
Última edición por QuijotescoXp el Dom Oct 11, 2009 9:42 pm, editado 1 vez en total
Existen 10 tipos de personas. Los que saben binario y los que no.
Avatar de Usuario
QuijotescoXp
 
Mensajes: 33
Registrado: Sab Sep 19, 2009 10:46 pm

Re: Control de un motor de CC por medio de la Terminal

Notapor biblioman » Dom Oct 11, 2009 8:49 pm

QuijotescoXp escribió:Pues para no perder la costumbre y si a biblioman no le importa, anexo una revisión del código ya hecho, de la manera que uno lo haría.

Por supuesto que no me importa, de hecho el código fuente lo pongo en el foro para que la gente se anime a comentar los ejemplos y a realizar sus propias versiones.
QuijotescoXp escribió:Esta revisión no aporta nada que ya no esté hecho por el autor (biblioman)

Cualquier código puede aportar alguna cosa nueva, incluso el que tiene errores (y no lo digo por el tuyo), no hay mejor manera de aprender que buscar las causas de por qué no funciona un programa.
QuijotescoXp escribió:El proyecto compila, pero no me ha dado tiempo a simularlo. A sí que todas las críticas constructivas serán bien recibidas.

He probado tú ejemplo, efectivamente compila sin problemas, pero al simularlo el motor no gira, he visto una cosa que puede ser la causa del problema:

/* Setup del giro según petición */
setupPinOutRBx( RB1Value, RB1Value, TRUE );

A la función de arriba le estás pasando como parámetros la misma variable RB1Value. ¿No debería ser?

setupPinOutRBx( RB1Value, RB2Value, TRUE );

De todas formas no he tenido tampoco mucho tiempo para depurarlo. Mira a ver si es eso.

En general me ha gustado tú versión, sorprendente la rapidez que has tenido en crear una nueva versión y ponerla a disposición de todos.

Un saludo
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Re: Control de un motor de CC por medio de la Terminal

Notapor QuijotescoXp » Dom Oct 11, 2009 9:47 pm

A la función de arriba le estás pasando como parámetros la misma variable RB1Value. ¿No debería ser?

setupPinOutRBx( RB1Value, RB2Value, TRUE );


Efectivamente ese es el problema, si le pasamos ambos valores iguales el motor no gira. Gracias por la correción. Son las malas pasadas del uso y abuso del copy/paste.

He editado el código de origen para no crear mas confusión.

Espero que ahora si que funcione.

Nuevamente gracias y quedo ansioso a la espera de un nuevo ejemplo / recurso.
Existen 10 tipos de personas. Los que saben binario y los que no.
Avatar de Usuario
QuijotescoXp
 
Mensajes: 33
Registrado: Sab Sep 19, 2009 10:46 pm

Re: Control de un motor de CC por medio de la Terminal

Notapor witronico » Sab Jul 31, 2010 8:35 pm

Aca pongo mi version del "CONTROL DE MOTOR DE CC", este codigo realiza exactamente lo mismo que biblioman, pero de forma mas reducida.

#include <16F84A.h>
#FUSES NOWDT, XT, NOPUT
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8)

void main()
{
char op;

puts("***CONTROL DE UN MOTOR DE CC ***\r");
puts("Izquierda (i)\r");
puts("derecha (d)\r");
puts("parar (p)\r");

while(true){
op=getch(); printf("%c",op);

switch(op)
{
case 'i':
output_low(pin_b1); output_high(pin_b2); break;
case 'd':
output_high(pin_b1); output_low(pin_b2); break;
case 'p':
output_low(pin_b1); output_low(pin_b2); break;
default:
puts("\r Comando no valido"); break;
}

}}
witronico
 
Mensajes: 3
Registrado: Vie Jul 30, 2010 3:57 am


Volver a Programación PIC en C con CCS

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron