Paso 4: Detectar cuando se pasa una tarjeta de
Formalmente, uno sería revisar el pin /CARD_PRESENT para ver si es caer bajo. Afortunadamente, esto no es realmente necesario. Lo comprobamos para tarjeta más adelante. Alternativamente, se podía leer el pin de strobe para ver cuando han puesto luces estroboscópicas en el pasador, sin embargo, esto será red mucha sincronización de cero. El lector enviará sobre 60-70 de cero a la izquierda para hacerle saber que los datos está a punto de ser presentado. Sin embargo, vamos a utilizar la naturaleza de los datos binarios para determinar cuándo iniciar la grabación de bits. Centinela Inicio (SS) para la pista uno es el signo de porcentaje (%). Es el valor binario es 0010 0101 que significa que será almacenado (y leer) como 1010 001 (es 7 bits por lo que no transmisión los 8 bits). Ahora, el lector astuto dará cuenta a pesar de los datos hacia atrás no coincide con el valor binario ASCII. Eso es porque es 0 x 20 en hexadecimal. El símbolo % es 0x25 y 0100 0101 es 0 x 05. Datos de la tarjeta tienen 0 x 20 restados del valor. Un colgado hacia fuera en el nibble alto es el bit de paridad impar. Se pone allí para que haya un número impar de "1" s en el valor. Porque sabemos que una tarjeta válida siempre comenzará con este centinela de inicio, y debido a que el bit de paridad es 1, entonces cuando detectamos el alto primera transición bajo en el pin de datos, entonces sabemos que apenas hemos empezado a recibir el centinela de arranque desde una tarjeta. Ahora, esto no siempre va a ser cierto, y sería un plan infalible comprobar la tarjeta /CARD_PRESENT para ver si ha ido baja además. La manera más simple para detectar el inicio de la SS, es crear una interrupción externa en el borde descendente de la mini-alarma. Los datos son 1.0 válido antes de la caída del borde, así que cuando se ha muestreado el flanco descendente, entonces usted sabe puede leer el pin de /DATA1 y obtener un valor válido. Aquí está el código para crear su interrupción externa en un flanco descendente.
En mi common.h que incluyo en todos mis programas, pueden encontrarse las definiciones de BSET y BCLR. Se refieren a ese archivo si usted tiene alguna pregunta acerca de cómo configurar bits. Ahora, cuando la interrupción se activa, queremos probar el /DATA1 (en mi código define como CARD_DATA) y un poco en un registro de E/S de propósito general. Si estamos en el bit 7, guardar apagado el registro como un carácter en el búfer global. Utilizar un registro de GPIOR0 porque es acceso rápido spiffy. El pseudo código es algo como esto:
Si usted está preguntando por qué disminuir en vez de incremento, recuerde que los datos son al revés, así que en vez de grabar los bits como consigamos de LSB a MSB, salvarlos de MSB a LSB por lo que no tenemos que invertir los bits más tarde cuando se procesan los datos. Si usted realmente quisiera, también podría agregar 0 x 20 hex aquí, pero ya que se trata de 5us sobre estas luces estroboscópicas, estoy manteniendo el procesamiento en esta rutina de servicio de interrupción al mínimo.