简体   繁体   中英

Why doesn't my program recognize the PORTbits.RCx == 0 condition?

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);
}

In this project I tried to control a DC motor with two methods, the first method is UART with user's input and the second with buttons. The scope: When I press the numer 1 from the keyboard I want the motor rotates to the right, 2- left, 3 - stop. This works properly, but the problem is with the buttons, when I press the RC7 button nothing happens. RC7 - means the motor rotates right, RC6 - them motor rotates left, RC2 - the motor stop From what I can tell, my program doesn't even see those conditions, like PORTbits.RC7 == 0.

From the code, I can see that the function:

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

is blocking on while(RCIF == 0);

and I think this is the reason your Buttons are not working because at the very beginning of the while(1) you have called UART_read(); .

And you mentioned it yourself that the output is as expected for UART data, so this answers your question.

To make it work, you have to write a UART Rx Interrupt so that your program should not be blocking/waiting on UART to Receive data.

Edit:
As per your comment, that you are disabling the UART reception using CREN , then you should also check if the Receiver is enabled prior to reading the Rx Data register, you can modify the UART receive function as below:

char UART_read(){
    
    if(CREN == 0) {
        return '\0'; //Return NULL Character
    }
    while(RCIF == 0);
    return RCREG;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM