включить порты RB4 и RB3 на рис 18F4550 - PullRequest
1 голос
/ 22 марта 2011

Я написал эту программу в mplab v8.63 с компилятором c C18 на рис 18F4550. если я нажимаю кнопку на моем picdem (S3) и на RB5 подключен светодиод (с резистором), то светодиод продолжает гореть. Когда я нажал (S3), и на RB4 есть светодиод, светодиод не будет (в то время как я ожидал этого) так же, как с RB3. Это я что то забыл установить?

Цель состоит в том, чтобы красный, зеленый и синий светодиоды отдельно измерялись с помощью LDR. но сначала я, очевидно, должен включить порты RB5, RB4 и RB3.

#pragma code
/******************************************************************************/

void main (void)
{   

    TRISD = 0x00;               // PORTD  as output
    TRISB = 0b00110000;         // RB4 en RB5 as input
    TRISA = 0x00;               // RA output

    RCONbits.IPEN = 0;          // priority
    INTCONbits.GIE = 1;         // enable interrupt
    INTCONbits.RBIE = 1;        // interrupt portB on

    while(1)
    {   
        _asm sleep _endasm  
    }
}

#pragma interrupt ISR
void ISR (void)
{
    //int red= 01110010011011110110111101100100;
    int on = 1;
    int off = 0;
    if (INTCONbits.RBIF==1)
    {
        if(PORTBbits.RB5==0)        // S3 pressed?
        {
            LATDbits.LATD1 ^= 1;    // D2 toggle
            LATAbits.LATA2 ^= on;
        }
        if(PORTBbits.RB4==0)
        {
            LATDbits.LATD1 ^= 1;    // D2 toggle
            LATAbits.LATA2 ^= on; 
        }
        if(PORTBbits.RB3==0)
        {
            LATDbits.LATD1 ^= 1;    // D2 toggle
            LATAbits.LATA2 ^= on; 
        }

    }   
    INTCONbits.RBIF = 0;
}

Ответы [ 2 ]

1 голос
/ 23 марта 2011

В регистрах PIC TRIS бит, установленный на 1, означает ввод, а 0 - вывод.Вы устанавливаете TRISB = 0b00110000, который является всеми выходами на порту B, кроме RB5 и 4, которые являются входами.Если вам нужен RB3 в качестве цифрового входа, вам нужно установить TRISB = 0b00111000.Считаются биты b7, b6, b5, b4, b3, b2, b1, b0.

Однако вы ожидаете, что RB3 запустит RBIF, что не так, как я объяснил здесь ,Таким образом, у вас есть только RB5 и 4, которые будут запускать RBIF, но если бы RB3 был низким в это время, он переключал бы D1 и A2.Так что переместите этот код в основной цикл, как я предлагал, пока он не заработает, а затем заставьте его работать с прерываниями.

Как говорит ChrisJ, некоторые выводы по умолчанию используются для аналогового ввода, если вы не отключите его, поэтому вы не получите цифровой входи прерывание при смене контакта, которое вы ожидаете, используя ADCON1

0 голосов
/ 22 марта 2011

Если установлен бит PBADEN, PORTB инициализируется с помощью RB4: RB0, установленного в качестве аналоговых входов. Если это так, вы должны использовать ADCON1 для отключения аналоговых входов на RB4: RB0. В примере программы в начале раздела 10.2 этого руководства от 0x0E до ADCON1 правильно инициализируется PORTB.

См. Также раздел 21.0 для объяснения ADCON1 битов.

...