Autor Tema: Problema simulacion programa pulsadores-salidas 16f88  (Leído 2276 veces)

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

Desconectado sokoloko

  • PIC12
  • **
  • Mensajes: 77
Problema simulacion programa pulsadores-salidas 16f88
« en: 25 de Septiembre de 2010, 06:06:01 »
Hola!!

Llevo un par de dias volviendome loco con un programita que en teoria es una tonteria, lee 5 entradas y segun cual sea la primera en ser pulsada, la deja encendida. Con la interrupcion resetea el proceso, el algo tipo el BUZZ de la PLAY  :D

Pues no hay forma, yo pienso que el programa esta mas o menos bien, pero no soy capaz de simularlo, me falla en los delay y no me hace nada.

A ver si alguno es capaz de ver que falla por que yo ya estoy bloqueado. Adjunto programa y archivo de proteus.

Saludos y gracias.

Código: [Seleccionar]
// Control de pulsadores con PIC
// Puerto A como salida y B como entrada
// 5 pulsadores de entrada y 5 leds de salida
// Al pulsar un pulsador, se enciende las luces de forma ritmica para indicarlo (tipo KIT)
// A continuación se enciende la primera salida en ser pulsada
// La interrupcion se usa para resetear los pulsadores.


#include <16F88.H>
#fuses INTRC, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO, NOMCLR, NOBROWNOUT, CCPB3
#use delay(clock=8000000)
#use fast_io(B)
#use fast_io(A)
#byte port_A = 0x05 
#byte port_B = 0x06

int dt=0; //Valor que almacena la salida pulsada del 1 al 5
boolean bandera=false;  // bandera para que una vez pulsado un pulsador
                  // no se haga nada hasta que no se activa interrupcion.

// interrupcion por cambio de B0
#INT_EXT
void INTER (void){
    bandera = false;
   dt=0;
   port_A = 0b11111111; 
    delay_ms(2000);        //encendemos todas las luces 2 sg
   port_A = 0b00000000;    // Apagamos todas las luces               
}


//Funcion KIT

void Kit (void){        // Juego de luces para indicar que una entrada a sido pulsada.

   int i,cont=1; //variables definidas
   
   for(i=1;i<5;i++){ //led's a dcha
   port_A = cont;  //ilumino led correspondiente
    //output_A(cont);    Otra forma de hacerlo
   delay_ms(300);
   cont=cont*2;
   }
   
   for(i=1;i<5;i++){  // a izqda
    port_A = cont;  //ilumino led correspondiente
   //output_A(cont);
   delay_ms(300);
   cont=cont/2;
   }

}

void Entrada(void){        // Lee el puerto B y almacena la entrada en variable dt.
       switch (port_B){
            case  2: dt=1; break;
            case  4: dt=2; break;
            case  8: dt=3; break;
            case  16:dt=4; break;
            case  32:dt=5; break;
        }
}

void Salida(void){           //Enciende el led correspondiente a la entrada.

       switch (dt){
            case  1: {
            port_A = 0b00000001;
            bandera=true;
         } break;
            case  2: {
            port_A = 0b00000010;
            bandera=true;
         } break;
            case  3: {
            port_A = 0b00000100;     
            bandera=true;
         } break;
            case  4: {
            port_A = 0b00001000;
            bandera=true;
         } break;
            case  5: {
            port_A = 0b00010000;
            bandera=true;
         } break;
       }
 
}


void main(void) {                //Funcion principal del microprocesador.

    setup_counters(RTCC_INTERNAL,RTCC_DIV_1);// Activa el reloj interno.
    ext_int_edge(L_TO_H);                    // Se activa la interrupcion de B0 en el flanco de subida.
    enable_interrupts(GLOBAL);               // Permite interrupciones. 
    enable_interrupts(INT_EXT);              // Activa la interrupcion externa de B0.
    set_tris_A(0x00);                       // Puerto A como salida.
    set_tris_B(0xFF);                       // Puerto B como entrada. 
    port_A = 0b00000000;                    // Salidas todas a cero.

   while(TRUE) {                          // Bucle que se ejecuta siempre.
      while(bandera){                      // Si bandera esta en false ejecuta el bucle.
        Entrada();                   // Leemos las entradas
        Kit();                      // Indicamos que una entrada ha sido leida.
        Salida();                      // Mostramos la entrada                       
      }
   }
}


Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema simulacion programa pulsadores-salidas 16f88
« Respuesta #1 en: 25 de Septiembre de 2010, 11:13:47 »
Hola sokoloko, observando tu programa le veo varios errores de entrada.  Primero no has seteado el oscilador interno, que sería algo asi como: setup_oscillator(OSC_8MHZ);  Luego veo que estás usando la interrupción #INT_EXT para ver cambios en RB0 y según tu código deberías estar usando #INT_RB.  Para el uso de esta última te recomiendo estudiar muy bien el ejemplo que trae el CCS: EX_PBUTT.C.  
No es para nada recomendable poner delays dentro de una interrupción, sino mejor seteas la bandera que tienes allí y dentro del programa haces lo que corresponda al valor de la bandera.
También tienes una función atendiendo al valor de los pulsadores del puerto B.  Esto lo debe atender la rutina de interrupción (o por medio del valor de la bandera en la int).
Si veo algo más te cuento,

Saludos!
« Última modificación: 25 de Septiembre de 2010, 11:18:27 por bmb »

Desconectado sokoloko

  • PIC12
  • **
  • Mensajes: 77
Re: Problema simulacion programa pulsadores-salidas 16f88
« Respuesta #2 en: 25 de Septiembre de 2010, 15:24:54 »
Muchas gracias bmb,

Voy a seguir tus consejos y ya te cuento.

Saludos.

Desconectado sokoloko

  • PIC12
  • **
  • Mensajes: 77
Re: Problema simulacion programa pulsadores-salidas 16f88
« Respuesta #3 en: 30 de Septiembre de 2010, 18:29:40 »
Bueno,

Ya esta solucionado el problema. Todo es por esta linea:

Código: [Seleccionar]
    setup_counters(RTCC_INTERNAL,RTCC_DIV_1);// Activa el reloj interno.
Sin ella funciona la simulacion perfecta, y con ella se queda colgado en los delays.

Con eso y los consejos de bmb, ya me va a la perfeccion  :-/

Saludos.