mazur89 Napisano Październik 10, 2011 Udostępnij Napisano Październik 10, 2011 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. Cytuj Link do komentarza Share on other sites More sharing options...
grabo Październik 11, 2011 Udostępnij Październik 11, 2011 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 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
mazur89 Październik 11, 2011 Autor tematu Udostępnij Październik 11, 2011 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. Cytuj Link do komentarza Share on other sites More sharing options...
niciki Październik 11, 2011 Udostępnij Październik 11, 2011 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. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
dondu Październik 11, 2011 Udostępnij Październik 11, 2011 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? 1 Cytuj Link do komentarza Share on other sites More sharing options...
mazur89 Październik 11, 2011 Autor tematu Udostępnij Październik 11, 2011 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. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!