TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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:
-
Tendras la hoja de datos del modelo de tu lector??
Asi podremos ayudarte mas... :mrgreen:
-
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.
-
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.
-
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
-
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.
-
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?? :?
-
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??
-
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.
-
yo tengo el mismo problema.... yo cuento con un br-310 de bematech....!!! estoy con las mismas dudas! ayuda :(
-
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!
-
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!
-
y en el caso de que usase un 16f877 ? habria algun problema? :?
-
Ninguno! ;-)
-
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?
-
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 ;-)
-
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.
-
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
-
En que compilador?
-
mplab v8.30! :shock:
-
: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!
-
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 :)
-
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