Llave electrónica con PIC

Hola colegas, acabo de terminar un proyecto que se llama "llave electrónica", para esto e utilizado el PIC 16f877, un LCD LM016 16x2, 15 pulsadores como teclado matricial.
Explicación:
-->An iniciar el programa te pide que digites A(administrador) ó B(Ingreso), necesariamente se tiene que entrar por primera vez al menu del administrador que su clave por defecto es "123" una vez dentro puedes cambiar las claves de cualqueira de los dos.
-->Cuando ayas colocado la clave del usuario recien podras ingresar.
-->Cada vez que digites mal la clave de acceso no te permitira el ingreso o mejor dicho no se acitvará la señal por el PIN RA0, cada ves que presiones una tecla se activará un pequeño pitido.
-->cuando no se utilice el sistema se apaga asta apretar cualquier tecla.
--> El circuito es el se encuentra en adjuntos:


--> Ahora muchos se preguntaran el programa?, lo hice el el lenguaje CCS, para controlar el teclado 4x4, tuve que hacerle unas modificaciones que tambien se lo publicaré aca abajo:

Código:
// Funciones para la gestión del teclado de la Trainer PLUS.

// char kbd_getc( )	Devuelve el código ASCII de la tecla pulsada.
//			Si no se pulsó ninguna, devuelve 0.


// Conexiones del teclado.
/*
            RB0 RB1 RB2 RB3
             ^   ^   ^   ^
             |   |   |   |
           |---|---|---|---|
  RB4 ---> | 1 | 2 | 3 | F |
           |---|---|---|---|
  RB5 ---> | 4 | 5 | 6 | E |
           |---|---|---|---|
  RB6 ---> | 7 | 8 | 9 | D |
           |---|---|---|---|
  RB7 ---> | A | 0 | B | C |
           |---|---|---|---|
*/

// Caracteres ASCII asociados a cada tecla:
char const KEYS[4][4] = {{'1','2','3','A'} ,
                         {'4','5','6','B'} ,
                         {'7','8','9','C'} ,
                         {'*','0','#','D'} };

#byte kbd_port_b = 6


char kbd_getc( )
{
  char tecla=0;
  int f,c,t,i,j;

  port_b_pullups(true);
  set_tris_b(0b00001111); // RB7-RB4 salidas, RB3-RB0 entradas

  for(f=0x10, i=0; i<4; f<<=1, i++)
  {
    for(c=0x01, j=0; j<4; c<<=1, j++)
    {
      kbd_port_b = ~f;
      delay_cycles(1);
      t = kbd_port_b & 0x0F;
      t = ~(t | 0xF0 );
      if(t == c)
      {
        delay_ms(20);
        tecla=KEYS[i ][j ];
        while(t==c)
        {
          restart_wdt( );
          t = kbd_port_b & 0x0F;
          t = ~(t | 0xF0) ;
        }
        break;
      }
    }
    if(tecla)
      break;
  }

  port_b_pullups(false);
  return tecla;
}

--> este archivo lo tienen que guardar con el nombre de kbd4x4.c  en el archivo DRIVES delprograma PICCCompiler.

-->Ahora si se puede compilar el programa que les muestro aca abajo:

#include <16f877.h>                                 //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      //ordenes para el programador
#use delay (clock=4000000)                          //Fosc=4Mhz
#include<kbd4x4.c>                                  //libreria manejo keypad
#include<lcd.c>                                     //libreria manejo lcd 8bits
#byte porta=0x05
#use fast_io(b)
#use fast_io(d)

void menu_inicial(void);
void admin(void);
void menu_admin(void);
void usuario(void);
void cambio_admin(void);
void cambio_usuario(void);
char clave[16],a,limit;
char clavea[16]={'1','2','3'};
char limita=3;

signed char i, e;
boolean var=0;                  // variable donde se almacena la tecla precionada

void main(void)
 {
  inicio:
  lcd_init();
  set_tris_a( 0x00 );
  bit_clear(porta,2);            // Apaga el LCD.
  for(;;)
  {
   do{a=kbd_getc();             // hasta precionar una tecla.
     }while(a==0);
   bit_set(porta,1);            // Accionará un pitido
   delay_ms(500);
   bit_clear(porta,1);
   bit_set(porta,2);            // Prende el LCD.
   menu_inicial();              // Salto a menú principal.
   goto inicio;
  }
 }

//==============================================================================
//Saludo inicial.
//==============================================================================

void menu_inicial (void)
 {
  lcd_init();                   //inicializa lcd
  lcd_putc("   BIENVENIDO\n");  // Escribe en el lcd
  delay_ms(1000);               //Espero dos segundos
  lcd_putc("    WELCOME");      //Escribo en la segunda fila
  delay_ms(3000);               //Espero tres segundos
  uno:                          //Etiqueta UNO.
  lcd_putc("\fAdmin. -> A \nIngreso -> B"); //solicitud de clave.
  for(;;)
  {
   do{a=kbd_getc();
     }while(a==0);              //Hasta pulsar una tecla.

   bit_set(porta,1);            // Accionará un pitido
   delay_ms(100);
   bit_clear(porta,1);

   if(a=='A')
    {
     admin();
     delay_ms(1000);
     break;
    }
   if(a=='B')
    {
     usuario();
     delay_ms(1000);
     break;
    }
   if(a!= 'A' && 'B')
    {
     lcd_putc("\fTecla incorrecta\ncorrija x favor.");
     delay_ms(2000);
     goto uno;
    }
   }
 }

//==============================================================================
// Colocar clave
//==============================================================================

void usuario(void)
 {
  //dos:
  lcd_putc("\fINGRESE SU CLAVE\n");
  for(i=0; ;i++)
   {                                //bucle no sale...
    do{a=kbd_getc();
      }while(a==0);                 //...pulsar una tecla

    bit_set(porta,1);               // Accionará un pitido
    delay_ms(100);
    bit_clear(porta,1);

    lcd_putc("*");
    if(a=='C' || a=='D')            //si se pulsa C o D se sale de la funcion
     {
      if(i==0)                      //no se sale...
       {
        lcd_putc("\nEscribe una!");
        delay_ms(1000);
        lcd_putc("\n");
        lcd_gotoxy(1,2);
        i=-1;
        continue;
       }                             //...poner una clave valida
      if(i!=limit)                   //para ser correcto debe tener tb longitud correcta
      var=1;
      break;                         //salimos si se pulsa tecla * o #
     }
    if(a!=clave[i])                  //comprobacion de caracteres correctos
     var=1;                           //No es correcto->clave incorrecta
   }                                 //...hasta pulsar * o #
  if(var>0)
   {                                 //Clave incorrecta
    lcd_putc("\fAcceso denegado\n   Reintente!" );
    delay_ms(2000);
    break;
   }
  else
   {                                 //Clave correcta
    lcd_putc("\fAcceso permitido\n   Adelante!");
    delay_ms(1000);
    lcd_putc("\fNo olvide cerrar\n la puerta ...");
    bit_set(porta,0);                //Abre la puerta,
    delay_ms(2000);                  //Tiempo que se activará la chapa electrica.
    porta = 0x00;                    //Se desactiva la chapa electrica.
   }
  var=0;                             //reset var
 }

//==============================================================================
// Pedir la clave del administrador
//==============================================================================

void admin(void)
{
  //dos:
  lcd_putc("\fINGRESE SU CLAVE\n");
  for(e=0; ;e++)
   {                                  //bucle no sale...
    do{a=kbd_getc();
      }while(a==0);                   //...pulsar una tecla

    bit_set(porta,1);            // Accionará un pitido
    delay_ms(100);
    bit_clear(porta,1);

    lcd_putc("*");
    if(a=='C' || a=='D')              //si se pulsa C o D se sale de la funcion
     {
      if(e==0)                        //no se sale...
       {
        lcd_putc("\nEscribe una!");
        delay_ms(1000);
        lcd_putc("\n");
        lcd_gotoxy(1,2);
        e=-1;
        continue;
       }                              //...poner una clave valida
      if(e!=limita)                   //para ser correcto debe tener tb longitud correcta
      var=1;
      break;                          //salimos si se pulsa tecla * o #
     }
    if(a!=clavea[e])                  //comprobacion de caracteres correctos
     var=1;                           //No es correcto->clave incorrecta
   }                                  //...hasta pulsar * o #
  if(var>0)
   {                                  //Clave incorrecta
    lcd_putc("\f     Clave\n  Incorrecta!" );
    delay_ms(2000);
    break;
   }
  else
   {                                  //Clave correcta
    lcd_putc("\f     Clave\n   Correcta!");
    delay_ms(1000);
    menu_admin();
   }
  var=0;                              //reset var
 }

//==============================================================================
// Menú del administrador
//==============================================================================

void menu_admin(void)
 {
  tres:
  lcd_putc("\f Puede cambiar\n  claves de...");
  delay_ms(2000);
  lcd_putc("\fAdmin. -> A\nUsuario -> B");
  for(;;)
   {
    do{a=kbd_getc();
      }while(a==0);

   bit_set(porta,1);            // Accionará un pitido
   delay_ms(100);
   bit_clear(porta,1);

    if(a=='A')
     {
      cambio_admin();
      break;
     }
    if(a=='B')
     {
      cambio_usuario();
      break;
     }
    if(a!= 'A' && 'B')
     {
      lcd_putc("\fTecla incorrecta\ncorrija x favor.");
      delay_ms(2000);
      goto tres;
     }
   }
 }

//==============================================================================
// Cambio de clave al administrdor
//==============================================================================

void cambio_admin(void)
 {
  lcd_putc("\fNueva clave:\n");           //presentacion
  for(e=0;e<16;e++)
   {
    do{a=kbd_getc();                      //espera hasta...
     }while(a==0);                        //...pulsar una tecla

    bit_set(porta,1);                     // Accionará un pitido
    delay_ms(100);
    bit_clear(porta,1);
    if(a=='C' || a=='D')                  //si se pulsa * o # se sale de la funcion
     {
      if(e==0)                            //no se sale...
       {
        lcd_putc("\nEscribe una!" );
        delay_ms(500);
        lcd_putc("\n " );
        lcd_gotoxy(1,2);
        e=-1;
        continue;                         //...hasta poner una clave valida
       }
      lcd_putc("\fGuardando clave\n   nueva ...");
      delay_ms(2000);
      lcd_putc("\f  Nueva clave\n  guardada ...");
      break;                              //salir de funcion nueva_clave
     }
    lcd_putc(a);
    limita=e+1;                            //longitud de la clave
    clavea[e]=a;                           //almacena clave(maximo 16 caracteres)
   }
 }

//==============================================================================
// Cambiar la clave al usuario.
//==============================================================================

void cambio_usuario(void)
 {
  lcd_putc("\fNueva clave:\n");           //presentacion
  for(i=0;i<16;i++)
   {
    do{a=kbd_getc();                      //espera hasta...
     }while(a==0);                        //...pulsar una tecla

    bit_set(porta,1);            // Accionará un pitido.
    delay_ms(100);
    bit_clear(porta,1);

    if(a=='C' || a=='D')                  //si se pulsa * o # se sale de la funcion
     {
      if(i==0)                            //no se sale...
       {
        lcd_putc("\nEscribe una!" );
        delay_ms(500);
        lcd_putc("\n " );
        lcd_gotoxy(1,2);
        i=-1;
        continue;                         //...hasta poner una clave valida
       }
      lcd_putc("\fGuardando clave\n   nueva ...");
      delay_ms(2000);
      lcd_putc("\f  Nueva clave\n  guardada ...");
      break;                              //salir de funcion nueva_clave
     }
    lcd_putc(a);
    limit=i+1;                            //longitud de la clave
    clave[i]=a;                           //almacena clave(maximo 16 caracteres)
   }
 }


--> Está un poco extenso, y me gustaria que elguien con mejor idea lo pueda modificar, no s epreocupen lo dejo para el uso libre :), espero sus comentarios.

-->Se me olvidaba se puede simular en el Proteus, aca les dejo el archivo para descargar del proteus
--> ESPERO COMENTARIOS:
 

Adjuntos

  • dibujo_200.jpg
    dibujo_200.jpg
    84.2 KB · Visitas: 2,919
  • diseo_531.rar
    67.6 KB · Visitas: 3,553
Hola Wilfretronic Soy nuevo en el uso de LCD; me podrias dar una breve explicación para controlar uno de 16X2? Me conseguire el Proteus para simular.

Quiero hacer un proyecto en el cual de pendiendo del estado de las entradas en el PORT(X) tenga una leyenda diferente.

Trabajo con MPLab 8 y Hi Tech PIC C y MikroC; cualquier codigo que pueda simular me sirve. Gracias.
 
Hola DMaq00 :) , para controlar facilmente el LCD de 16x2, primero tienes que llamar la libreria de éste, en mi caso le puse "#include <LCD.C> que es el estandar (es la que se encuentra en la libreria del CCS), ahora ya puedes usar el LCD, pero en el programa para llamrlo o mejor dicho para iniciralo escribes "lcd_init();"
pero ahora si tu quieres escribir algo en el LCD de las con "lcd_putc("hola mundo");" todo lo que apararesca entre parentesis saldra en LCD. AHora si no me entendiste te escrivo un programita aca abajo:

#include <16f877.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#include<lcd.c> // libreria del LCD.

void main (void)
{
lcd_init(); //inicializa lcd
lcd_putc("\fHola\n"); // Escribe en el lcd
delay_ms(1000); //Espero dos segundos
lcd_putc(" mundo"); //Escribo en la segunda fila
}

Este programa muestra en pantalla la palabra "Hola" en la primera fila para que despues de un segundo muestre la palabra "mundo" en la segunda fila.

\f --> Borra lo que anteriormente se encuentra en la pantalla.
\n --> Salta a la siguiente fila.
 
Gracias por el Tip. Wilfretronic
Deja; hago la prueba; aunque nunca he usado CCS espero poder aplicar lo mismo con el Hi Tech PICC (Ansi C).

A proposito; el LCD que tengo no tiene marca, tampoco algun numero de referencia; pero he encontrado algo de información tecnica acerca de LCD de 16X2; la pregunta es; ¿Todos los LCD's 16X2 se usan de la misma forma?; es decir la misma libreria me va a funcionar?.

La otra duda que tengo es si con la misma libreria puedo enviar y recibir datos del LCD. Bueno; voy a revisar la libreria LCD.c.

Me puedes decir como se llama el compilador CCS que usaste?
Gracias otra vez.
 
Otra duda; en tu diagrama adjunto solo usaste los ultimos bits del bus de datos del LCD(D7:D4); los otros no son necesarios?

La razon es porque tengo algunos dispositivos que emplean todo los bits del Bus?
 
Hola otra vezDMaq00 :), Lo que pasa que la libreriaesta configurada para 4 bit solamente, ahora realmente no estoy muy seguro de que esta libreria funcione para los demas LCD's realmente no lo e probado pero con el LM016 si funciona perfectamente, ahora sobre el programa el nombre es PIC C Compiler o mas conocido como CCS, yo onsegui una versiòn super completa en el ARES, ahh se me olvidava si claro que puedes tambien leer datos del LCD no ahy problema pero particularmente yo siempre e utilizadoel LCD como un simple mostrador de caracteres.
 
Hola wilfretronic; ya me consegui el proteus y el compilador; hice la prueba con el codigo que me rolaste y funciona perfectamente.

Yo estoy haciendo un proyecto que despues ingresare al foro.

El Compilafor PIC C Compiler (CCS); tiene bastantes ejemplos de codigo. Se los recomiendo ademas de traer una explicaciòn muy comprensible.

Gracias de nuevo.
 
Espero que te sea de mucha ayuda, y espero que ´puedas subir tu proyecto pero yo creo que por lo pronto nos digas por lo menos el nombre y que se trata aver si se puede ayudar en algo.
 
Acerca del proyecto que mencionas Wilfretronic pues es este;y efectivamente necesito ayuda; me gustaria crear un nuevo tema para aquellos que requieran ayuda con este tipo de motores; pero no se como hacerlo; tambien me podrías decirme como crearlo por favor?

Volviendo al tema del servomotor;

antes de comenzar con esto me lei esta información lo que me facilito la generación de la señal a 50Hz y controlar la amplitud de 0.3ms hasta 2.3ms tal como se muestra en los links.

http://webelectronica.atspace.com/content/servos.html
http://www2.ate.uniovi.es/fernando/Doc2008/Presentaciones/Control de motores.pdf

Al parecer ya logre esta parte, por lo que se puede ver en el osciloscopio; y digo al parecer; porque aun no lo he probrado con el motor adecuado(Futaba S3003, porque el tengo esta dañado); solo con el servo que se muestra en la imagen de abajo, el cual esta muy limitado a señales de 1ms, o tal vez no se como configurarlo de la forma adecuada(si se puede configurar para que me funcione. ayudeneme por favor).

Teniendo la señal y controlandola con la simulación de proteus; ahora quiero anexarle un LCD 16X2 (LM016), para facilitarme las cosas; quiero que el LCD me muestre en que grado se va a posicionar el motor.

Algo asi quiero que aparezca en el LCD

Posicion=angulo

//"angulo" es la variable que uso en el programa(ver codigo); asi que me deberia regresar un numero y deberia quedar asi

ejemplo

Posicion=18

intente con

lcd_putc(angulo); //pero no funciona; no aparece nada en el display

Ya revise la libreria LCD.c pero no comprendo si alguna de las funciones me serviria;

Luego otro problema es que la actividad del LCD no debe influir con la generación de la señal a 50 Hz. Y al paecer en mi programa si afecta; Ayuda por favor.

Podría usar Flip-Flop.

Incluyo el *.hex para lo que tengan el Proteus para simularlo.

Si no queda muy claro lo que quiero hagamelo saber; lo que pasa es que se me ha hecho tarde para el trabajo.

Espero que me ayuden gracias.
 

Adjuntos

  • servo_futaba_s3003_154.jpg
    servo_futaba_s3003_154.jpg
    120 KB · Visitas: 883
  • servo_futaba_s3003_709.txt
    1.3 KB · Visitas: 426
  • proyecto_para_motor_futaba_s3003_de_0_a_180_grados_con_ccs_770.rar
    85.2 KB · Visitas: 905
Hola amigo DMag00, en archivos adjuntos te envio la modificación del archivo que publicaste, esperandoq ue te sea de mucha utilidad pero de ante mano me disculpes de la demora de la respuesta pero ac aestá y espero que visites mipagina web que proximamente publicare con tos de micro procesadores :) .

Código:
#include <16f877.h>                                 //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      //ordenes para el programador
#use delay (clock=4000000)                          //Fosc=4Mhz
#include<lcd.c>                                     //libreria manejo lcd 8bits
#byte porta=0x05                                    //Configuro el puerto A.
#byte portc=0x07                                    //Configuro el puerto C.
#use fast_io(d)

void angulo_m(unsigned int estado);
void mostrar_lcd(void);
unsigned int angulo=0;

void main()
 {
  set_tris_a(0x03);                     //Sólo los dos priemros pines como entrada.
  set_tris_b(0x00);                     //Todo el puerto b como salida.
  set_tris_c(0x00);                     //Todo el puerto c como salida.

  while(1)
   {
    mostrar_lcd();                      //Salto a la sub rutina del LCD.
    angulo_m(angulo);                   //Salto a la sub rutina del angulo.

    if(bit_test(porta,0)==1 && bit_test(porta,1)==0 && angulo<179)
     {angulo++;
     }

    if(bit_test(porta,0)==0 && bit_test(porta,1)==1 && angulo>0)
     {angulo--;
     }
   }
}

 static void angulo_m(unsigned int estado)
  {
   bit_clear(portc,0);                  //Limpio el PIN 1 del puerto C
   delay_us((estado*10+300));
   bit_set(portc,0);                    //Activo el PIN 1 del puerto C
   delay_us((20000-(estado*10+300)));
  }

 void mostrar_lcd(void)
  {
   lcd_init();                          //inicializa lcd
   printf(lcd_putc,"\fAngulo de\n");    //Escribe en el lcd.
   printf(lcd_putc,"Angulo=%i",angulo); //Escribo en la segunda fila del LCD.
   delay_ms(500);                       //espera medio segundo.
  }
:)

como veras el codigo solo muestra los valores positivos pero si desas podemos hacer una modificación par aque muestre los negativos.

te mando un habrazo fraternal del Perú.
 

Adjuntos

  • yop_289.c
    1.7 KB · Visitas: 411
espero no demorar en la respuesta pero aca tengo algo que tal vez te sirva mi amigo.

Código:
#include <16f877.h>                                 //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      //ordenes para el programador
#use delay (clock=4000000)                          //Fosc=4Mhz
#include<lcd.c>                                     //libreria manejo lcd 8bits
#byte porta=0x05                                    //Configuro el puerto A.
#byte portc=0x07                                    //Configuro el puerto C.
#use fast_io(d)

void angulo_m(unsigned int estado);
void mostrar_lcd(void);
unsigned int angulo=0;

void main()
 {
  set_tris_a(0x03);                     //Sólo los dos priemros pines como entrada.
  set_tris_b(0x00);                     //Todo el puerto b como salida.
  set_tris_c(0x00);                     //Todo el puerto c como salida.

  while(1)
   {
    mostrar_lcd();                      //Salto a la sub rutina del LCD.
    angulo_m(angulo);                   //Salto a la sub rutina del angulo.

    if(bit_test(porta,0)==1 && bit_test(porta,1)==0 && angulo<179)
     {angulo++;
     }

    if(bit_test(porta,0)==0 && bit_test(porta,1)==1 && angulo>0)
     {angulo--;
     }
   }
}

 static void angulo_m(unsigned int estado)
  {
   bit_clear(portc,0);                  //Limpio el PIN 1 del puerto C
   delay_us((estado*10+300));
   bit_set(portc,0);                    //Activo el PIN 1 del puerto C
   delay_us((20000-(estado*10+300)));
  }

 void mostrar_lcd(void)
  {
   lcd_init();                          //inicializa lcd
   printf(lcd_putc,"\fAngulo de\n");    //Escribe en el lcd.
   printf(lcd_putc,"Angulo=%i",angulo); //Escribo en la segunda fila del LCD.
   delay_ms(500);                       //espera medio segundo.
  }

saludo fraternal del perú.
 
Gracias wilfretronic

Este proyecto esta casi terminado; pero me gustaria que me ayudaran con la simulacion, ya que el servo se mueve pero no como el programa lo requiere, no se si relamente sriva para simular este proyecto. Si es que si, agradeceria me dijeran que valor poner en los parametros que se modifican en Proteus.


Aun tengo otras dudas; me podrias decir para que sirven las siguientes instrucciones y si son realmente necesarias.

#byte porta=0x05 //
#byte portc=0x07 //
#use fast_io(d) //
bit_test(porta,0) //
bit_clear(portc,0); //
bit_set(portc,0); //


Y en lo que respecta al proyecto pues este es el codigo que use y te adjunto mi proyecto completo.


Código:
#include "E:\D'Mag\Proyectos con Proteus y MPLab con LCD\Diseño en Proteus LCD y servo Futaba\Proyecto para motor Futaba S3003 de 0 a 180 grados con CCS con wilfretronic\Motor Futaba S3003 50Hz 0 a 180 grados_octubre_30_2008 con LCD LM016 con wilfretronic.h"
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      //ordenes para el programador 
#use delay (clock=4000000)                          //Fosc=4Mhz 
#include <lcd.c>                                     //libreria manejo lcd 8bits 
#byte porta=0x05                                    //Configuro el puerto A. 
#byte portc=0x07                                    //Configuro el puerto C. 
#use fast_io(d) 

void retardo (unsigned int32 y);
void pulso(unsigned int pulso_alto);
void mostrar_lcd(void); 
unsigned int32 high=0,low=0; 
unsigned int angulo;

void main(void) 
 { 
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_psp(PSP_DISABLED);
  setup_spi(SPI_SS_DISABLED);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  set_tris_a(0x03);                     //Sólo los dos priemros pines como entrada. 
  set_tris_b(0x00);                     //Todo el puerto b como salida. 
  set_tris_c(0x00);                     //Todo el puerto c como salida. 

  while(1) 
   { 
    if(bit_test(porta,0)==1 && bit_test(porta,1)==0&&angulo<180)
    
     {angulo++;}                        //Incremento de angulo

    if(bit_test(porta,0)==0 && bit_test(porta,1)==1&&angulo>0) 
    
     {angulo--;}                        //Decremento de angulo
     
    pulso(angulo);                      //Llamar funcion para generar pulso

    mostrar_lcd();                      //Salto a la sub rutina del LCD.
   } 
} 

//==========    Funcion retardo    ================ 
//=================================================
void retardo (unsigned int32 y)                 
 { 
  unsigned int32 z;     //Varible contador
  for(z=1;z<=y;z++)     //Realizar retardo de 10us
   {                    //    "y" veces
   delay_us(10);        //Retardo de 10us
   }
 }
 
//==========    Funcion pulso    ================ 
//===============================================
void pulso(unsigned int pulso_alto )
{
    high=pulso_alto+30;              //Calcula tiempo en alto "high"
                                     //   30 = 0 grados (constante)
                                     //   40 = 1 grado
                                     //   210 = 180 grados
    low=2000-high;                   //Calcula tiempo en bajo
                                     //**High+low=(2000x10us)= 50Hz o 20 ms
    bit_set(portc,0);                //Limpio el PIN 1 del puerto C 
    retardo(high);                   //Llamar funcion de retardo
    bit_clear(portc,0);              //Activo el PIN 1 del puerto C 
    retardo(low);                    //Llamar funcion de retardo          
}

//==========    Funcion LCD    ================ 
//=============================================
void mostrar_lcd(void) 
 { 
   lcd_init();                                    //inicializa lcd 
   printf(lcd_putc,"\fAngulo: <");                //Escribe en el lcd. 
   printf(lcd_putc,"%u",angulo);                  //Escribe grados deseados
   printf(lcd_putc,"\n%u0us+%Lu0us",high,low);    //En la segunda fila escribe
                                                  //  microsegundos en alto y bajo
   delay_ms(500);                                 //espera medio segundo. 
 }
 

//int32	Para usar valores numericos de 16 bits	
//%u		Imprime un una variable con valor de 0 a 254 en lcd()
//%Lu		Long unisigned int porque era necesario imprimir un valor 
//			mayor a 254 en la funcion lcd()

Les recuerdo que el valor de las transiciones lo obtuve despues de leer la información en los link en mensajes anteriores.
 

Adjuntos

  • proyecto_para_motor_futaba_s3003_de_0_a_180_grados_con_ccs_con_wilfretronic_200.rar
    52.8 KB · Visitas: 543
Hola colega, disculpa por la demora en la respuesta pero te dire:

#byte porta=0x05 // --> Declaras los puertos a utilizar en este caso son los puertos A y C que su dirección
#byte portc=0x07 // --> en el PIC son 05 y 07 respectivamente.
#use fast_io(d) // --> Ahora el puerto B tambien lo reclaras pero para que funcione mas rapido que lo normal.

bit_test(porta,0) // --> Ahora esta instrucción se testea si en el PIN 0 del puerto A hay un uno(1).
bit_clear(portc,0); // --> Esta instrucción limpia el PIN 0 del puerto C (no importa loque ste en ese pin lo pone a cero(0).
bit_set(portc,0); // --> Pone a uno(1) el PIN 0 del puerto C.

Basicamente las tres últimas instrucciones sirben para manejar los pines de los puertos induvidualmente. COn respecto lo del proteus lo are pronto ya que por lo pronto me encuentro muy ocupado .
 
Bueno colega, ahora queme sente en mi PC trankilo me puse a ver tu proyecto con mayor detenimiento y me parece un buen poyecto el tuyo que a su vez funciona de lo mejor y con respecto a la animación del proteus, el motor que pusiste esta muy bien pero la conexión que isiste del PIC al motor no la isiste del todo bien porque al salir del PIC lo conectaste a la entrada A del osciloscopio y lo sacaste por la "entrada" B del mismo y eso es lo que está mal ya que como te dije es entrada no es salida (osciloscopio de doble entrada) es por eso que no le llega señal al motor y no gira, has un cambio ponlo directo al motor sin pasar por el osciloscopio y ahisi girará pero si quieres ver la señal jala solo un cablecito a la entrada A del osciloscopio y ya.... :)
 
Bien Wilfretronic; ya hice lo del osciloscopio; y el proyecto esta mucho mejor en el ultimo archivo que adjunte; y alli si funciona mejor; de hecho el motor si gira(si tienes tiempo revisa el ultimo archivo por favor); pero, lo que yo deseo es que la posición corresponda a la lectura del LCD;

Si el LCD dice 45° el motor debe desplazarse a esta posición y por el momento no es así; por lo que pienso que es cosa de los parametros de simulación del motor.

De hecho ya tengo a mi disposición 1 motor Futaba S3003 para comprobar fisicamente a ver como me fucniona este proyecto.

Luego les informaciónrmare el resultado de las pruebas.

La siguiente aplicación que le dare a estos motores es fabricar un Brazo robotico. Aun esta en bosquejo; primero debo tener el control total del motor; este es un nuevo proyecto con el cual espero que me ayuden; cuando tenga alguna documentación la subire para que la vean y me den sugerencias. Pero por mientras a controlar el Futaba S3003.

Gracias.
 
lenguaje CCS, hola wilfretronic,, soi un estudiante de electronica de segundo curso de FP, el primer programa que pusiste de la cerradura electornica me interesa mucho, y lo he compilado pero me sale un error, y es k kuando activas las pulldown , me dice que el ''true'' es desconocido. Que puedo hacer?, Gracias de antemano amiwo
 
Hola colegas, de mucho tiempo e vuelto a escribir en este foro, bueno amigo basilinho de seguro copiaste todo el codigo que esta escrito y lo pegaste, lo que pasa que por error mio pegue la libreria del teclado 4x4 primero donde estan las modificaciones para ese tipo de teclados y luego pegue el programa en si la que se debe de compilar, dejame decirte que ese programa no tiene ni un error, yo ya lo arme fisicamente y me funciona de maravilla, cualquier orta duda no duces en comunicarmelo.
 
GRacias amiwo, lo he compilado y me da bien, voi a modificarlo un poco para que cuando no se meta la contraeña corecta en 3 ocasiones suene una alarma. Si tuebiera alguna duda , pues lla te escribiria de nuevo Y gracias por la contestacion!
 
Atrás
Arriba