Проблема с чтением ввода PIC18F4550

Привет, я столкнулся с некоторой проблемой при чтении ввода с PIC18f4550 для простой схемы, когда при включении (переключатель = 1) должны светиться несколько светодиодов, а при отпускании переключателя светодиод должен гаснуть (переключатель = 0) ,. При подаче нескольких вольт на контакт (RA0 или RA1) - светодиоды должны светиться, но мне это не удается. Я использую компилятор MPLAB IDE AND C18. также пробовал с компилятором MPLABX и XC8.

Я хотел получить ввод от RA0 и RA1 с помощью двухкнопочного переключателя. И светодиоды накаливания на РД7-РД4. Для этого я сделал простой оператор if then else внутри цикла while(1).

    #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 { }
                          }  
   }

Ничего хорошего не вышло... светодиоды на RD7-RD4 все время горят, что бы я ни делал.

Я попытался изменить

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

Я провел небольшое исследование, и кто-то порекомендовал мне отключить значение АЦП и просмотреть настройки таблицы данных. я отключил адк

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

Проверял со схемой на макетной плате. Все, но все еще ситуация такая же. Кто-то также рекомендовал, что лучше отключить компаратор. Поэтому я снова отключил компаратор.

     CMCON = 0x07;     // comparator off.

     ADCON1=0x0F;  //All pins digital

Я снова построил все это с нуля, но до сих пор не добился успеха. Я нажимаю на выключатель. Светодиоды на RD7-RD4 только порта D горят все время :'( .. Вот и я помогите пожалуйста.

PS: [Чтобы добавить, я также думал, что мой pic18f4550 испортился. Поэтому я протестировал код для мигания светодиода на pic18f4550 http://goo.gl/PosRgg с веб-сайта, он работал нормально… поэтому я уверен, что мой pic184550 не испортился.] Пожалуйста, помогите и порекомендуйте, где я ошибся, у меня есть пытаюсь уже 3 дня :'(

Как именно вы подключили коммутатор к процессору? Действительно ли в строке «if (switch1 = = 0)» есть пробел между двумя знаками равенства?
это выдаст ошибку, если между «switch == 0» в mplab ide будет пробел. Коммутатор подключен к VSS pic18f4550 5v. когда контакт в ON - 5v входит в RA0 микроконтроллера.
Извините, но я не понимаю, как вы подключили переключатель. Это связано с VSS 5V? Что это значит? Есть ли подтягивающий или подтягивающий резистор?

Ответы (1)

Я не думаю, что ADCON будет иметь значение в этом случае, поскольку контакты PORTD, которые вы используете, мультиплексированы с расширенным режимом PWM и потоковым параллельным портом (SPP), а не модулем аналогового ввода, которые имеют приоритет над портом ввода-вывода.

Вы захотите отключить Enhanced PWM, который также мультиплексирован с выводами PORTD. Также вы, вероятно, захотите отключить SPP, очистив бит 0 регистра SPPCON (SPPEN) до 0

введите описание изображения здесь

Таким образом, решением в этом случае может быть настройка CCP1CON на что угодно, кроме Dual или Quad PWM, путем установки CCP1CON на 00xx 11xx.введите описание изображения здесь

спасибо за ответ, вы имеете в виду что-то вроде SPPCON = 0; ССПКОН1 = 0; ? Как отключить pwm на порте D. Эй, а что, если я откажусь от идеи использования порта D и включу настройку для порта B, например, с RB0 на RB4? это решит мою проблему?
@Sanju обновил ответ. Это один подход, но тот же алгоритм мышления, посмотрите, что мультиплексируется с альтернативным портом, и посмотрите, нужно ли вам отключить какие-либо модули, мешающие этому. Связь SPPCON (SPP) не SSP (последовательная)