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.

Upvotes: 3

Views: 403

Answers (1)

user4886037
user4886037

Reputation:

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

Upvotes: 2

Related Questions