Skocz do zawartości

LineFollower PID - Tablica czujników


Pomocna odpowiedź

Napisano

Cześć. Siedzę od kilku godzin nad problemem i nie mam już pomysłu. Sprawa pewnie znana...

Do tablicy trzeba wstawić stany czujników. Zrobiłem to tak:

//definicje stanów czujników!!!
#define CZ1 (PIND & (1<<PD0))
#define CZ2 (PIND & (1<<PD1)>>1)
#define CZ3 (PIND & (1<<PD2)>>2)
#define CZ4 (PIND & (1<<PD3)>>3)
#define CZ5 (PIND & (1<<PD4)>>4)
#define CZ6 (PIND & (1<<PD5)>>5)
#define CZ7 (PIND & (1<<PD6)>>6)

int tablica_Wagi[] = {-3,-2,-1,0,1,2,3};
int tablica_Czujnikow[] = {CZ1, CZ2, CZ3, CZ4, CZ5, CZ6, CZ7};
int tablica_Wyniki[7];
for(int i=0; i<7; i++){
	if(tablica_Czujnikow[i]){
		tablica_Wyniki[i]=1;
	}
	else if(!(tablica_Czujnikow[i])){
		tablica_Wyniki[i]=0;

	}
}

for(int i=0; i<7; i++){
	error += tablica_Wagi[i]*tablica_Wyniki[i];
}

Działa to w pojedynczych aspektach kiedy sprawdzam jedynie stan jednego czujnika, lecz jak zaczynam dodawać stany w tablicy to albo error dąży do nieskończoności albo jest zerem. Prawdopodobnie jest to banalny błąd, ale nie mam pojęcia gdzie..

Definiujesz wyrażenia, które nie mogą być policzone w trakcie kompilacji, bo przecież wymagają wykonania kodu wczytującego port i przesuwającego odczyt o ileś bitów. Czegoś takiego nie możesz wstawić do tablicy. Tam mogą być tylko liczby, bo to obszar pamięci danych. Możesz do tablicy wstawić pozycje bitowe poszczególnych czujników:

#define CZ1 0
#define CZ2 1
#define CZ3 2 itd..

a potem korzystać z tego przy przesuwaniu:

uint8_t
 sensor_port,
 error;

sensor_port = PIND;
error = 0;
for(int i=0; i<7; i++){ 
   tablica_Wyniki[i] = (sensor_port >> tablica_Czujnikow[i]) & 1;
   error += tablica_Wagi[i] * tablica_Wyniki[i];    
   } 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...