Skocz do zawartości

[C] Atmega8. Nie zapisuje wartości liczbowej z AC pod zmienną...


Pomocna odpowiedź

Napisano

Witam serdecznie.

mam dziwny problem ze swoją atmegą 8. Wkleję tutaj mniejszą część całego kodu w której jest problem:

if(przycisk_c(2)) // opcja pomiaru.
	{
		min=40;
		max=0;
		CzyscLCD();

		while(1)
		{
			for(i=0;i<20;i++)
			{
				pom+=(unsigned int)pomiar();

				if(i==19)
				{pom=(int)(((pom*0.351)/20));}
			}



			if((int)pom>max) <-TUTAJ NAJPRAWDOPODOBNIEJ PROBLEM.
			{
				max=pom;

			}


			if(przycisk_c(1))
			{
				break;
			}
			if(max<10)
			{cyfry=1;}

			else if(max<100&&max>=10)
			{cyfry=2;}
			else
			{cyfry=3;}

			CzyscLCD();
			char buf[4];
			itoa (max,buf,10);
			WyswietlLCD(buf, cyfry);


		}

Pom, to funkcja robiąca pomiar przetwornika A/C. Działa ona poprawnie i wyświetla poprawne wartości. Mi chodzi jednak o to aby wyświetlona została jedynie maksymalna wartość odczytana przez przetwornik. Jednak przy tak zapisanym kodzie wyświetlana jest wartość którą wpiszę u góry do max, czyli w tym wypadku "0".

Jeżeli w if zapiszę max=min to wyświetlana zostanie wartość 40.

jeżeli zapiszę tak:

if(pom>max)
{
     max_buf=pom;
     max=max_buf;
}

i np. max zainicjalizuję z wartością 150,i wyświetlam max_buf to wartość max_buf jest znowu wyświetlana ciągle(zmienia się wraz z wartością pomiaru) ale tylko dla wartości większych od 150.

Takze moje pytanie:

Dlaczego do zmiennej max, nie jest zapisywana wartość pom w if?

Pozdrawiam.

Mazur.

według mnie problem leży tutaj

{pom=(int)(((pom*0.351)/20));} 

przy maksymalnej wartości możliwej do uzyskania przez przetwornik, wynik to nadal nie więcej niż 18. Pewnie też nie używasz zmiennych typu float, więc po pierwszej operacji mnożenia uzyskiwane jest 0 (pom*0.351). Można by to uprościć dzieląc od razu przez zaokrągloną wartość całkowitą, czyli (1/0.351)*20=56,98 ~ 57 🙂

według mnie problem leży tutaj
{pom=(int)(((pom*0.351)/20));} 

przy maksymalnej wartości możliwej do uzyskania przez przetwornik, wynik to nadal nie więcej niż 18. Pewnie też nie używasz zmiennych typu float, więc po pierwszej operacji mnożenia uzyskiwane jest 0 (pom*0.351). Można by to uprościć dzieląc od razu przez zaokrągloną wartość całkowitą, czyli (1/0.351)*20=56,98 ~ 57 🙂

No jak to? Przecież zakładajac ze pomiar jest 8 bit (pozniej będzie 10) to maksymalna liczba to 256*0,351=~90?

I dlaczego dzielić przez zaaokrągloną wartość? Ten dzielnik wynika ze średniej arytmetycznej z 20stu pomiarów.

Pozdrawiam i dzięki za wszelkie odpowiedzi.

kolega grabo ma rację mówiąc, że wynik będzie zero, ponieważ atmega8 nie wspiera zmiennych typu float.

nie możesz po prostu pomnożyć pom*0.351, bo kompilator zaokrągli 0.351 do 0 i masz mnożenie pom*0.

kolega grabo ma rację mówiąc, że wynik będzie zero, ponieważ atmega8 nie wspiera zmiennych typu float.

A na jakiej podstawie to twierdzisz?

Czy nie uważasz że zależy to nie od procesora, tylko od kompilatora?

  • Lubię! 1

Problem rozwiązany. Mój błąd polegał na złym rzutowaniu.

Tak jak pisze kolega dondu, zależy od kompilatora. W moim wypadku zapis ten działa. Program w wersji ostatecznej zrobię na intigerach.

Pozdrawiam.

Temat do zamknięcia.

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...