Autor Tema: interrupcion  (Leído 1391 veces)

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

Desconectado championx

  • PIC10
  • *
  • Mensajes: 22
interrupcion
« en: 15 de Diciembre de 2005, 22:34:00 »
que tal amigos, tengo una duda, cuando yo declaro un pin como interrupcion externa, este recibe un cambio de flanco y se activa la rutina de interrupcion, hasta ahi todo bien, pero lo que quiero hacer es: con esta rutina quiero  leer el codigo que ingresa por el mismo pin de la interrupcion, se puede?


gracias
el micro es el 16f628

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
RE: interrupcion
« Respuesta #1 en: 16 de Diciembre de 2005, 01:09:00 »
Hola no se en que lenguaje de programación lo estes haciendo, yo modifique un ejemplo que utilizaba una interrupción externa para decodificar un teclado ps/2, y si puedes obtener información a traves de ese pin por medio de la interrupción. Tienes que identificar el flanco del pin al cual se va activar.
Aqui te dejo el codigo para que te des una idea.

#include "18f452.h"
#fuses HS, NOWDT,NOPROTECT, PUT, BROWNOUT, NOLVP
#use Delay(Clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <bootloader.h>

int bitcount=11;
int data=0;

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
};

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
};

void decode(unsigned char sc);

#int_ext
void int_ext_isr(void)
{
   if(bitcount < 11 && bitcount > 2)
   {
        data = (data >> 1);
        if( input(PIN_B7) == 1)
          data = data | 0x80;
   }
   if(--bitcount == 0)
   {
        decode(data);
        data = 0;
        bitcount = 11;
   }
}

void main(void)
{
   set_tris_b(0xff);
   ext_int_edge(H_TO_L);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   while(1)
   {
   }
}

void decode(unsigned char sc)
{
   static unsigned char is_up=0, shift = 0;
   int i=0;                              

   if (!is_up)
      {
         switch (sc)
            {
            //-------- Identificador de Up-Key
               case 0xF0 :
                  is_up = 1;
                  break;
               //-------- SHIFT Izquierdo
               case 0x12 :
                  shift = 1;
                  break;
               //-------- SHIFT Derecho
               case 0x59 :
                  shift = 1;
                  break;
               //-------- ENTER
               case 0x5A :
                  printf("
"Giño;
                  break;
               default:
                  if(!shift)
                     {
                        for(i = 0; i<=68; i++)
                        {
                           if (unshifted[0] == sc)
                           {
                              printf("%c", unshifted[1]);
                           }
                        }
                     }
                  else
                    {
                        for(i = 0; i<=68; i++)
                        {
                           if (shifted[0] == sc)
                           {
                               printf("%c", shifted[1]);
                           }
                        }
                     }
                 break;
            }
     }
     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;
            }
         }
}

Aqui te dejo la dirección para que cheques como trabaja dicha interface:
http://conket.com/modules.php?name=Sections&op=viewarticle&artid=39
Microcarsil

Desconectado omibaya

  • PIC12
  • **
  • Mensajes: 57
RE: interrupcion
« Respuesta #2 en: 16 de Diciembre de 2005, 09:25:00 »
Una preguntita, puedes explicarnos para que sirve ese programa, ya que me parece interesante, pero necesito una expication amigo

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
RE: interrupcion
« Respuesta #3 en: 16 de Diciembre de 2005, 13:16:00 »
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 Muchas risas .

Que tengan un buen dia...

Microcarsil


 

anything