To many arguments to function

0

Hejka.
Mam takie 3 funkcje:

float licz_Ro(float Rl, uint8_t Uwy) //funkcja liczy Ro z wyprowadzonego wzoru Uwe to 1024 Uwy to wartosc (0 - 1024)
{
	float Ro = Rl * ((1023-Uwy)/Uwy);
	return Ro;
}

//funkcja kalibracja wyznacza średnią rezystancje sensora w czystym powietrzu po uruchomieniu

float kalibracja(int mq_pin){
	float val=0;

	for (int i=0;i<liczba_kalibracji;i++){
		val +=licz_Ro(RL,pomiar(MQ_PIN));
		_delay_ms(czas_kalibracji);
	}
	val=val/Ro_data;
	return val;
}

//funkcja odczyt wyznacza średnią rezystancję sensora ze zmierzonych wartosci napiecia z liczba_pomiarów i czas_pomiaru

float MQ_odczyt(int mq_pin){
	float Rs=0;
	for(int i=0;i<liczba_pomiarow;i++){
		Rs += licz_Ro(RL,pomiar(MQ_PIN));
		_delay_ms(czas_pomiaru);
	}
	Rs=Rs/liczba_pomiarow;
	return Rs;
}

i wyskakuje mi błąd To many arguments to function.
screenshot-20201107180105.png

0

Zwykle błąd mówi dokładnie.

a) nie podajesz f. pomiar()
b) w #definach jak MQ_PIN lubi być jakiś syf. #define to zło, a mikroprocesorowcy używają to masochistycznie.
Używaj stałych const odpowiedniego typu.

0

@AnyKtokolwiek:
@kq:

 uint8_t pomiar (uint8_t mq_pin){
	ADMUX = (ADMUX & 0xF8) | mq_pin; //start pomiaru na wybranym kanale

	ADCSRA |= (1<<ADSC); //oczekiwanie na koniec pomiaru

	while(ADCSRA & (1<<ADSC)); // po zakończeniu pomiaru, gdy bit ADSC = 0 zwoc wynik wartosci rejestrow ADCH i ADCL
	return ADCW;  // wynik napiecia od 0 do 1024
}

to jest funkcja do pomiaru napięcia z czujnika.

0

Co to jest pomiar(MQ_PIN)?

Strzelałbym, że masz gdzieś zadeklarowaną zero- lub jednoargumentową funkcję licz_Ro, ale to tylko podejrzenie...

0

Offtop: Jakie wartosci przyjmuje ten mq_pin? Bo zgaduje ze w to ogole powinno byc uzywane jako _BV(mq_pin) a nie tak o

0

#define MQ_PIN 2
#define RL 4,7
kompilator krzyczał, że w funkcji licz_Ro było za dużo argumentów ponieważ zamiast 4,7 funkcja czytała to jako dwa argumenty: 4 i 7
należało w #define napisać RL 4.7

nie podałem wam #definów więc nie mieliście jak rozwiązać problemu, niemniej jednak dziękuję za zaangażowanie w jego rozwiązanie :)

0

ł> ##### Asur napisał(a):
#define MQ_PIN 2

#define RL 4,7
kompilator krzyczał, że w funkcji licz_Ro było za dużo argumentów ponieważ zamiast 4,7 funkcja czytała to jako dwa argumenty: 4 i 7
należało w #define napisać RL 4.7

Nie.
Należało napisać

const float RL=4.7;
0

@kq @AnyKtokolwiek:
Nazwy rejestrów sugerują, że to jest AVR.
Musiałbym porównać kod asemblerowy, ale #define ma szansę być lepszym wyjściem z racji architektury. Raz, że trzeba będzie to wczytać z flasha podczas bootowania do pamięci RAM to potem jeszcze drugi raz trzeba go z tej pamięci przekazywać do funkcji; przy #define zostanie to zinline'owane. AVRy to często na tyle małe procki, że może to mieć znaczenie. Można użyć odpowiedniego attribute, żeby const nie był kopiowany z flasha do RAM na etapie wczytywania programu, ale wtedy znowu trzeba to zrobić manualnie przed wywołaniem funkcji.
Odsyłam: https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

EDIT: sprawdziłem godboltem, #define vs const, static const, w ciele funkcji, poza funkcją itd. Zawsze #define wygrywa.
Swoją drogą, stosowanie jakiegokolwiek typu zmiennoprzecinkowego (ztcp sizeof float == sizeof double ale pewności nie mam) na AVR to i tak proszenie się o kłopoty, bo albo będzie to koszmarnie wolne albo zaraz flasha braknie z racji programowej jego obsługi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1