Lector de códigos de barras PS/2 a rs232

Hola a todos los de el foro. MI duda radica en la manera correcta de tomar los datos que entrega un lector de códigos de barras PS/2. Estoy utilizando el pic 16f628A, se supone que debo monitirear la señal de clock y cuando se genere un flanco de bajada se tendría que atender una interrupción externa por el RB0 del pic pero esto NO está sucediendo. Si yo mismo doy un pulso bajo en este pin, el micro si entra en la rutina de interrupción externa pero con el lector de códigos esto no sucede. El lector está nuevo y funciona bien en un equipo que trabaja con este tipo de dispositivos pero con el micro no he sido capaz de lograr el objetivo. La idea es obtener los datos de un código de barras y poder convertirlo a RS232 para comunicarlo con un pc o visualizarlo en un LCD. Estoy utilizando las resistencias pull up en las señales de clock y data.
Si alguien tiene una sugerencia, talvez en el hardware que estoy utilizando o si tienen una rutina que trabaje correctamente, les quedaría muy agradecido. Estoy trabajando en Proton pero puedo utilizar CCS también.

De antemano mil gracias a todos los que me puedan dar una mano con esto.
 
Hola Meta y gracias por responder. el código que tengo es una modificación que hice a un programa publicado por Suky en el foro de ucontrol. En este programa, lo que hago al entrar a la rutina de interrupción externa por el RB0 es encender y apagar un pin del puerto B, con esto me aseguro que si se esté ejecutando la rutina. el código es el siguiente:

Código:
Device 16F628A    'el archivo de cabecera se encuentra en la carpeta de instalación proton-PDS-Inc
XTAL = 20
ALL_DIGITAL= true
On Interrupt GoTo leer   ' al trabajar con interrupciones es estrictamente necesario colocar Disable antes de
                            'la rutina de interrupción y colocar Enable despues de terminada dicha rutina
INTCON = %10010000  'interrupciones globales y en el RB0
OPTION_REG.6 = 1  ' bit INTEDEG para habilitar interrupcion por flanco de bajada
TRISA = %00000000
TRISB = %00000011
Dim todos_los_datos As Byte
Dim paridadystop As Byte
Dim paridad As Bit
Dim pare As Bit
Dim make_code As Byte
Dim break_code As Byte

Symbol clock = PORTB.0
Symbol datos = PORTB.1
PORTB.2 = 0
PORTB.3 = 0
PORTB.4 = 0
PORTB.5 = 0
PORTB.6 = 0
PORTB.7 = 0
PORTA.0 = 0
PORTA.1 = 0
DelayMS 500
'******LA SIGUIENTE RUTINA ES SIMPLEMENTE PARA VERIFICAR QUE EL MICRO INICIÓ 
'***********CORRECTAMENTE.
High PORTB.2
DelayMS 500
Low PORTB.2
DelayMS 500
High PORTB.2
DelayMS 500
Low PORTB.2
DelayMS 500
High PORTB.2
DelayMS 500
Low PORTB.2
DelayMS 1000
'**********TERMINA LA RUTINA DE VERIFICACI´N DE INICIO DE PROGRAMA
PORTB = %00000000     'limpio los puertos
PORTA = %00000000
make_code = 0        ' variable para empezar a ubicar cada número binario 
                     'del dato leido
denuevo:
    DelayMS 2
    PORTB.2 = make_code.7
    PORTB.3 = make_code.6
    PORTB.4 = make_code.5
    PORTB.5 = make_code.4
    PORTB.6 = make_code.3
    PORTB.7 = make_code.2
    PORTA.0 = make_code.1
    PORTA.1 = make_code.0
    PORTA.3 = pare
GoTo denuevo
End                                               
'**********************
'*****************EMPIEZA LA RUTINA DE LA INTERRUPCIÓN EXTERNA
'*************************************************************
Disable         'NO OLVIDAR COLOCAR ESTO CON LAS INTERRUPCIONES
leer:
    INTCON.7 = 0    'Deshabilita las interrupciones mientras se procesa el dato
    INTCON.1 = 0    'borra la bandera de interrupción externa
                 ' aunque estas dos lineas se pueden omitir gracias al Disable 
High PORTB.7        'este encendido y apagado de led es para verificar que 
DelayMS 500         ' el micro SI entró a la rutina de interrupción
Low PORTB.7
DelayMS 200
           '************acá empieza la recepción y procesamiento de datos
If datos = 0 Then

    For todos_los_datos = 0 To 7
        espero:
        If clock = 0 Then GoTo espero
        espero2:
        If clock = 1 Then GoTo espero2
        make_code.7 = datos
        If todos_los_datos < 7 Then
        make_code =  (make_code >> 1)
        EndIf
    Next todos_los_datos

    For paridadystop = 0 To 1
        espero3:
        If clock = 0 Then GoTo espero3
        espero4:
        If clock = 1 Then GoTo espero4
        If paridadystop = 0 Then paridad = datos
        If paridadystop = 1 Then pare = datos
    Next paridadystop
todos_los_datos = 0
paridadystop = 0
DelayMS 2
EndIf
Resume
Enable          'NO OLVIDAR COLOCAR ESTO CON LAS INTERRUPCIONES  

'********************TERMINA LA RUTINA DE INTERRUPCIÓN EXTERNA*************
Por ahora intento que con el lector, el micro atienda la interrupción del clock.
Posteriormente le prestaré atención a los datos recibidos cuando yo esté seguro que el micro SI los está recibiendo.

Gracias:apreton:
 
Última edición por un moderador:
Hola.
Como adición, supongo que ya conoces el protocolo PS/2... te deves de fijar como un dispositivo con puerto PS/2 establece comunicación con el Host que en este caso es el PIC. Revisa aquí, al final hay unos dibujos sobre las señales entre DEVICE y HOST. Modifica el código...
waveform3.jpg


Saludos
 
oye tienes las resistencias de pull up que van conectadas en el pin RB0 y en el de Data(el pin que estes ocupando para recibir la trama) esos pines deben ir aterrizados a positivo por medio de las resistencias

el ground , tierra o masa de la fuente que alimenta tu pic esta conectada con la de tu lector de barras?
 
Hola ByAxel, efectivamente en esta gráfica aparece se muestra como el clock en el flanco de bajada es quien se encarga de iniciar la recepción de data, pero el micro parece que no reconociera este flanco de bajada. Cuando coloco la punta de mi multímetro entre GND y clock mide 4,9 voltios y cuando oprimo el botón de lectura el valor medido es 4,6 voltios; se supone que el ciclo de trabajo (Duty) de la señal de clock es de 50 % según la figura, entonces al colocar el multímetro debería aparecer cerca de 2,5 voltios no de 4,6 voltios. No sé si estos dispositivos tienen un duty diferente o si las tensiones entre las que oscila esta señal no son entre 0 voltio y 5 voltios sino que talvez sean entre 4 y 5voltios, con lo cual el micro no es capaz de detectar el flanco de bajada pues este debe ser menor a 2 voltios para este micro.

Hola proteus7, si tengo conectadas las resistencias pull up en data y clock y las tierras de los dispositivos están unidas entre sí.
 
Coloca a OPTION_REG.6 = 0, interrupción por flanco descendente en RB0.
La comunicación es a unos Khz y dudo que el multímetro responda a esa velocidad... mejor seria un osciloscópio.
 
Atrás
Arriba