Cześć , kolejna część kursu jak zwykle super . Wszystko przedstawione bardzo jasno i w ciekawy sposób .
Podczas robienia zadań z pracy domowej napotkałem pewien problem. Zaimplementowałem funkcje do odczytu oraz zapisu dla GPIO oraz dodatkową funkcję pomocniczą. Niestety program nie działa jak należy. Kilkukrotnie podglądałem w debuggerze wartości zmiennych pobranych z rejestrów i poddanych np. przesunięciu bitowemu i wyniki były odmienne od oczekiwanych. Poniżej zamieszam kod:
// Sprawdzam wartość bitu na danej pozycji
uint8_t check_bit(uint8_t bit_array, uint8_t position){
if( ((bit_array >> position) & 0x01) == 0x01){
return 1;
}
else{
return 0;
}
}
uint8_t MCP_GPIO_ReadPin(uint8_t output_num){
// Pobieram konfigurację I/O do sprawdzenia
uint8_t config = mcp_reg_read(MCP_IODIR);
if (check_bit(config, output_num) == 0){
uint8_t reg_val = mcp_reg_read(MCP_GPIO);
return check_bit(reg_val, output_num);
}
else{
return -1;
}
}
void MCP_GPIO_WritePin(uint8_t output_num, uint8_t state){
// Pobieram dotychczasową wartość rejestru, aby zmodyfikować tylko jeden bit
uint8_t bit_state = mcp_reg_read(MCP_GPIO);
uint8_t current_output_val = check_bit(bit_state, output_num);
if (state == 0){
// Jeżeli chcę ustawić tą samą wartość to nic się nie zmienia
// Jeżeli chcę zmienić wartość to wykonuję toggle bit na danym bicie
if(current_output_val == 0){
}
else{
bit_state ^= 1 << output_num;
}
}
else if (state == 1){
if(current_output_val == 1 ){
}
else{
bit_state ^= 1 << output_num;
}
}
mcp_reg_write(MCP_OLAT,bit_state);
}
Próbowałem różnych modyfikacji, lecz nie mogłem natrafić na błąd. Mam przeczucie, że może to być kwestia niewłaściwego typu zmiennej, niewłaściwego użycia operatora ">>" lub operacji toggle bit(czy jest to w ogóle właściwy sposób na zmianę bitu, czy może jest inna droga ?)
Czy moje podejście do tego zadania jest poprawne? Będę wdzięczny za wszelką pomoc/uwagi