Como trabaja es algo sencillo, bueno empecemos con la función main, hay se utilizan ext_int_edge(H_TO_L); dicha función determina el flanco de activación de la interrupción externa. El flanco puede ser de subida (L_TO_H) o de bajada (H_TO_L).Después vemos estas dos funciones enable_interrupts(INT_EXT); y enable_interrupts(GLOBAL); estas dos activa la interrupción del nivel dado en el argumento. Después de esto se debe definir un procedimiento o rutina de atención, para el caso que se produzca la interrupción indicada. El nivel GLOBAL permite todas las interrupciones que estén habilitadas de forma individual. Bien ahora cuando ocurre una interrupción en el PIN_B0 del microcontrolador, esta no biene sola, biene con un tren de 11 pulsos que el teclado manda en forma serial (clock), esta señal de reloj biene sincronizada con los datos de la tecla en el PIN_B7 presionada, (ver
http://conket.com/modules.php?name=Sections&op=viewarticle&artid=39 ) en esa dirección esta una explicación muy completa de como funciona el teclado.
Ahora bien lo referente a la rutina de interrupción, voy a describir con un ejemplo como funciona, pero antes de esto al inicio del programa se puede observar 2 arrays de 2 dimensiones cada uno, el primero es la decodificación de los caracteres sin tener la tecla shift activada, y el segundo array es teniendo la tecla shift activada (ejemplo de ello es cuando tecleamos el numero 9, el valor que manda el teclado por la linea data en forma serial seria 0x0d, obviamente ese valor es el que nosotros vamos a decodificar a traves de la rutina de interrupción); bien ahora vamos con el ejemplo que describe la rutina:
#int_ext
void int_ext_isr(void)
{
if(bitcount < 11 && bitcount > 2)
{
data = (data >> 1); // Desplazamiento a la derecha
if( input(PIN_B7) == 1)
data = data | 0x80; // Una OR de bits
}
if(--bitcount == 0)
{
decode(data);
data = 0;
bitcount = 11;
}
}
Interrupciones 9 8 7 6 5 4 3 2 que corresponden a 0 0 0 0 1 1 0 1 respectivamente. Vamos a retomar el ejemplo para decodificar el numero 9 del teclado, (0x0d -->00001101)
Al inicio del programa especifique int bitcount=11; por la sencilla razón de que el teclado genera 11 pulsos en la señal de reloj que con lleva la señal de datos lo siguiente:
DATA= (bit de inicio)+(8 bits de datos)+(bit de paridad)+(bit de stop), a nosotros solo nos interesa los 8 bits de datos es por eso que se pone la condición if(bitcount < 11 && bitcount >2).
Para la primera interrupción como bitcount=11 no entra en la primer condicion y en la segunda tampoco solo la disminuye a bitcount=10. Para la segunda interrupción si entra en la primera condición quedando data = 10000000, y en la segunda tampoco solo la disminuye a bitcount=9. Para la tercera interrupción si entra en la primera condición quedando data = 01000000 y en la segunda tampoco solo la disminuye a bitcount=8. Para la cuarta interrupción si entra en la primera condición quedando data = 10100000 y en la segunda tampoco solo la disminuye a bitcount=7. Para la quinta interrupción si entra en la primera condición quedando data = 11010000 y en la segunda tampoco solo la disminuye a bitcount=6. Para la sexta interrupción si entra en la primera condición quedando data = 01101000 y en la segunda tampoco solo la disminuye a bitcount=5. Para la septima interrupción si entra en la primera condición quedando data = 00110100 y en la segunda tampoco solo la disminuye a bitcount=4. Para la octava interrupción si entra en la primera condición quedando data = 00011010 y en la segunda tampoco solo la disminuye a bitcount=3. Para la novena interrupción si entra en la primera condición quedando data = 00001101 y en la segunda tampoco solo la disminuye a bitcount=2. Para la decima interrupción no entra en la primera condición quedando igual data = 00001101 y en la segunda si entra. Aqui como podemos observar obtenemos el numero 00001101 --> 0x0d, el cual pasa como argumento a la función decode.
Ahora bien la función decode simplemente lo que hace es encontrar el numero asociado al 0x0d, es decir encontrar el 9 e imprimirlo en una hyperterminal, cabe mensionar que en la parte
else
{
//-------- No se permiten 2 0xF0 en una fila
is_up = 0;
switch (sc)
{
//-------- SHIFT Izquierdo
case 0x12 :
shift = 0;
break;
//-------- SHIFT Derecho
case 0x59 :
shift = 0;
break;
}
}
Se utiliza para eliminar un código “break” ($F0) que es transmitido seguido por el “scan code” de la tecla. Por ejemplo cuando presionamos el digito nueve de nuestro teclado, despues de recibir las 11 interrupciones recibimos el dato F0 que nos indica que terminamos de teclear el digito 9, y ese dato lo tenemos que despresiar.
Bueno eso seria un explicación en forma general, espero sugerencias y correcciones
.
Que tengan un buen dia...