TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: zurdo en 01 de Noviembre de 2007, 23:44:10

Título: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: zurdo en 01 de Noviembre de 2007, 23:44:10
necesito la maxima ayuda para leer informacion desde un lector de codigo de barras con interfaz PS-2 con un PIC preferiblemente el 16f877. por favor lo mas explicitos posible que soy nuevo en esto.

Gracias  :mrgreen:
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: MGLSOFT en 02 de Noviembre de 2007, 00:10:47
Tendras la hoja de datos del modelo de tu lector??
Asi podremos ayudarte mas... :mrgreen:
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: elreypic2 en 02 de Noviembre de 2007, 00:34:31
Que tal,

Como mencionas, si tu lector tiene una interface PS-2, simplemente busca alguna rutina que lea teclados de PC con el PIC, pero en lugar de poner el teclado pones tu lector y listo. La idea de que estos lectores tengan esa interface es para evitar tener que teclear el codigo representado por el codigo de barras. Es decir, el lector se comporta como si fuese un teclado de PC.

Esto te puede servir:

http://users.picbasic.org/Howto/PC_keybrd/pc_keyboard.htm

Saludos.

Elreypic.
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: Nocturno en 02 de Noviembre de 2007, 02:58:03
Todo lo que necesitas lo escribió, fotografió, capturó y recopiló el amigo Diego en su artículo: Proyectos: Teclado PS/2 (http://picmania.garcia-cuervo.net/proyectos_teclado_ps2.htm)


Nota: Editado por RedPic para corregir el lnk roto.
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: zurdo en 03 de Noviembre de 2007, 13:28:08
ok gracias a todos voy a empezar con el montaje y cualquier duda se que me ayudaran.....

el lector asignado fue un VOYAGER pero el numero exacto lo ubico al principio de semana
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: RedPic en 03 de Noviembre de 2007, 15:01:46
Imagino que por Voyager te referirás a la Metrologic MS9520 o similar. Con interface RS232, PS/2 y/o USB.

Si es PS/2 la enchufas tal como dice don Manuel siguiendo los pasos del Ponga un teclado PS/2 en su PIC (vida) (http://www.todopic.com.ar/foros/index.php?topic=2256.0), conectar una Voyager o un Teclado PS/2 es exactamente igual, de hecho se conectan ambos en serie.

y si en en RS232, mucho mas fácil aún, le pones un MAX232 con algo parecido a Lo mínimo para comunicarnos vía RS232 Hardware y Software (http://www.todopic.com.ar/foros/index.php?topic=4620.0)
 y la lees directamente.

Si es USB no hay nada que hacer porque necesitarías un Host USB y de esos no nos quedan.

Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: zurdo en 08 de Noviembre de 2007, 23:19:51
el asignado es un PS-2, voy a hacer una pregunta de repente obvia pero ahi va:::

el lector debe generar dos señales cierto? una de data y otra de clock por lo que es sincronica la comunicacion
como debo manejar esas señales en el micro??  :?
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: mane9999 en 05 de Mayo de 2009, 20:25:41

Si es PS/2 la enchufas tal como dice don Manuel siguiendo los pasos del Ponga un teclado PS/2 en su PIC (vida) (http://www.todopic.com.ar/foros/index.php?topic=2256.0), conectar una Voyager o un Teclado PS/2 es exactamente igual, de hecho se conectan ambos en serie.


Ya pude conectar un teclado al PIC como lo indica el proyecto de REDPIC, pero ahora al conectar el lector de codigo de barras no manda nada. Podria ser la velocidad de la interfaz ps-2 del lector??
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: RedPic en 06 de Mayo de 2009, 05:56:51
Es importante tener claro un asunto que afecta al funcionamiento del PS/2.

Hay dispositivos PS/2 que necesitan una inicialización que mi proyecto no realiza.

Esto ocurre por ejemplo cuando conectamos un Teclado PS/2 al PC que éste inicializa a aquel y a si mismo cuando arranca Güindous. Si iniciamos Güindous sin conectarle el Teclado PS/2 el puerto PS/2 del PC no se pone en marcha y ya no funcionaría aunque después le conectásemos el teclado. Es obligatorio iniciar Güindous con el teclado conectado para que todo funcione.

Hay pistolas que reaccionan igual, necesitan "sufir" un proceso de inicialización que otras no requieren y como ya he comentado antes mi proyecto ni genera ni responde a ese tipo de inicializaciones.

 
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: vargas10perez en 07 de Septiembre de 2009, 00:03:37
yo tengo el mismo problema.... yo cuento con un br-310 de bematech....!!! estoy con las mismas dudas! ayuda :(
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: RedPic en 07 de Septiembre de 2009, 04:33:41
De todas formas en Conectando un Teclado PS/2 (http://picmania.garcia-cuervo.net/proyectos_teclado_ps2.php) tienes en la sección de recursos acceso a un PDF titulado "Teclado AT-PS2 Interfaz y funciones v1.2" que es toda una biblia de cómo funciona un teclado PS/2 ¡y en español!
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: Suky en 07 de Septiembre de 2009, 09:37:35
yo tengo el mismo problema.... yo cuento con un br-310 de bematech....!!! estoy con las mismas dudas! ayuda :(

Como ha dicho RedPic mas arriba, dedíquense a buscar información sobre su lector para saber si necesita alguna inicilización


Saludos!
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: vargas10perez en 09 de Septiembre de 2009, 15:33:03
y en el caso de que usase un 16f877 ? habria algun problema? :?
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: Suky en 09 de Septiembre de 2009, 19:20:33
Ninguno!  ;-)
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: vargas10perez en 13 de Septiembre de 2009, 22:51:19
pero para el  pic 16f628f los pines corresponden  a "rb0/int"  y  "rb3/ccp1" mientras que en el 16f877A los mismo mismos pines corresponden a "rb0/int"con el cual no hay problema pero para el rb3 corresponde rb3/pgm el cual no va. que sugerencias tendrian?
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: Suky en 14 de Septiembre de 2009, 00:37:51
mmm... y porque no va? Esta utilizando el módulo CCP para la comunicación? No lo creo, es solo un pin I/O digital. Trata de entender que realiza el código de RedPIC, sino no tiene sentido realizar el proyecto  ;-)
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: RedPic en 14 de Septiembre de 2009, 06:54:57
Este pequeño experimento que hice con el Teclado PS/2 (http://picmania.garcia-cuervo.net/proyectos_teclado_ps2.htm) solo necesita una interrupción externa, para detectar el Clock del PS/2, y cualquier otro pin libre para leer el Data del PS/2 (y no hace uso de ningún módulo CCP ni ningún otro).

Pero estos pines que uso es fundamental que dispongan de un PULL-UPS.

Si utilizo RB0 es porque para los PIC's pequeños es el único que dispone de Interrupción Externa, y utilizo RB3, por ejemplo, porque tanto RB0 como RB3 tienen Pull-Ups internas y puedo (y debo) activarlas y me es mas cómodo así. Para el Data podría utilizar cualquier otro pin con tan solo ponerle una pull-up externa y tambén funcionará.

De todas formas, para este proyecto o para cualquier otro, tal como dice Suky, el tema está en comprender cómo funciona o debe funcionar lo que queremos realizar y después, solo después de tener claro lo que queremos y lo que necesitamos, acometer su realización física y real.

Si quieres que un PIC lea el protocolo PS/2 es imprescindible que sepas en qué consiste el protocolo PS/2 de lo contrario estarás dando palos de ciego y nunca llegarás realmente a comprender qué estás haciendo y por qué. (en un post anterior os hablaba del la "biblia" del PS/2)

Por eso en todos (o casi todos) mis proyectos, experimentos, pruebas empiezo siempre describiendo qué intento hacer y solo después aporto una posible solución de cómo respondo a ese qué planteado. Y la mayoría de las veces vienen los amigos y me muestran formas mas elegantes, rápidas, bonitas o eficaces de hacer eso mismo.

Un saludo.  
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: vargas10perez en 15 de Septiembre de 2009, 18:54:12
gracias por su ayuda... me estoy informando bastante sobre el tema del ps/2 avanzando lento pero avanzando! la verdad es que apenas estoy aprendiendo sobre programacion pic y todo lo demas...

como siempre sigo con mis dudas... en cuanto a la interrupcion externa... mi problema es el siguiente: la mayor parte de mi programa esta en ansi c; asi que estoy pasando de uno al otro, pero nose como manejar, o sea, como seria la sentencia  para la interrupcion externa en ansi c y como manejarla, he buscado mucho pero no logro encontrar algo que me ayude. desde ya gracias
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: Suky en 15 de Septiembre de 2009, 18:59:00
En que compilador?
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: vargas10perez en 15 de Septiembre de 2009, 20:26:00
mplab v8.30! :shock:
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: Suky en 15 de Septiembre de 2009, 20:35:51
 :D Aquí (http://www.todopic.com.ar/foros/index.php?topic=17017.0) hay un tutorial de C18 donde muestra como trabajar las interrupciones.  ;-)


Saludos!
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: vargas10perez en 17 de Septiembre de 2009, 08:18:22
ok gracias!! jeje ya entendi el tema ese de las interrupciones ahora tengo que hacer se vea lo scaneado en un lcd... voy a intentar a ver que sale cualquier cosa te pido ayuda! je gracias enserio :)
Título: Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
Publicado por: vargas10perez en 22 de Septiembre de 2009, 08:41:07
hola! ayuda ayuda :oops:

ya conecte todo y utilice lo que me habian indicado pero lo hice con ansi c, pero no entiendo que hago mal porque no me esta funcionando ... es mas no entiendo porque solo me reconoce las letras a z y q cuando conecto un teclado en vez del lector y con el lector naaaada... aqui va mi programita ... me ayudan porfavor_¿?

#include <htc.h>
#include <delay.h>
#include <delay.c>
#include <lcd.c>
#include <lcd.h>

#define     XTAL_FREQ      4MHZ
#define    BRATE          9600
#define      BUFF_SIZE      64
#define      LCD_RS          RE2
#define      LCD_RW          RE1
#define    LCD_EN          RE0   
#define    LCD_DATA      PORTD
#define      LCD_STROBE      ((LCD_EN = 1),(LCD_EN = 0))

//DEFINICIONES GLOBALES

int cantidad;
unsigned char code_asc[10];
char got_interrupt;
char interrupt_count;
char status_b3;
unsigned char edge, bitcount;
int q;
unsigned char m;

//DECLARACION DE SUBRUTINAS

void interrupt int_ext (void);
void inicializa_kb(void);
void decode (unsigned char sc);
void lcd_cadena (const char * cadena);
void lcd_escribir_dato (char);
void convertir_cadena();


//TABLA DE CARACTERES COSRRESPONDIENTES A LA PULSACION DE LA TECLA

//1.MODALIDAD NORMAL (SIN PULSAR SHIFT)
unsigned char const unshifted[68][2] = {
0x0d,9,
0x0e,'º', 0x15,'q', 0x16,'1', 0x1a,'z', 0x1b,'s', 0x1c,'a', 0x1d,'w',
0x1e,'2', 0x21,'c', 0x22,'x', 0x23,'d', 0x24,'e', 0x25,'4', 0x26,'3',
0x29,' ', 0x2a,'v', 0x2b,'f', 0x2c,'t', 0x2d,'r', 0x2e,'5', 0x31,'n',
0x32,'b', 0x33,'h', 0x34,'g', 0x35,'y', 0x36,'6', 0x39,',', 0x3a,'m',
0x3b,'j', 0x3c,'u', 0x3d,'7', 0x3e,'8', 0x41,',', 0x42,'k', 0x43,'i',
0x44,'o', 0x45,'0', 0x46,'9', 0x49,'.', 0x4a,'-', 0x4b,'l', 0x4c,'ñ',
0x4d,'p', 0x4e,'+', 0x52,'´', 0x54,'`', 0x55,'¡', 0x5a,13, 0x5b,'+',
0x5d,'ç', 0x61,'<', 0x66,8, 0x69,'1', 0x6b,'4', 0x6c,'7', 0x70,'0',
0x71,'.', 0x72,'2', 0x73,'5', 0x74,'6', 0x75,'8', 0x79,'+', 0x7a,'3',
0x7b,'-', 0x7c,'*', 0x7d,'9',
0,0
};

//1.MODALIDAD MAYUSCULA (SHIFT PULSADO)
unsigned char const shifted[68][2] = {
0x0d,9,
0x0e,'ª', 0x15,'Q', 0x16,'!', 0x1a,'Z', 0x1b,'S', 0x1c,'A', 0x1d,'W',
0x1e,'"', 0x21,'C', 0x22,'X', 0x23,'D', 0x24,'E', 0x25,'$', 0x26,'•',
0x29,' ', 0x2a,'V', 0x2b,'F', 0x2c,'T', 0x2d,'R', 0x2e,'%', 0x31,'N',
0x32,'B', 0x33,'H', 0x34,'G', 0x35,'Y', 0x36,'&', 0x39,'L', 0x3a,'M',
0x3b,'J', 0x3c,'U', 0x3d,'/', 0x3e,'(', 0x41,';', 0x42,'K', 0x43,'I',
0x44,'O', 0x45,'=', 0x46,')', 0x49,':', 0x4a,'_', 0x4b,'L', 0x4c,'Ñ',
0x4d,'P', 0x4e,'?', 0x52,'¨', 0x54,'^', 0x55,'¿', 0x5a,13, 0x5b,'*',
0x5d,'Ç', 0x61,'>', 0x66,8, 0x69,'1', 0x6b,'4', 0x6c,'7', 0x70,'0',
0x71,'.', 0x72,'2', 0x73,'5', 0x74,'6', 0x75,'8', 0x79,'+', 0x7a,'3',
0x7b,'-', 0x7c,'*', 0x7d,'9',
0,0
};

//PROGRAMA PRINCIPAL
void main(void){
   TRISB=0x09;
   TRISE0=0;           //RE0 como salida
   TRISE1=0;            //RE1 como salida
   TRISE2=0;         //RE2 como salida
   TRISD=0x00;
   //PORTB=0x00;         
   PORTE=0x00;
   PORTD=0x00;
   ADCON1=0x06;

   cantidad="0000";
   //code_asc="0000000";

inicializa_kb ();       // Inicializa la recepcion del teclado

RBPU=0;       // Pull_up activo para el puerto B

DelayUs(5);
         
//Inicializa las variables usadas por la rutina de interrupcion antes de activar las interrupciones

interrupt_count=0;
got_interrupt=0;
status_b3=0;

INTEDG=0;       // Bit de seleccion del tipo de flanco para la interrupcion (0=Flanco de bajada)
INTF=0;

INTE=1;    // Bit de habilitacion de interrupcion externa para RB0/INT
GIE=1;       // Bit de habilitacion de interrupciones globales


//Bucle principal
//Verificar si se produce alguna interrupcion (got_interrupt). Si es asi, contar, borrar
//el flag y esperar 50ms, reactivando la gestion de las interrupciones

   while (1){
      if (got_interrupt==1){    //Verificar si se produce alguna interrupcion (got_interrupt)

         got_interrupt=0;    // Borrar el flag global que se inicio en la rutina de servicio

//         DelayMs(50);       //Esperar 50ms para evitar rebotes en los contactos de las teclas       
         
         INTF=0;
         INTE=1;    // Bit de habilitacion de interrupcion externa para RB0/INT

      }   //Fin del IF
   }    //Fin del while
}    //Fin del MAIN


//Subrutina para INICIALIZAR TECLADO

void inicializa_kb(void){
unsigned char edge, bitcount;    // 0 = neg. 1 = pos
edge=0;       // 0=flanco de bajada y 1= flanco de subida
bitcount=11;
}


//INTERRUPCION EXTERNA

void interrupt int_ext(void){
unsigned char data;
      
   if( bitcount<11 && bitcount>2){    //Los bits del 3 al 10 son datos.
                              //Los bits de paridad, de comienzo y de fin son ignorados.
      data=(data>>1);    // Se desplaza un lugar a la derecha
      status_b3=RB3;

      if (status_b3==1){
         data= data | 0x80;
      }
   }

   if(--bitcount==0){       // Todos los bits fueron recibidos
      lcd_init();
      lcd_clear();
      lcd_goto(0);
      lcd_puts("Articulos =");
      lcd_goto(12);
      lcd_puts("cantidad");
      lcd_goto(64);
      lcd_puts("Precio =");
      lcd_goto(73);      
      decode(data);       // Envia data la SUBRUTINA DECODE
      DelayMs(100);      

      data=0;
      bitcount=11;
      got_interrupt=1;   
   }

got_interrupt=1;
interrupt_count++;
INTF=0;
q=0;
}

//SUBRUTINA DECODE

void decode (unsigned char sc){
static unsigned char is_up=0, shift=0, mode=0;
unsigned char i,q;

//El ultimo dato recibido fue el identificador up-key

   if (!is_up){
      
      switch (sc){

         case 0xF0: // La tecla de up-key
         is_up=1;
         break;

         case 0x12: // Shift izquierdo
         shift=1;
         break;
         
         case 0x59: // Shift derecho
         shift=1;
         break;
   
         default:

            if(!shift){    // Si shift no esta presionado, mirar la tabla del scancode
               
               for (i=0;unshifted[0]!=sc && unshifted [0]; i++ );
                  
                  if (unshifted[0]==sc){
                     
                  code_asc[0]=unshifted[1];
                  
                  lcd_puts (code_asc);
                     } //fin del switch dentro del if y del for
                  
                  } //fin del if dentro del for
            
            } // si shift no esta presionado
            
            else{       // Si shift esta presionado
               
               for (i=0; shifted[0]!=sc && shifted [0]; i++ );
                  
                  if (shifted[0]==sc){
                     
                  code_asc[0]=shifted[1];
                  
                  lcd_puts (code_asc);
                  
                     
            } // Fin del if dentro del switch
         } // Fin del else
         break;
         }   // Fin del switch
   } // Fin del if
   
   else{
   is_up=0;
      
      switch (sc){
         
      case 0x12: //Shift Izquierdo
      shift=0;
      break;
   
      case 0x59: //Shift Derecho
      shift=0;
      break;
      }
   } // Fin del else
} // Fin de la SUBRUTINA DECODE