ImagenImagenImagenImagen
Hazte Socio (El Foro siempre Gratis)
Paga con Tarjetas+ Info www.arde.cc/socios

interrupciones en CCS (otra vez)

Postea aqui toda la parte de programación del lenguaje C, C++, C#...

Moderador: Junta Directiva

Responder
Avatar de Usuario
vcs
Forero Habitual
Forero Habitual
Mensajes: 114
Registrado: Jue Feb 22, 2007 3:09 pm

interrupciones en CCS (otra vez)

Mensaje por vcs » Sab Mar 06, 2010 2:03 pm

Buenas a todos.

Estoy probando de nuevo las interrupciones en CCS porque las programillas que he hecho hasta ahora no terminan de ir nunca bien cuando las uso.

Tengo un Prog que lo que hace es a la activacion de la entrada externa (Rb0) incrementa un contados, y cuando activo la entrada RC0 lo que hago es un bucle donde enciendo 3 led las veces que se haya incrementado el contador, es decir que si activo dos veces la entrada Rb0 al activar la Rc0 los led parpadean 2 veces.

Esto funciona bien hasta que durante los parpadeos de los led vuelvo activar la interrupcion, lo que hago en el buecle del encedido de los led es desactivar las interrupciones, y esto funciona bien, el tema es que al salir del bucle y activar las interrupciones el programa salta automaticamenta a la interrupcion y incrementa el contador, es decir, que aunque la interrupcion está deshabilitada cuando se activa la entrada de la interrupcion parece que el bit de interrupcion se activa, pero al estar deshabilitadas las interrupciones no se produce el salto, pero luego al activar la interrupcion de nuevo me da la impresion que el CCS no limpia los bit y por tanto al estar activo de antes hace el salto, la pregunta es ¿como limpio el flag de la interrupcion externa en CCS? lo que quiero hacer es antes de activar la interrupcion limpiar el bit de interrupcion y eso deberia de solucionar el problema ¿no?


Pongo el codigo, aunque este no creo sea el problema, sino lo que he comentado, que el CCS no limpia el flag de la interrupcion antes de habilitar el salto.

Código: Seleccionar todo


#int_ext
VOID imanes()                    //------INTERRUPCION 2 NIVELACION -------------
{  disable_interrupts(GLOBAL);
   iman=PORTB;
   piso_actual=piso_actual+1;
   //delay_ms(500);
   enable_interrupts(GLOBAL);
}


void main(void)                   // Comienzo de programa, void quiere decir que no se obtendrá ningun valor de esta funcion
{  disable_interrupts(GLOBAL);    // deshabilitamos las interrupciones por seguridad
                                 //--------------------------------------------
                                  // CONFIGURAMOS LOS PUERTOS
                                  // CERO=salida, UNO=Entrada
   set_tris_a(0b011111);          // 6 E/S Puerto a definido como Entrada menos el A5.
   set_tris_b(0b11111011);        // 8 E/S Puerto b definido como Entrada menos b2
   set_tris_c(0b00000001);        // 8 E/S Puerto c definido como salida menos c0
   set_tris_d(0b00011111);        // 8 E/S D0,D1,D2,D3,D4 definido como entrada, D5,D6,D7 definido como salida
   set_tris_e(0b100);             // 3 E/S E0, E1 definido como Salidas y E2 como entrada

   PORTA=0;
   PORTB=0;
   PORTD=0;
   PORTE=0;
   PORTC=0;


      //disable_interrupts(int_rb);
      enable_interrupts(int_ext);
      enable_interrupts(GLOBAL);
      //delay_ms(1000);


   do
   {
      if (input(pin_c0)==0)
         {  //while (input(pin_b6))
            //{}
            if (puertoa|=0b100000)
               {  puertoa=0b100000;
                  PORTA=puertoa;
               }
         }
      else
         {  puertoa=0;
            PORTA=0;
            if (piso_actual|=0)
            {  for (indice=1;indice<=piso_actual;indice++)
               {  //delay_ms(1000);
                  puertod=0b11100000;
                  disable_interrupts(int_ext);
                  disable_interrupts(Global);
                  PORTD=puertod;
                  //delay_ms(1000);
                  puertod=0b00000000;
                  PORTD=puertod;
               }
               piso_actual=0;
               //delay_ms(100);
               enable_interrupts(int_ext);
               enable_interrupts(Global);

            }

         }
//ra5 salida
      //delay_ms(2000);
   }WHILE(TRUE);              // Esta es la condicion para repetir el bucle,
}                             // Fin



Avatar de Usuario
vcs
Forero Habitual
Forero Habitual
Mensajes: 114
Registrado: Jue Feb 22, 2007 3:09 pm

Re: interrupciones en CCS (otra vez)

Mensaje por vcs » Dom Mar 07, 2010 3:38 am

bueno, al final ha sido facil, solo he tenido que definir el Flag y luego operar con el por programa

#byte INTCON=0x0B //esta no hace falta pero asi tengo otra forma de acceder usando el canal entero
#bit INTF=0X0B.1


...

INTF=0;

Lo he probado y funciona perfectamente, asi que CONFIRMO que el CCS se comporta de la forma que he comentado anteriormente.

Salu2

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado