Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

14/12/2010 #1


Encendido de luz (semáforo) PIC16F88
Buenas aqui de nuevo veran estoy programando este PIC despues de varios años de no tocar uno como no recuerdo ensamblador pues decidi usar C por ello estoy usando el CCS ahora bien hasta ahora no e tenido un gran problema; ahora bien voy a explicar más o menos por ahora que hace este codigo
1) Al empezar todos los leds verdes estan encendidos (esto lo hace bien)
2) En este caso poseemos 3 casos donde al presionar por separado cada pulsador ocurre algo
-- Si se presiona P0 (entra un 1) el semaforo S2 pasa a rojo apagando el led verde de este se mantiene 5 seg asi y vuelve a verde
-- Si se presiona P1 (entra un 1) el semaforo S0 pasa a rojo apagando el led verde se mantiene por 5 segundos y vuelve a verde
-- si se presiona P2 (entra un 1) el semaforo S1 pasa a rojo apagando el led verde se mantiene por 5 seg y vuelve a verde

Hasta aqui el programa me esta sirviendo pero ahora entro en otro estado, que es cuando se presionan dos de los interruptores al mismo tiempo no se como asignar el codigo necesario para que tome que cuando por ejemplo se presionen P0 y P1 se pongan en rojo S2 y S1 (apagando sus leds verdesy manteniendo el led verde de S0) por 5 segundo para luego poner en rojo S0 yS2 (apagando sus leds verdes y encendiendo el led verde de S1) se mantiene por 5 seg y luego todos los semaforos se ponen en verde, si ven la ultima parte del codigo veran lo que puse aunque no se si eso servira, me gustaria saber si alguien me puede ayudar con el codigo para que interprete dos valores al mismo tiempo ya que al usar lo que estoy usando por alguna razon me hace todo pero un semaforo se mantiene apagado sus dos luces cuando no deberia ser asi.
No estoy seguro si me entendieron pero les dejo la tabla de estados por si no me entendieron bien.


Con que me digan cual codigo hace que lea las dos entradas juntas al mismo tiempo me vasta gracias de antemano y espero alguien me pueda ayudar


Código:
///semaforo 
//se poseen tres semaforos de dos lucez cada uno
//quienes son controlados por tres interruptores
//P0, P1, P2 son los pulsadores que actuan como "sensores"
//P0= RA0, P1=RA1, P2=RA2
//se asigno a semaforo S0 (RB1, RB2), S1 (Rb3, rb4) y a S2 (RB5, RB6)
// RB1, RB3, RB5 =leds rojos
//RB2, RB4, RB6 =leds verdes

#include <16F88.h>
#use delay (clock=1000000)
#fuses HS,NOWDT,NOPUT,NOPROTECT
#byte port_b=0x06 
 void main() {  
   set_tris_a(00111);
    set_tris_b(0x00); 
    disable_interrupts(GLOBAL);
  ///estado 3 semaforos en verde
   do{      
        output_low(PIN_B1);                  
        output_high(PIN_B2);
        output_low(PIN_B3);
        output_high(PIN_B4);
        output_low(PIN_B5);
        output_high(PIN_B6);
      
  ///fin del estado verde todos
  
  ///inicio control de los sensores
  ///P0, P1, P2
       
 //presionando P0    
   if (input(pin_a0)){  
      output_low(pin_b6);
      output_high(pin_b5);
      delay_ms(4500);
     }
   //presionando P1
      if (input (pin_a1)) {
     output_low(pin_b2);
     output_high(pin_b1);
     delay_ms(4500);
   }
// presionando P2
   if (input (pin_a2)) {
     output_low(pin_b4);
     output_high(pin_b3);
     delay_ms(4500);
   }
 
 ////caso dos activando dos pulsadores al mismo tiempo
 ///caso P0 P1 presionados
   if (input (pin_a0))
   if (input (pin_a1)){
     output_low(pin_b4);
     output_high(pin_b3);
     output_low(pin_b6);
     output_high(pin_b5);
     delay_ms(4500);
     
    
   }
   } while(true);//Bucle infinito
 }
14/12/2010 #2


que tal, apenas me iniciare con pic, ando armando un programador provisional para luego hacer el pickit2 clon, y ya tengo algunos tutos, pero lo que no se es precisamente lo de los compiladores, tengo que bajar MPLAB y luego CCS?

MPLAB se puede bajar de la pagina pero CCS es de paga no? quiero programa de la familia PIC18 en especial el 2550 que es con el que se hace el pickit2 , alguna recomendación?

por otro lado, solo recomendaria para el bucle infinito un for(; y un switch para decirdir cual luz se prende..

saludos buen aporte
14/12/2010 #3

Avatar de ByAxel

Con que me digan cual codigo hace que lea las dos entradas juntas al mismo tiempo me vasta gracias de antemano y espero alguien me pueda ayudar
Pon #use fast_io(a) e intenta enmascarando las entradas que quieres leer:
Código:
if((input_a() && 0x03) == 0x03){ // Revisa los pines RA0 y RA1
}

if((input_a() && 0x05) == 0x05){ // Revisa los pines RA0 y RA2
}
también se puede similar en un switch - case.

Veo que el PIC no hace nada por tiempos muy largos "delay_ms(4500);", se que no afecta pero para otras cosas toma en cuenta el debounce 'rebote' que provocan las partes mecánicas del pulsador.

saludos
14/12/2010 #4


ByAxel dijo: Ver Mensaje
Pon #use fast_io(a) e intenta enmascarando las entradas que quieres leer:
Código:
if((input_a() && 0x03) == 0x03){ // Revisa los pines RA0 y RA1
}

if((input_a() && 0x05) == 0x05){ // Revisa los pines RA0 y RA2
}
también se puede similar en un switch - case.

Veo que el PIC no hace nada por tiempos muy largos "delay_ms(4500);", se que no afecta pero para otras cosas toma en cuenta el debounce 'rebote' que provocan las partes mecánicas del pulsador.

saludos
gracias por tu respuesta, intentare con ello pero una pregunta en caso del rebote que tipo de cambios debo de colocar para evitarlo, curiosidad

-------------------------------------------------------------------------------------
Al colocar el #use fast_io(a), las entradas me cambian no es asi ahora la entrada A0 al pulsar el boton se mantiene en alto, eso es normal? si comparo ahora A0 con otra entrada este no hace sigue las instruciones pero mantiene las luces de S1 ambas apagadas....
14/12/2010 #5

Avatar de ByAxel

#use fast_io(x) hace que no se esté reescribiendo el TRISx cada vez que se consulta al puerto (reduce el código compilado), en este modo es necesario usar set_tris_X();, además este PIC comparte el módulo ADC con el PORTA y por defecto son entradas análogas... entonces debes de desactivar con:
Código:
setup_comparator(NC_NC_NC_NC);
SETUP_ADC_PORTS(NO_ANALOGS);
ya se que se tiene que escribir más, hazlo como más te guste... personalmente me gusta controlar todo del PIC y este PIC tiene varias cosas.

en caso del rebote que tipo de cambios debo de colocar para evitarlo, curiosidad
luego de consultar un pin se acostumbra poner un delay de 15ms o 20ms (varia en la práctica) para evitar falsos disparos y entre otros truquitos de acuerdo al proceso que se quiera hacer.

salu2.
14/12/2010 #6


Ok bueno veamos meti el codigo que me dices hice unos cambios y bueno siguo teniendo el mismo problema el codigo seria asi
Código:
///semaforo proyecto taller 2
//se poseen tres semaforos de dos lucez cada uno
//estos deben de poseer 

#include <16F88.h>
#use delay (clock=1000000)
#fuses HS,NOWDT,NOPUT,NOPROTECT
#byte port_b=0x06 
#use fast_io(a)

 void main() {  
  setup_comparator(NC_NC_NC_NC);
  SETUP_ADC_PORTS(NO_ANALOGS);
  set_tris_a(0xff);
    set_tris_b(0x00); 
    
    disable_interrupts(GLOBAL);
    
  ///estado 3 semaforos en verde
   do{      
        output_low(PIN_B1);                  
        output_high(PIN_B2);
        output_low(PIN_B3);
        output_high(PIN_B4);
        output_low(PIN_B5);
        output_high(PIN_B6);
      
  ///fin del estado verde todos
  
  ///inicio control de los sensores
  ///S0, S1, S2
       
     
   if (input(pin_a0)){  
      output_low(pin_b6);
      output_high(pin_b5);
      delay_ms(4500);
     }
   
      if (input (pin_a1)) {
     output_low(pin_b2);
     output_high(pin_b1);
     delay_ms(4500);
   }
   if (input (pin_a2)) {
     output_low(pin_b4);
     output_high(pin_b3);
     delay_ms(4500);
   }
 
 ////caso dos activando dos pulsadores al mismo tiempo
 ///caso S0 S1
   if((input_a() && 0x03) == 0x03){
    output_low(pin_b4);
     output_high(pin_b3);
     output_low(pin_b6);
     output_high(pin_b5);
     output_high(pin_b2);
     delay_ms(4500);
}
    
     
   
   } while(true);//Bucle infinito
 }
Ahora bien voy a poner el circuito con el que estoy simulado a ver si es que esta mal tambien dejo el .hex que me deja el CCS

Aprovechando una vez tenga el codigo lo meto en el PIC cualquier quemador de pics me sirve? y tambien aparte de los leds y interruptores debo colocarle algo más al circuito del pic una vez lo ponga en la protoboard?
Archivos Adjuntos
Tipo de Archivo: rar Semaforo.rar (13,4 KB (Kilobytes), 227 visitas)
14/12/2010 #7

Avatar de ByAxel

En la mayoría de microcontroladores es necesario poner una resistencia pull-up (V+) o pull-down (GND) al usar un pulsador para ofrecerle un nivel lógico adecuado. En tu circuito mientras no esté accionado el pulsador, el pin de entrada se mantiene en incertidumbre -en la practica se verá que el PIC se vuelve loco porque no sabe si es un '1' o '0' lógico-.

Un ejemplo:

- Mientras no esté accionado, el nivel lógico es '0'.
- Al pulsar, el nivel lógico es '1'.
- La resistencia va desde 1K a 47K.
Agrega algo así en tu circuito.

Aprovechando una vez tenga el codigo lo meto en el PIC cualquier quemador de pics me sirve?
Si, mientras el PIC que usas lo tenga en su lista de dispositivos soportados.
tambien aparte de los leds y interruptores debo colocarle algo más al circuito del pic una vez lo ponga en la protoboard?
- Un LED no debe ir directamente al pin, agrega una resistencia de unos 330 Ohm para cada led.
- Para cada pulsador agrega una resistencia de unos 10K conectado a GND.
- Hace falta un cristal de 1Mhz según tu configuración, eso es importante ya que este PIC soporta oscilador externo e interno... eso lo ves en la configuración de fuses y no te olvides que la frecuencia del oscilador debe ser la misma que usaste para compilar.
- Según tu configuración te hace falta una resistencia de 10K entre la pata del MCLR y V+.

PD: En la simulación se pueden evitar varias cosas (eso confunde al principiante), revisa otros post y el mismo datasheet del PIC para que te cerciores de su funcionamiento.

Me avisas como va.
salu2
Imágenes Adjuntas
Tipo de Archivo: jpg logicbutton.jpg (3,6 KB (Kilobytes), 430 visitas)
14/12/2010 #8


Veamos cristal puedo conseguir pero una cosa los capacitores que van a tierra de que valor me recomiendas que use? nunca e usado un cristal asi que no tengo idea de ello
-----------------------------------------------------------------------------------------------------------
A ver si coloco esta instrucción estoy configurando para que use el reloj interno a 1MZ para que no tenga que ponerle un cristal o no
Código:
setup_oscillator(OSC_1MHZ|OSC_INTRC);
14/12/2010 #9

Avatar de ByAxel

Si esta bien para usar el oscilador interno y también reemplaza
#FUSE HS... por #FUSE INTRC_IO...
14/12/2010 #10


Bueno por más que intento no logro hacer el estado de cuando dos pulsadores se presionen haga la instruccion, jajaja y como es para mañana la veo feo en todo caso seguire intentando a ver al usar
Código:
if((input_a() && 0x03) == 0x03){ // Revisa los pines RA0 y RA1
}

if((input_a() && 0x05) == 0x05){ // Revisa los pines RA0 y RA2
}
lo que estoy haciendo es comparar ambas entradas y si son iguales realiza la instruccion dentro de los corchetes no es asi, si coloco eso al presionar ambos botones o me sigue la instruccion de cuando presiono solo un boton o otro mejor dicho no compara ambos valores y no realiza la instrucción sera que algo esta mal?
14/12/2010 #11

Avatar de ByAxel

Que tal así...
- Entra si se cumple que PIN_A0 = 1 y PIN_A1 = 1...
Código:
if(input_state(PIN_A0) & input_state(PIN_A1)){

}
Lee las dos entradas en la misma instrucción IF... solo se cumple si ambos pulsadores en RA0 y RA1 están presionados.
14/12/2010 #12

Avatar de DanNeil

Buenas tardes amigos,

Estoy tratando de trabajar funciones lógicas (lógica combinacional) que imite la operación de las compuertas not, and, or,nor, etc.
este es uno que trabaja como AND de tres entradas:

#include <16f877a.h>
#use delay (clock=4000000)
#use standard_io(b)
#fuses XT,NOWDT,NOPROTECT



void main() {

set_tris_b(0x07);
disable_interrupts(GLOBAL);

do{

if (input (pin_b0)) // entrada 1
if (input (pin_b1)) // entrada 2
if (input(pin_b2)){ //entrada 3
output_high(pin_b3); //salida 1
output_high(pin_b4); //salida 2


}
} while(true);//bucle
}


No me gusta que una vez que pongo las tres en alto, me dejan las salidas en alto, así vuelva a bajar las entradas.

¿Qué hago para esto? que testee cada algo y si no cumple, que baje a 0 las salidas? ¿cómo lo haría?

¿cómo puedo hacer que una salida se active cuando una está en alto y la otra en bajo?

Puede ser, como una OR, pero como una OR exclusiva, o mejor, una que me permita condicionar cuál debe estar en bajo y cual en alto para enviar la salida a 1. Deseo trabajar con una lógica que me permita combinar estados bajos y altos, para activar salidas pero ese if ((!pin_bx) & 8pin_bx) & (pin_bx)), no me ha servido mucho, no sé que he omitido.

Es para realizar funciones lógicas e implementar esta lógica combinacional en µC.

Gracias
15/12/2010 #13


ByAxel dijo: Ver Mensaje
Que tal así...
- Entra si se cumple que PIN_A0 = 1 y PIN_A1 = 1...
Código:
if(input_state(PIN_A0) & input_state(PIN_A1)){

}
Lee las dos entradas en la misma instrucción IF... solo se cumple si ambos pulsadores en RA0 y RA1 están presionados.
Hola como vas veras cuando uso ese comando me esta apareciendo este error en el proteus tal vez sea esto lo que no deja trabajar las instrucciones



Bueno en realidad no entiendo que quiere decir el error, si alguien me pudiera ayudar con ello se lo agradeceria
15/12/2010 #14

Avatar de ByAxel

No se que versión uses pero esos mensajes no me aparecen; ahí te indican que un registro no está implementado en el modelo de simulación al igual que el registro OSCCON.

Adjunto con el que yo estaba probando y perdón con el código anterior que me falto un símbolo para
que se cumpla, seria &&:
Código:
input_state(PIN_A0) && input_state(PIN_A1)
--------------------------------------------------------
DanNeil, nunca va a suceder lo que buscas... un AND se cumple cuando todas son 1 pero nunca pones a cero las salidas al no cumplir, además te sugiero que sea algo así, solo para evitar el anidado de IF:

Código:
if(input(PIN_B0) && input(PIN_B1) && input(PIN_B2)){ // Todas a '1' para cumplir AND
   output_high(PIN_B3);
   output_high(PIN_B4);
}else{ // De lo contrario, todas las salidas a cero.
   output_low(PIN_B3);
   output_low(PIN_B4);
}
salu2
Archivos Adjuntos
Tipo de Archivo: rar code.rar (862 Bytes, 76 visitas)
15/12/2010 #15


ByAxel dijo: Ver Mensaje
No se que versión uses pero esos mensajes no me aparecen; ahí te indican que un registro no está implementado en el modelo de simulación al igual que el registro OSCCON.

Adjunto con el que yo estaba probando y perdón con el código anterior que me falto un símbolo para
que se cumpla, seria &&:
Código:
input_state(PIN_A0) && input_state(PIN_A1)
--------------------------------------------------------
DanNeil, nunca va a suceder lo que buscas... un AND se cumple cuando todas son 1 pero nunca pones a cero las salidas al no cumplir, además te sugiero que sea algo así, solo para evitar el anidado de IF:

Código:
if(input(PIN_B0) && input(PIN_B1) && input(PIN_B2)){ // Todas a '1' para cumplir AND
   output_high(PIN_B3);
   output_high(PIN_B4);
}else{ // De lo contrario, todas las salidas a cero.
   output_low(PIN_B3);
   output_low(PIN_B4);
}
salu2
Ok bueno con tu codigo me salen dos errores


tengo la version 7.2 si no me equivoco, bueno con tu codigo me salio mejor ahora si me sigue las instrucciones que le pongo cuando presiono ambos pulsadores sin embargo experimentando me fije de una cosa por ejemplo si coloco
Código:
else if(input_state(PIN_A0) && input_state(PIN_A1)){
  
   output_high (pin_b5);
   output_low (pin_b6);
   
   delay_ms(4500);
   
      }
me reconoce la instrucción y lo hace pero en este caso lo que estoy haciendo es prender el led en B5 y apagar el de B6 si lo coloco asi apaga B6 pero no prende el B5 al ponerlo alrevez primero que apague B6 y luego prenda B5 si lo hace bien, ok por ese lado estoy bien sin embargo al meterle dentro que apague B4 y encienda B3 mejor dicho

Código:
else if(input_state(PIN_A0) && input_state(PIN_A1)){
   output_low (pin_b6);
   output_high (pin_b5);
   output_high (pin_b3);
   output_low (pin_b4);
Me apaga B6 y B4 pero no prende B5 y B6. Pero si quito las dos primera lineas y dejo las otras dos si lo hace lo mismo al revez pero al juntarlas no prende B5 y B6
Mi version del proteus es la 7.2 si no me equivoco
15/12/2010 #16

Avatar de ByAxel

jeje raro... yo uso el 7.7 Sp2. intenta manipulando todo el puerto, es decir:
Código:
output_b(0b00101010); // Por ejemplo, cada vez que entre a un IF.
15/12/2010 #17


A ver por ejemplo en el caso de anterior coloque

Código:
else if(input_state(PIN_A0) && input_state(PIN_A1)){
   output_b(0b00110100);
   delay_ms(4500);
      }
Algo asi seria o estoy leyendo al revez?

----------------------------------------------------------------------------------------
Ok lo estaba leyendo al revez XD pero me funciono gracias por la ayuda con ese codigo si me funciono, solo una pregunta más en el caso de el que los tres se presionan se puede colocar un segundo && para comparar las tres verdad
16/12/2010 #18


Bueno ahora esta listo el codigo lo dejo aqui para ver que tal lo ven
Código:
#include <16F88.h>
#device *=16
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=1000000)
#use fast_io(a)
#use fast_io(b)

void main()
{
   setup_oscillator(OSC_1MHZ|OSC_INTRC);
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_a(0x07);
   set_tris_b(0x00);
   output_b(0);
   
   do{
 ///Estado inicial todas las lucez en verde  
      output_low(PIN_B1);                  
      output_high(PIN_B2);
      output_low(PIN_B3);
      output_high(PIN_B4);
      output_low(PIN_B5);
      output_high(PIN_B6);
   
      if(input_state(PIN_A0)){
         output_low(PIN_B6);
         output_high(PIN_B5);
         delay_ms(4500);
      }
      
      else if(input_state(PIN_A1)){
         output_low(PIN_B2);
         output_high(PIN_B1);
         delay_ms(4500);
      }
      
      else if(input_state(PIN_A2)){
         output_low(pin_b4);
         output_high(pin_b3);
         delay_ms(4500);
      }
   ///Cuando se presionan dos botones a la vez
   
   //Cuando se presiona P0 y P1
      else if(input_state(PIN_A0) && input_state(PIN_A1)){
   output_b(0b00101100);
   delay_ms(4500);
   output_b(0b01001010);
   delay_ms(4500);
      }
    /// cuando se presiona P0 y P2
    else if(input_state(PIN_A0) && input_state(PIN_A2)){
    output_b(0b00101100);
    delay_ms(4500);
    output_b(0b01001010);
    delay_ms(4500);
     }
    // Cuando se presiona P1 y P2
     else if(input_state(PIN_A1) && input_state(PIN_A2)){
     output_b(0b00110010);
     delay_ms(4500);
     output_b(0b01010010);
     delay_ms(4500);
     }
     else if(input_state(PIN_A1) && input_state(PIN_A2)&& input_state(PIN_A0)){
     output_b(0b00101100);
     delay_ms(4500);
     output_b(0b00110010);
     delay_ms(4500);
     output_b(01001010);
     delay_ms(4500);
     
    } 
   }while(TRUE);
}
Muchas gracias a Byaxel por toda tu ayuda, si no te molesta que te moleste una ultima vez me podrias decir una cosa veras es que cuando presiono más de un boton si sigue la instruccion pero le cuesta ver ambas entradas hay veces en que no las ve y solo ve una pero si se presionan exactamente igual pues si lo hace no se eso me imagino que es algo del retardo asi que me gustaria saber si se te ocurre algo para solucionarlo, ya el circuito esta bien asi de hecho asi lo voy a entregar pero me gustaria saber de alguna forma si es que la sabes, gracias de nuevo por toda tu ayuda, saludos
16/12/2010 #19

Avatar de ByAxel

De echo si no fuera por los retardos seria casi imposible de usar las combinaciones de 2 o más teclas...
Se me ocurre dos formas pero tendrías que cambiar la lógica de tu programa...
1) - En un solo IF, se ejecuta si cualquiera de las 3 entradas se activa.
- Lee todo el PORTA, enmascara los 3 bits (pulsadores) y lo guarda en una variable.
- Delay de unos 100ms
- Vuelve a leer el PORTA, enmascara 3 bits y el valor lo compara con la variable, entonces.
- Si es igual usa el valor en un Switch-Case para decidir que evento va a realizar y si es distinto, repite
el proceso desde delay 100ms.

Con eso me refiero a que el PIC debe estar seguro de lo que a obtenido al leer las entradas además pongo 100ms para que la señal de los pulsadores se estabilicen y junto con eso hay suficiente tiempo para que se pueda manipular 2 o más pulsadores.

Lo analizas:
Código:
do{
   
      if(input_state(PIN_A0) || input_state(PIN_A1) || input_state(PIN_A2)){
         tecla = input_a() & 0x07;
         delay_ms(100);
         if(tecla == (input_a() & 0x07)){
            switch(tecla){
               case 0b001:
                  output_b(0); break;
               case 0b010:
                  output_b(0); break;
               case 0b100:
                  output_b(0); break;
               case 0b011:
                  output_b(0); break;
            }
         }
      }
      
   }while(TRUE);
2) Similar al (1) pero verificando cada entrada individualmente con IF anidados, retardos de 100ms para luego voler a verificar la misma entrada y revisar si otra esta activa al mismo tiempo... creo que esto es mucho proceso.

salu2
16/12/2010 #20


ByAxel dijo: Ver Mensaje
De echo si no fuera por los retardos seria casi imposible de usar las combinaciones de 2 o más teclas...
Se me ocurre dos formas pero tendrías que cambiar la lógica de tu programa...
1) - En un solo IF, se ejecuta si cualquiera de las 3 entradas se activa.
- Lee todo el PORTA, enmascara los 3 bits (pulsadores) y lo guarda en una variable.
- Delay de unos 100ms
- Vuelve a leer el PORTA, enmascara 3 bits y el valor lo compara con la variable, entonces.
- Si es igual usa el valor en un Switch-Case para decidir que evento va a realizar y si es distinto, repite
el proceso desde delay 100ms.

Con eso me refiero a que el PIC debe estar seguro de lo que a obtenido al leer las entradas además pongo 100ms para que la señal de los pulsadores se estabilicen y junto con eso hay suficiente tiempo para que se pueda manipular 2 o más pulsadores.

Lo analizas:
Código:
do{
   
      if(input_state(PIN_A0) || input_state(PIN_A1) || input_state(PIN_A2)){
         tecla = input_a() & 0x07;
         delay_ms(100);
         if(tecla == (input_a() & 0x07)){
            switch(tecla){
               case 0b001:
                  output_b(0); break;
               case 0b010:
                  output_b(0); break;
               case 0b100:
                  output_b(0); break;
               case 0b011:
                  output_b(0); break;
            }
         }
      }
      
   }while(TRUE);
2) Similar al (1) pero verificando cada entrada individualmente con IF anidados, retardos de 100ms para luego voler a verificar la misma entrada y revisar si otra esta activa al mismo tiempo... creo que esto es mucho proceso.

salu2
Uhmm veamos si creo que funcionara aunque la verdad es que lo voy a dejar asi luego cuando lo halla entregado lo ire mejorando para que funcione mejor por ahora cumple lo que me piden asi que espero que el profesor no sea muy estricto con ello, de todos modos al parecer soy el unico que lo voy a entregar, gracias por tu ayuda, saludos
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.