En tu caso particular con los datos que presentas lo más seguro es que sí.
La tarjeta pinguino que mencionas viene con un cristal de 20 MHz según aparece en la página siguiente:
http://wiki.pinguino.cc/index.php/PIC18F2550_PinguinoA esa velocidad de reloj añádele que el procedimiento es sumamente corto. En ensamblador y enfocándonos sólo al procedimiento de lectura, éste sería algo como lo siguiente:
PLSDAT es el valor posicional del bit por el que llega la señal de pulsos.
Se definen dos registros. Un contador para que lleve el conteo de los pulsos de la rueda llamado PLSCNT y otro IMAGEN que será el que retendrá los datos a ser mostrados.
Nota: no puedes utilizar directamente PLSCNT ya que los datos estarían cambiando en todo momento haciéndolo ilegible.
El procedimiento inicia esperando al flanco BAJO-ALTO de la señal de entrada. Cuando lo detecta brinca a incrementar el contador PLSCNT y luego esperar al flanco ALTO-BAJO para evitar contar de más. Finalmente regresa a repetir el ciclo.
; Read command.
NEWCYC MOVF PORTB, W ; Lee el puerto B. (1)
ANDWF PLSDAT, F ; Deja sólo el bit PLSDAT. (1)
BTFSC STATUS, Z ; Verifica si el bit es cero. (3)
GOTO NEWCYC ; Sí es cero. Entonces vuelve a seguir leyendo el puerto. (2)
INCF PLSCNT, F ; No fué cero, entonces incremente el contador. (1)
WAIT MOVF PORTB, W ; Lea de nuevo el puerto B. (1)
ANDWF PLSDAT, F ; Deja sólo el bit PLSDAT. (1)
BTFSS STATUS, Z ; Vefifica si sigue siendo uno. (3)
GOTO WAIT ; Vuelva a seguir leyendo el puerto B esperando el flanco ALTO-BAJO. (2)
GOTO NEWCYC ; Vuelva a seguir leyendo el puerto. (2)
Los números en paréntesis son los ciclos de reloj que toma la instrucción para ejecutarse. El número de ciclos que toma como mínimo el procedimiento es 13 que con un reloj de 20MHz/4 por la división interna del controlador nos deja que el lazo se ejecuta 384615 veces por segundo. Un poco más que los 1500 pulsos por segundo que indicas (disculpa la mala broma).
Para definir la ventana de 1 segundo necesitas programar uno de los módulos timer seguramente utilizando el prescaler y accionándolo desde el reloj interno.
Una manera para actualizar el valor de IMAGEN que es el registro que nos interesa sería programando el timer antes de iniciar el procedimiento NEWCYC e insertar los pasos necesarios para leer el timer durante el subprocedimiento WAIT (método llamado polling). En este caso si el timer no ha terminado simplemente regresa a NEWCYC. Pero si el timer terminó entoces copia los datos de PLSCNT a IMAGEN, restablece a cero PLSCNT y brinca al paso anterior a NEWCYC donde se vuelve a reprogramar al timer.
Esto debiera funcionar bien. Sin embargo si quieres mayor precisión deberás utilizar el timer para generar una interrupción y ejecutar las funciones definidas arriba.
Para que no tengas que estar probando esto directamente en el coche puedes armar un pequeño oscilador con un circuito integrado timer 555. Hay mucho de ello en internet. Sólo calcula los valores para un ciclo de trabajo lo más bajo posible a una frecuencia de 1500 Hz.
Inicia con esto y manténte en contacto.
Suerte.