Multiplexer con el pic 18f4550 , no lo hace.

mientras estoy simulando el programa en proteus el led(salida) solo se queda parpadeando intermitentemente
no encuentro la forma para que al hacer los cambios de S1 y S2 solo deje pasar una de las cuatro entradas a la salida
aqui esta mi codigo

Código:
#include C:\\Users\\abrah\\Documents\\Universidad\\demi.h

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

* *
* *#FUSES INTRC_IO //Oscilador Interno y tanto RA6 como RA7 son I/O 
#FUSES NOWDT //Watch Dog Timer apagado 
#FUSES PUT //Power Up Timer activado 
#FUSES NOBROWNOUT //Reset ante variaciones de VCC desactivado 
#FUSES NOIESO //Switch del oscilador en el encendido apagado 
#FUSES NOFCMEN //detector de falla del oscilador principal apagado 
#FUSES NOSTVREN //reset por desborde del stack desactivado 
#FUSES NOLVP //Programación en baja tensión desactivada 
#FUSES NOPROTECT //Protección contra lectura de la FLASH desactivada 
#FUSES NOCPD //Protección de la EEPROM desactivada 

#define A PIN_A0//set the pins 
#define B PIN_A1 
#define C PIN_A2 
#define D PIN_A3 
#define S1 PIN_B0 
#define S2 PIN_B1 
#define LD1 PIN_C2

int Sw1=0;//it states that Sw1 is 0 in the begining 
int Sw2=0; 
*

void main() 
{ 

Sw1=input (S1);//Sw1 is an input 
Sw2=input (S2); 


while(true) 
{ 
{
if ((Sw1==0)&(Sw2==0))//if port b5, b6 and a0 is 0 
output_bit (PIN_A0,1);//led turns on 
}

{
*if(input(PIN_A0)==1)//if input a0 (switch) is 1 
output_toggle(PIN_C2);//output d2 led turns off 
}


*
{ 
{
if ((Sw1==1)&(Sw2==0)) 
output_bit (PIN_A1,1); 
}
{
*if (input(PIN_A1)==1)
output_toggle(PIN_C2); 
} 
*
{ 

{
if ((Sw1==0)&(Sw2==1)) 
output_bit (PIN_A2,1); 
}
{
*if (input(PIN_A2)==1) 
output_toggle(PIN_C2); 
} 

{ 

{
if ((Sw1==1)&(Sw2==1)) 
output_bit (PIN_A3,1); 
}
{
*if (input(PIN_A3)==1) 
output_toggle(PIN_C2); 
* * 
} 
*
} 

}
}
}
} ...
 
Última edición por un moderador:
En la primer línea de tu código hay una llamada a una sub-rutina que está en TU
disco rígido.

Código dijo:
#include C:\\Users\\abrah\\Documents\\Universidad\\demi.h

O nos das acceso a tu disco o publicas esa sub-rutina. ;)
 
Última edición:
Sino pongo esa sub-rutina mi programa no funciona, porque??

#include <18F4550.h>


#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

* *
* *#FUSES INTRC_IO //Oscilador Interno y tanto RA6 como RA7 son I/O
#FUSES NOWDT //Watch Dog Timer apagado
#FUSES PUT //Power Up Timer activado
#FUSES NOBROWNOUT //Reset ante variaciones de VCC desactivado
#FUSES NOIESO //Switch del oscilador en el encendido apagado
#FUSES NOFCMEN //detector de falla del oscilador principal apagado
#FUSES NOSTVREN //reset por desborde del stack desactivado
#FUSES NOLVP //Programación en baja tensión desactivada
#FUSES NOPROTECT //Protección contra lectura de la FLASH desactivada
#FUSES NOCPD //Protección de la EEPROM desactivada

#define A PIN_A0//set the pins
#define B PIN_A1
#define C PIN_A2
#define D PIN_A3
#define S1 PIN_B0
#define S2 PIN_B1
#define LD1 PIN_C2

int Sw1=0;//it states that Sw1 is 0 in the begining
int Sw2=0;
*

void main()
{

Sw1=input (S1);//Sw1 is an input
Sw2=input (S2);


while(true)
{
{
if ((Sw1==0)&(Sw2==0))//if port b5, b6 and a0 is 0
output_bit (PIN_A0,1);//led turns on
}

{
*if(input(PIN_A0)==1)//if input a0 (switch) is 1
output_toggle(PIN_C2);//output d2 led turns off
}


*
{
{
if ((Sw1==1)&(Sw2==0))
output_bit (PIN_A1,1);
}
{
*if (input(PIN_A1)==1)
output_toggle(PIN_C2);
}
*
{

{
if ((Sw1==0)&(Sw2==1))
output_bit (PIN_A2,1);
}
{
*if (input(PIN_A2)==1)
output_toggle(PIN_C2);
}

{

{
if ((Sw1==1)&(Sw2==1))
output_bit (PIN_A3,1);
}
{
*if (input(PIN_A3)==1)
output_toggle(PIN_C2);
* *
}
*
}

}
}
}
}
 
Todos esos asteriscos y corchetes sin sentido, deben ser el problema, entre otros que puedan ocurrir durante la ejecución de sentencias.

Lo correcto debería ser así:
PHP:
void main (void) 
{ 
    Sw1 = input (S1);    //Sw1 is an input 
    Sw2 = input (S2); 

    while (TRUE) 
    { 
        if ((Sw1 == 0) & (Sw2 == 0))    // if port b5, b6 and a0 is 0 
            output_bit (PIN_A0, 1);        // led turns on 

        if(input(PIN_A0) == 1)            // if input a0 (switch) is 1 
            output_toggle(PIN_C2);        // output d2 led turns off 

        if ((Sw1 == 1) & (Sw2 == 0)) 
            output_bit (PIN_A1,1); 

        if (input(PIN_A1) == 1)
            output_toggle(PIN_C2); 

        if ((Sw1 == 0) & (Sw2 == 1))
            output_bit (PIN_A2,1); 

        if (input(PIN_A2) == 1) 
            output_toggle(PIN_C2); 

        if ((Sw1 == 1) & (Sw2 == 1)) 
            output_bit (PIN_A3,1); 

        if (input(PIN_A3) == 1) 
            output_toggle(PIN_C2);
    }
}
Pero esa corrección no implica que funcione.
Me pregunto si te has tomado un tiempo para estudiar lenguaje C. :unsure:
 
aa estudiar C es una perdida de tiempo vamos a los pic con CCS.

"cualquier estudiambre que no sabe nada de C".

bueno yo mandaria a la goma tantos if.

con uno basta para que preguntar el estado de uno si el otro esta en 0 y viceversa.

no se que estas tratando de hacer como veo que esta comentado en ingles supongo que lo copiaste MAL y lo editaste MAL y no entendiste nada.

y si estas tratando de hacer un multiplexor de N entradas pues creo que no estas aplicando bien el concepto de multiplexor

.-un multiplexor de 2 entradas tiene 1 selector
.-un multiplexor de 4 entradas tiene 2 selectores
.-un multiplexor de 8 entradas tiene 4 selectores

el puerto B de un desperdiciado 4550 tiene 8 bits es decir con un puerto puedes hacer 8 entradas

con el puerto A puedes seleccionar 4 selectores y un puerto sobrante sea A E o D puede ser la salida

la pregunta es:
¿COMO TU resolverias el problema?

obviamente copiando de internet no.

propon unas jugosas sugerencias y te ayudamos en el foro
 
Atrás
Arriba