Problema al leer la entrada PIC18F4550

Hola, tengo un problema con la lectura de la entrada de un PIC18f4550 , para un arreglo simple en el que cuando se enciende (interruptor = 1), algunos LED deben brillar y, al soltar el interruptor, el LED debe apagarse (interruptor = 0) ,. Al proporcionar algunos voltios a través de un pin (RA0 o RA1), los LED deberían brillar, pero no tengo éxito al hacerlo. Estoy usando el compilador MPLAB IDE Y C18. Probé con el compilador MPLABX y XC8 también.

Quería recibir información de RA0 y RA1, con un interruptor de dos pulsaciones. Y leds luminosos en RD7-RD4. Hice una simple declaración if then else, dentro de un ciclo while(1) para hacerlo.

    #include <p18f4550.h>
    #define switch1  PORTAbits.RA0   // two switches
    #define switch2  PORTAbits.RA1
    #define led1    LATDbits.LATD7   // defining led’s for making life easy
    #define led2    LATDbits.LATD6
    #define led3    LATDbits.LATD5
    #define led4    LATDbits.LATD4

    void main (void)
            {
                    // IO settings
                    /* tired both ways*/

            TRISbits.RA0=1   //making input for switch 1
            TRISbits.TRISA1=1  //making input for switch 2

            TRISDbits.TRISD7 = 0;   // RD7 to RD4 set to output for led.
            TRISDbits.TRISD6 = 0;
            TRISDbits.TRISD5= 0;
            TRISDbits.TRISD4 = 0;

            ADCON1bits.PCFG0 = 1;        // making all pins digital.
            ADCON1bits.PCFG1 = 1; 
            ADCON1bits.PCFG2 = 1;     // referred Data Sheet Page:262
            ADCON1bits.PCFG3 = 1;

              while(1)
                {      if(switch1 == 1)   
                            {    led1 = 1;   
                                 led2 = 1;
                                 led3 = 1;
                                 led4 = 1;          }

         else if (switch1 == 0)  // on reading no voltage 
                            {     led1 =  0;
                                  led2 =  0;
                                  led3 =  0;
                                  led4 =  0;  }                                    
                               else { }
                          }  
   }

No funcionó bien... los leds del RD7-RD4 siguen encendidos todo el tiempo sin importar lo que haga.

Traté de cambiar el

        PORTAbits.RA0   to  LATAbits.LATA0  but still no help.

Investigué un poco y alguien me recomendó desactivar el valor ADC y después de buscar la configuración de la hoja de datos. Apagué el adc

        ADCON0bits.ADON = 0;  //turn off the ADC

Comprobado con el circuito en protoboard. Todo pero sigue siendo la misma situación. Alguien recomendó además que es una mejor idea apagar el comparador. Por lo tanto, apagué el comparador nuevamente.

     CMCON = 0x07;     // comparator off.

     ADCON1=0x0F;  //All pins digital

Construí todo de nuevo desde cero, pero aún no tuve éxito. Presiono el interruptor para encenderlo o apagarlo. Los leds en RD7-RD4 solo del puerto D siguen encendidos todo el tiempo :'( .. Aquí estoy por favor ayúdenme.

PD: [Solo para sumar, también pensé que mi pic18f4550 podría haberse estropeado. Por lo tanto, probé un código para parpadear el LED en pic18f4550 http://goo.gl/PosRgg de un sitio web que funcionó bien... por lo tanto, estoy seguro de que mi pic184550 no salió mal.] Por favor, ayuda y recomienda dónde me equivoqué, tengo estado intentando desde hace 3 días :'(

¿Cómo ha conectado exactamente su interruptor al procesador? ¿La línea con "if (switch1 = = 0)" realmente tiene un espacio entre los dos signos iguales?
daría un error si hubiera algún espacio entre "switch == 0" en mplab ide. El Switch está conectado con VSS del pic18f4550 5v. cuando el pin en ON - 5v entra en RA0 del microcontrolador.
Lo siento, pero no entiendo cómo has conectado el interruptor. ¿Está conectado con VSS de 5V? ¿Qué significa eso? ¿Hay una resistencia pullup o pulldown?

Respuestas (1)

No creo que ADCON marque una diferencia en este caso, ya que los pines PORTD que está utilizando están multiplexados con el modo PWM mejorado y el puerto paralelo de transmisión (SPP), en lugar del módulo de entrada analógica, que tiene prioridad sobre la E/S del puerto.

Deberá deshabilitar el PWM mejorado que también está multiplexado con pines PORTD. También probablemente querrá deshabilitar SPP, borrando el bit 0 del registro SPPCON (SPPEN) a 0

ingrese la descripción de la imagen aquí

Entonces, una solución en este caso puede ser configurar CCP1CON para cualquier cosa que no sea Dual o Quad PWM configurando CCP1CON en 00xx 11xxingrese la descripción de la imagen aquí

gracias por responder, quieres decir algo como SPPCON = 0; SSPCON1 = 0; ? Cómo desactivo el pwm en portD. oye, ¿qué pasa si dejo la idea de usar el puerto D y hago la configuración para el puerto B, como de RB0 a RB4? eso solucionara mi problema?
@Sanju respuesta actualizada. Sin embargo, ese es un enfoque pero el mismo algoritmo de pensamiento, busque lo que está multiplexado con el puerto alternativo y vea si necesita deshabilitar cualquier módulo que interfiera con él. Comunicación SPPCON (SPP) no SSP (serie)