Почему моя программа не распознает условие PORTbits.RCx == 0?

      void UART_init(void){
    
    ANSELB = 0; //set PORT B to digital port
    TRISBbits.TRISB5 = 1; //set RX pin to input
    TRISBbits.TRISB7 = 0; //set TX pin as output
    
    SPBRGH = 0;
    SPBRGL = 25; //set baud rate to 9600
    
    BRGH = 0;
    BRG16 = 0;
    SYNC = 0;
    SPEN = 1; //enable serial port pins
    
    TX9 = 0; //set 9 bit tranmission
    RX9 = 0; //set 9 bit receive
    
    TXEN = 1; //enable transmission
    CREN = 1; //enable receiver
    
}

void UART_write(char data){
    while(TRMT == 0);
        
    TXREG = data;
}

void UART_write_string(char *text){
    for(int i=0; text[i] != '\0'; i++){
       UART_write(text[i]);
    }
}

char UART_read(){
    while(RCIF == 0);
    return RCREG;
}

char URAT_read_string(char *stringprimit, int lungime){
    for(int i=0; i < lungime; i++){
        stringprimit[i] = UART_read();
    }
}

int main(int argc, char** argv) {
    OSCCONbits.IRCF = 0b1111; //set operating frequency to 31kHz (0b1111) for 16MHz
    //WDTCONbits.WDTPS = 0b01110;
    //CLRWDT();
    //0b01100; //set WTD interval at 4s   
    
    UART_init();
    
    //Activam pull-up
    OPTION_REGbits.nWPUEN = 0;
    WPUCbits.WPUC2 = 1;
    WPUCbits.WPUC6 = 1;
    WPUCbits.WPUC7 = 1;
    WPUCbits.WPUC0 = 0;
    WPUCbits.WPUC1 = 0;
    WPUCbits.WPUC3 = 1;
    
    
    //Led-uri
    TRISAbits.TRISA1 = 0; // set as output
    TRISAbits.TRISA2 = 0; // set as output
    
    ANSELAbits.ANSA1 = 0; //pin digital
    ANSELAbits.ANSA2 = 0; //pin digital
    
    ANSELAbits.ANSA0 = 1; //set to analogic pin
    TRISAbits.TRISA0 = 1; //set as input
    
    ANSELCbits.ANSC0 = 0; //set to digital pin
    ANSELCbits.ANSC1 = 0; //set to digital pin
    
    TRISCbits.TRISC0 = 0; //set as output
    TRISCbits.TRISC1 = 0; //set as output
    
    ANSELCbits.ANSC2 = 0; //set to digital pin
    ANSELCbits.ANSC6 = 0; //set to digital pin
    ANSELCbits.ANSC7 = 0; //set to digital pin
    
    TRISCbits.TRISC2 = 1; //set as input
    TRISCbits.TRISC6 = 1; //set as input
    TRISCbits.TRISC7 = 1; //set as input
    
    PORTCbits.RC0 = 1;
    PORTCbits.RC1 = 0;
    
    PORTAbits.RA1 = 0;
    PORTAbits.RA2 = 1;
    
    char user_input;
    
    UART_write_string("1. rotate right ");
    UART_write('\r');
    UART_write_string("2. rotate left");
    UART_write('\r');
    UART_write_string("3. stop");
    UART_write('\r');
    UART_write_string("4. Deactivate UART");
    UART_write('\r');
    UART_write_string("select:");
   
   
    
    while(1){
        
        //CLRWDT();
        
        user_input = UART_read();
        
        
     
        
        if(PORTCbits.RC7 == 0 ){ //motor rotates right
            
            user_input = '1';
            PORTCbits.RC0 = 1;
            PORTCbits.RC1 = 0;
            
            PORTAbits.RA1 = 0;
            PORTAbits.RA2 = 1;
            
        }
        
        if(PORTCbits.RC6 == 0 ){ //motor rotates left
            
            user_input = '2';
            PORTCbits.RC0 = 0;
            PORTCbits.RC1 = 1;
            
            PORTAbits.RA1 = 1;
            PORTAbits.RA2 = 0;  
            
        }
        
        if(PORTCbits.RC2 == 0 ){ //motor stop
            
           
            user_input = '3';
            PORTCbits.RC0 = 0;
            PORTCbits.RC1 = 0;
            
            PORTAbits.RA1 = 0;
            PORTAbits.RA2 = 0;
            
            
        }
        
        if(user_input =='1') {//motor rotates right
            PORTCbits.RC0 = 1;
            PORTCbits.RC1 = 0;
            
            PORTAbits.RA1 = 0;
            PORTAbits.RA2 = 1;
            
            
        }
        
        if( user_input =='2'){ //motor rotates left
            PORTCbits.RC0 = 0;
            PORTCbits.RC1 = 1;
            
            PORTAbits.RA1 = 1;
            PORTAbits.RA2 = 0;  
            
              
        }
        
        if(user_input =='3'){ //motor stop
            PORTCbits.RC0 = 0;
            PORTCbits.RC1 = 0;
            
            PORTAbits.RA1 = 0;
            PORTAbits.RA2 = 0;
            
             
        }
        if(user_input =='4'){ //deactivate UART
            CREN = 0;
        }
     
      
         
    }
    
   
    
    return (EXIT_SUCCESS);
}

В этом проекте я пытался управлять двигателем постоянного тока двумя способами: первый метод - это UART с вводом пользователя, а второй - с помощью кнопок. Прицел: Когда я нажимаю на клавиатуре цифру 1, я хочу, чтобы мотор вращался вправо, 2 - влево, 3 - останавливался. Это работает нормально, но проблема в кнопках, когда я нажимаю кнопку RC7, ничего не происходит.RC7 - означает, что мотор вращается вправо, RC6 - мотор вращается влево, RC2 - мотор останавливается . Насколько я могу судить, моя программа даже не видит этих условий, таких как PORTbits.RC7 == 0.

1 ответ

Из кода я вижу, что функция:

      char UART_read(){
    while(RCIF == 0);
    return RCREG;
}

блокирует while(RCIF == 0);

и я думаю, что это причина, по которой ваши кнопки не работают, потому что в самом начале while(1)вы звонили UART_read();.

И вы сами упомянули, что выходные данные соответствуют ожиданиям для данных UART, так что это отвечает на ваш вопрос.

Чтобы заставить его работать, вы должны написать прерывание UART Rx, чтобы ваша программа не блокировала/ожидала получения данных UART.

Изменить:
согласно вашему комментарию, вы отключаете прием UART, используя CREN, то вы также должны проверить, включен ли приемник перед чтением регистра Rx Data, вы можете изменить функцию приема UART, как показано ниже:

      char UART_read(){
    
    if(CREN == 0) {
        return '\0'; //Return NULL Character
    }
    while(RCIF == 0);
    return RCREG;
}
Другие вопросы по тегам