Skocz do zawartości

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


mazur89

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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 🙂

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.