Autor Tema: Como conectar un lector de codigo de barras con interfaz PS-2 con pic  (Leído 14068 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
« Respuesta #15 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  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
« Respuesta #16 en: 14 de Septiembre de 2009, 06:54:57 »
Este pequeño experimento que hice con el Teclado PS/2 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.  
« Última modificación: 14 de Septiembre de 2009, 07:01:17 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado vargas10perez

  • PIC10
  • *
  • Mensajes: 7
Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
« Respuesta #17 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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
« Respuesta #18 en: 15 de Septiembre de 2009, 18:59:00 »
En que compilador?
No contesto mensajes privados, las consultas en el foro

Desconectado vargas10perez

  • PIC10
  • *
  • Mensajes: 7
Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
« Respuesta #19 en: 15 de Septiembre de 2009, 20:26:00 »
mplab v8.30! :shock:

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
« Respuesta #20 en: 15 de Septiembre de 2009, 20:35:51 »
 :D Aquí hay un tutorial de C18 donde muestra como trabajar las interrupciones.  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado vargas10perez

  • PIC10
  • *
  • Mensajes: 7
Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
« Respuesta #21 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 :)

Desconectado vargas10perez

  • PIC10
  • *
  • Mensajes: 7
Re: Como conectar un lector de codigo de barras con interfaz PS-2 con pic
« Respuesta #22 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