http://lmgtfy.com/?q=avr+sprintf+float
O i tej informacji mi brakowało, że pierwsza liczba oznacza długość całego pola, a nie ilość przed przecinkiem. Chyba mnie zamroczyło i niedokładnie przeczytałem Minimum number of characters to be printed. If the value to be printed is shorter than this number, the result is padded with blank spaces. The value is not truncated even if the result is...
Warto zainteresować się plikiem Makefile i jego budową, chociaż w większości przypadków ta wiedza się nie przydaje, ale jednak, jak widać po tym kodzie, trzeba czasem trochę pogrzebać. Cieszę się, że działa. Pozdrawiam
To co podałem to kompletne polecenie dla linkera. Jeśli korzystasz z kreatorów to musisz linkować nie -lprintf tylko plrintf, to -l dodaje AS.
Google printf float avr gcc -- pierwszy wynik to [url=http://winavr.scienceprog.com/avr-g...
Rozumiem, że program muszę zmniejszyć o 12 KB(kod)+5 kB(rodata)+ na inicjalizację sekcji data, rozumiem ,że użycie sprintf odpada, prosiłbym w takim razie o wskazówkę jak "wysłać" zmienną int, float na terminal? A ja polecam bibliotekę [url=http://www.sparetimelabs.com/tinypr... printf, tylko 200 linii kodu w wersji podstawowej. Jest...
http://www.edaboard.com/thread5585.html Może ta implementacja wystarczy. (Przeczytaj do końca).
Witam, mam pytanie odnośnie SDCC i zmiennej typu float. Probuje wyświetlić zmienną typu float na LCD. Zmienną taką mogę wysłać na RS232 poprzez printf_fast_f() ale cos zrobić kiedy potrzebuję użyć sprintf(). Widzę, że kiedyś miał Pan podobny problem więc może już go Pan rozwiązał. Z góry dziękuję za pomoc.
To może ci wcale float nie jest potrzebne, można użyć fixed point? Ew. jak pisałem - rozbij proces konwersji, tak, że najpierw robisz zaokrąglenie, a potem konwersję. Musi być float, wartości muszą być wyświetlane z różną precyzją (poprzednio podałem tylko przykład dla formatu "0.00"). W jaki sposób zrobić zaokrąglenie, powiedzmy to 2-ch miejsc po...
Aby float działał w printf/sprintf , należy dodać w opcjach linkera dodatkową bibliotekę. Jak to zrobić, opisane jest pod koniec pierwszego posta w temacie http://www.elektroda.pl/rtvforum/topic10...
Jeśli wyrzucisz float to musisz zastosować triki z fixed point math. Czyli część całkowitą uzyskujesz dzieląc np. przez 100, a część ułamkową przeprowadzając operację modulo 100. No i nie możesz dać od razu lcd.print, bo najpierw trzeba sformatować to co chcesz wyświetlić, przygotowując łańcuch funkcją sprintf.
Oto odpowiedź: http://mikrokontrolery.blogspot.com/2011...
Przeczytaj ten artykuł: http://mikrokontrolery.blogspot.com/2011...
Tak więc nie potrafię tego rozwiązać. Jeśli ktoś tu trafił bo szukał odpowiedzi na ten temat, to polecam zrobić coś takiego : [syntax=c] # define PRECISION 8 char* floatToString(float num) { int whole_part = num; int digit = 0, reminder =0; int log_value = log10(num), index = log_value; long wt =0; int i; // String containg result char str[15]; //Initilise...
No proszę! Że też nikt o tym nigdzie nie napisał! http://www.google.com/search?client=oper... -> http://winavr.scienceprog.com/avr-gcc-tu... albo http://www.elektroda.pl/rtvforum/topic10... ale kto by to czytał 4\/3!!
Witam, mam problem z programem napisanym w code composer studio. Polega on na tym że liczbe zmienno przecinkową chce wyrzucić na wyświetlacz. poniżej zamieszczam przykładowy kod w celu zobrazowania problemu: [syntax=c] float b; int a; a=5 char buf[15]; b=a*0.079; sprintf(buf,"wartość którą chce wyrzucić na wyświetlacz%f",b); [/syntax] Po wysłaniu buff'a...
Zapewne najpierw musisz zamienic float na string... Nie znam bibliotek ale jak dawales lcdprint(tempC) to i tak bylo zle bo powinno byc lcd.print(tempC); Jak nie dziala to lcd.print(tempC) to musisz najpierw zamienic tempC na str. Z tego co wyczytalem to sprintf nie dziala dla float dlatego tez zobacz sobie funkcje dtostrf
Nigdzie na LCD nie wyświetlasz łańcucha "katy". Poza tym, żeby korzystać z sprintf dla float trzeba dokonać pewnych zabiegów: http://mikrokontrolery.blogspot.com/2011...
The total number of bytes that may be passed to this function is limited due to the memory restrictions imposed by the 8051. A maximum of 15 bytes may be passed in SMALL or COMPACT model. A maximum of 40 bytes may be passed in LARGE model. Taki sam komentarz jest przy funkcji scanf. W Twoim przypadku po przygotowaniu napisu przez sprintf wypisuj go...
Poczytaj o sprintf()
Witam, Mam pytanie czym najlepiej zamienić funkcję: rprintf((char *)res,"ADC: %0.2f V",V); Tak aby realizowała to samo zadanie. Pozdrawiam.
Masz dziwny pomiar bo do sprintf nie dołączasz biblioteki odpowiedzialnej za obsługę float. Standardowo na AVR funkcja ta tego typu nie obsługuje.
Poczytaj: http://mikrokontrolery.blogspot.com/2011...
Uzyj funkcji sprintf.
Po prostu procesor próbuje zadać Ci pytanie "czy wiesz, jaką głupotę popełniasz używając typu float?"
Zrozumiałem ;) Właśnie do tego służy funkcja printf o której napisałem. Trzeba określić format na float i precyzję na jedną liczbę. Na stronie manuala funkcji printf jest link do sprintf gdzie formatowanie jest dokładnie opisane. Pozdrawiam, Krzysztof.
Nie załączyłeś nagłówka stdio.h, poza tym kwiatki typu: UDR = ("NAPIĘCIE"); UDR = sprintf('wynik',"U=%1.3f [V]",adc); UDR to 8-bitowy rejestr i na raz możesz wysłać tylko jeden bajt. Więc np. wynik sprintf należy przechować w jakimś buforze i wysyłać bajt po bajcie. Przeczytaj jak wygląda struktura sprintf. Jeśli dajesz format f (float), a argumentem...
Witam, postaram sie opisac problem najprosciej jak to mozliwe. Mianowicie zauwazylem ze przy kompilacji z parametrami: -spec=nano.specs -u _printf_float -specs=rdimon.specs -lc -lrdimon kazde odwolanie w zadaniu do sprintf w ktorym znajduje sie float powoduje hardfault. Kiedy korzystam z biblioteki nosys bez opcji semihostingu ten problem nie wystepuje....
Najprościej to nie używaj floatów. Ja nie używam, więc w to nigdy nie wnikałem bawiąc się w C dla AVR, ale tu jest opis jak to zrobić: https://scienceprog.com/how-to-sprintf-f... Czujnik ma dokładność +/- 2oC, ADC w AVR jest 10bit, to po prostu nie ma sensu. Jak już bardzo chcesz mieć coś po przecinku na wyświetlaczu to sobie...
w jedną stronę: floatowa_zmienna = strtof(str, NULL) w drugą: sprintf(str, "%f", floatowa_zmienna) To są funkcje standardowe.
Opis dla AVR Studio [url=http://mikrokontrolery.blogspot.com...
Dokładnie tak. Kompilator wykonuje dzieleni całkowite, stąd problem. Swoją drogą, po co ładować float i specjalną wersję sprintf dla tak prostej czynności? Nie prościej pomnożyć result*1000 i podzielić przez 8192, wykonując operację na liczbach całkowitych? Na koniec tylko odpowiednio wyświetlić przecinek i cała operacja jest o jakieś 7kB krótsza i...
Witam Musisz zmienic int na float sprintf(TX_buffer,"%4.2f",(float)(0.015*... %4.2f cztery cyfry w tym 2 po przecinku. Cos takiego... nie wiem czy to rzutowanie na float jest potrzebne przy read_a2d ale nie zaszkodzi. Pozdrawiam
Raczej nic to nie zmieni. W funkcjach variadic float jest traktowany jak double (zajmuje 8 bajtów lub 2 rejestry), stąd problem. Kompilator dba o stos podczas pracy programu, ale to co dostaje na wejściu musi być wyrównane do 8-miu bajtów. Jeśli chcesz znaleźć źródło problemów, to olej na chwilę FreeRTOSa i po prostu w jakimś programiku zwykłym przetestuj...
Zapominasz, że w tej pamięci nie tylko te "floaty" siedzą (ściślej - ich obsługa) ale również obsługa uarta oraz ADC. To że masz 3 zmienne typu float o niczym nie przesądza. Przy jednej miałbyś podobnie. Oprócz tego procedura zamiany float-->str - też zajmuje swoje. W twoim przypadku wystarczyłoby abyś mnożony wynik, zapisał do liczby typu int. sprintf...
Dołacz odpowiednią bibliotekę. Opcje linkera w większosci toolchainów -u _printf_float jezeli zamierzasz skanować float-y to również -u _scanf_float Dodano po 4 Nie zauważyłem że to coocox - tam masz o ile pamiętam w konfiguracji projektu odpowiedni checkbox
wykorzystaj funkcje lacuchowa sprinf(..) to np : #include <stdio.h> .................... char s[80]; float k; sprintf (s, "%f", k); ....................
Jeśli u ciebie nie działa, to podeślij przykład z sprintf który Ci nie chodzi i sprawdzę u siebie. 4\/3!!
char wartosc sprintf odpada dla tak skromnego bufora, tymbardziej ze float/double jest w formacie. Niech ipaliwo wyjdzie z ułamkiem, to buffer overflow będzie murowany. Polecam albo skuteczne zwiększenie rozmiaru zmiennej "wartosc" (tak z dobrym zapasem - 64, 128 bajtów), albo bezpieczną wersję sprintf: funkcję _snprintf _snprintf(wartosc, sizeof(wartosc),...
Jeśli chcesz już na piechotę liczyć to pamiętaj, że w U2 jest zapisana cała liczba, a nie tylko wartości całkowite. Czyli chcąc wyświetlić tym sposobem liczby ujemne musisz ją zanegować, dodać jedynkę, wyświetlić znak "-" i dopiero Twojego sprintf'a. Nie wiem co to za procesor i jak bardzo zależy Ci na oszczędności miejsca, ale jeśli nie bardzo to najprościej...
Sprawdź w ustawieniach kompilatora (Project, Configure, C Compiler, (s)printf features). Jeśli chcesz mieć pełny format printf, to musisz tam wybrać "float, width, precision". Nie przestrasz się rozmiaru kodu wunikowego...ale coś za coś...
To nie takie proste. sprintf dla zmiennych float wymaga specjalnej biblioteki (libprintf_flt.a) i zdefiniowania paru symboli. Wersja podstawowa z avr-libc nie wspiera floatów.
Ale ty nie wysyłasz tam stringa, tylko gołe dane binarne, skanowanie nie działa, bo spodziewa się tablicy znaków w formie np. "3.1415". Wypisz sobie w LabView otrzymane dane, to będziesz miał obraz sytuacji. Albo przekonwertuj w mikrokontrolerze na string za pomocą sprintf(), albo po stronie LabView złóż te wysłane cztery bajty do zmiennej float. Prawdopodobnie...
Ja to robie tak: char temp[20]; // bufor na naszą liczbe float zamienioną na ASCII sprintf (temp, "%f", liczba_float); SetWindowText(hWnd, temp); Pozdrawiam.
Tutaj znajdziesz coś dla siebie ;) http://mikrokontrolery.blogspot.com/2011...
#include <stdio.h> . . . unsigned char bufor [10]; unsigned char dana sprintf (bufor, "%d", dana); WriteLCD(bufor); Poczytaj o formatowaniu stringow funkcja sprintf (printf) a wszystkiego sie dowiesz: jak wyswietlac w postaci hex, jak wyswietlac float, stringi etc. pozdrawiam BF
http://mikrokontrolery.blogspot.com/201... Zrobiłem tak jak w tym algorytmie, ale nie chce działać. Dodano po 13 Mam same znaki zapytania i ten sposób nie przejdzie, bo nie mam takich opcji. http://mikrokontrolery.blogspot.com/2011...
Użyj " zamiast '. Ale to chyba nie rozwiąże problemu tak jakbyś chciał;) Funkcja sprintf załatwi sprawę.
Po pierwsze nie float do char tylko float do char[]. Po drugie co znaczy najoptymalniejszy? Po trzecie dlaczego nikt z was nie chce użyć sprintf ? Albert
Chodzi raczej o wersję biblioteki, czy jest to libprintf_flt czy libprintf_min. Różnią się one wielkością (i funkcjonalnością). Być może krótsza z nich jest dla twoich potrzeb wystarczająca (nie obsługuje tylko float).
Witam, robie to tak jak opisane tutaj: czy wyświetlanie liczb o dużej precyzji (np 10 cyfr po przecinku) nie jest możliwe ?!?! Jeśli nie na AVR to na czym? A może to nie wina procka tylko kompilatora?
A dlaczego tego nie sformatujesz normalnie za pomocą np. sprintf? [syntax=c] volatile float a,x; int p; volatile char Text_Buffer[32]; x = 150; a = x/47; sprintf((char*)Text_Buffer, "%4.4f", a); p=0; while(Text_Buffer[p]!= 0) { USART_SendData(USART1, Text_Buffer[p]); p++; } [/syntax]
Zapewne ograniczeniem jest funkcja lcd_int, która sądząc po nazwie wyświetla wartości typu int, a te nie mogą zawierać części ułamkowej. Możesz to ominąć wyłuskując część ułamkową i wyświetlając ją osobno, lub używając funkcji sprintf do konwersji float na string, który potem wyświetlicz na LCD.
W Atmel studio pewnie można gdzieś wyklikać to myszką. Zgadza się: http://mikrokontrolery.blogspot.com/2011...
jeśli używasz SDCC to do float służy " printf_fast_f ". Tyle że musisz mieć napisaną " putchar " tak by czcionka była wysyłana na LCD. np. : printf_fast_f("%6.2f",pomi...
A moze problem lezy w utoa(c, buffer_n, 10); Ta funkcja chyba nie potrafi liczb zmiennoprzecinkowych obslugiwac . Uzyj sprintf do zamiany float na ascii.
Hmm, a nie zwróciła twojej uwagi w tym oknie zakładka Libraries? Wybierasz w niej libm.a i klikasz add library, nie brzmi to znajomo? Podobnie aby sprintf działało z float trzeba dodać libprintf i custom options zdefiniować podane wcześniej symbole linkera.
Bardzo niepokojące jest jak wielkie nadzieje młode pokolenie pokłada w AI. Czekam aż to "pierdzielnie" ta cała wiara i zachwyt w chat GPT. To całe wróżenie, ze za chwilę informatycy nie będą potrzebni... :D W moim przypadku chat GPT pomógł mi szybciej rozwiązać problem w przypadkach 1 na 10 albo i nawet rzadziej. W każdym innym przypadku to była strata...
Juz bol znaleziony. Wlasnie wczoraj po kilku godzinach meki znalazlem problem. Mimo ze w przykladzie CV jest uzyta funkcja sprintf do konwersji float na lancuch char to sama funkcja nie obsluguje float (moze mam jakas stara wersje stdio. Musialem zrobic najpierw konwersje float na int i pozniej skorzystanie z funkcji sprinf do zamiany int na lancuch.
Witam. Chcialem uzyc funkcji sprintf w kodzie, ale najwyrazniej program wymaga dołączenia jakis bibliotek. Standardowe bibliotek nie wystaczają, linker nie moze znalezc funkcji _sbrk itp. Czy ktos moglby wyjasnic o co dokladnie chodzi ? Dodatkowo sa tez zoptymalizowane funkcje sprintf bez uzycia floatow (oszczednosc miejsca) - jak spowodowac ze doda...
...Potrzebuje uzyć funkcji sprintf aby nie wyswietlać wszystkich liczb po przecinku... Do sformatowania-konwersji jednej zmiennej typu float , sprintf() wcale nie jest Ci potrzebna( armata i wróbel :) ).Funkcja sprintf() jest baaardzo uniwersalna i jednocześnie baaardzo pamięciożerna.Zainteresuj się funkcja dtostrf() , bo do Twoich celów nadaje się...
Sorka. Wrzuciłem kod z którym już kombinowałem trochę. [syntax=c]ADCSRA |= (1<<ADSC) | (1<<ADIF); while(! ( ADCSRA&(1<<ADIF))); temperatura = ADC; temp=(float)temperatura*0.1445; sprintf(buf,"temp: %f", temp); LCD_WriteText(buf); [/syntax] Teraz zrobiłem tak: [syntax=c]float temp=(float)temperatura*0.0049*10; int temperatura_d=...
Konwersję z liczby całkowitej na string łatwo można Sobie zaimplementować, implementacje funkcji itoa() też są dostępna, wystarczy poszukać w sieci: [url=http://en.wikipedia.org/wiki/Itoa]i... Część po przecinku też można wydobyć za pomocą itoa() wystarczy pomnożyć wynik przez wielokrotność 10 i zapisać go do integer. Warto ogólnie operować na liczbach...
Pytanie, co z ta liczbą 64 bit zrobisz? Konwersja sprintfem nie wypali. Sprintf obsługuje int i float. Double traktuje jak float wiec nie wyświetlisz tyle cyfr ile byś chciał. Bawię się w kalkulator i mam własne procedury wyświetlania/wprowadzania longów. Jednak, jak widzę, użycie "po łatwiźnie" procedur matematycznych dostarczanych z Arduino ogranicza...
do tej pory nic mi to nie przeszkadzalo ale ostatnio dodalem nowe biblioteki zgodnie z: http://winavr.scienceprog.com/avr-gcc-tu... i teraz ten blad stal sie istotny. Nie tworzy mi sie plik *.elf co w konsekwencji uniemozliwia mi skompilowanie programu z uzyciem tych bibliotek. Obszukalem...
Ponieważ operujesz na typie float (po co?) to aby sprintf działało poprawnie musisz załączyć obpowiednią bibliotekę, która dodaje obsługę %f do sprintf. W zależności od użytego środowiska robi się to różnie, m.in. w opcjach projektu.
Ja bym to uprościł: [syntax=c] int adc = pomiar(PA7); uint32_t volty = adc * 49UL * 1UL; uint8_t v1 = volty / 10000; uint8_t v2 = (volty / 100 ) % 100; ili9341_setcursor(50,40); sprintf(volt_v1,"%1d.",v1); printf(volt_v1); if(v2<10) { ili9341_write('0'); sprintf(volt_v2,"%1d",v2); printf(volt_v2); } else { sprintf(volt_v2,"%2d",v2); printf(volt_v2);...
W moim MPlab było w: Project -> Build Options ->Project -> PICC Linker -> int + long + float teras sprintf w %f daje liczbe zmiennoprzecinkową, a nie 'f', wyniki się wachają i problemu do końca ie rozwiązałem ale to już inna bajka(uśrednianie), bardzoi mi pomogło. Dzięki
Mógłbyś mi wkleić kawałek kodu jak to wysłać po RS232 ? Arduino np Pozdrawiam Coś w stylu:[syntax=c]void setup(void) { Serial.begin(9600,SERIAL_8N1); } uint32_t otime=0; float value=0; void loop(void) { char buf[24]; uint32_t nt = millis(); if (nt-otime < 500) return; otime = nt; if (Serial.available()) { sprintf(buf, "%20.6f", value += 0.01); Serial.println(buf);...
Uzywam mk 89s8252. Chce wypisac na wyswietlaczu zmienna typu float, co robie poprzez: xdata float zmienna=1.45678; sprintf(text,"%f",zmienna); wypiszLCD(text); Na wyswietlaczu pojawiaja sie jedynie same 0. :0.0000 Jesli uzyje zamiast xdata, data float zmienna=1.45678, wszystko jest oki. Czy ktos ,moglby mi powiedziec jak wyswiwietlac zmienne z przestrzeni...
Hej, Mam problem z LPC2148. Otóż nie działa mi część funkcji, związana w jakiś sposób z alokacją pamięci, np.: sprintf() z liczbami float - procek od razu "wiesza się", nie wykonuje już żadnej instrukcji za sprintf() (same operacje na liczbach float działają OK); sprintf() z liczbami int działa w porządku strtok() od razu przy pierwszym wywołaniu zatrzymuje...
Problemem jest używanie na siłę typu double, tam gdzie nie jest to potrzebne. Normalna wersja sprintf z AVRlibc jest okrojona i float/double nie wspiera. Aby to działało trzeba zlikować program z biblioteką lipprintf. Ale po co, skoro float jest niepotrzebny?
Wziąłem kod z tego artykułu http://mikrokontrolery.blogspot.com/2011... i na wyświetlaczu mam zamiast wyniku to znak ? Najprawdopodobniej przyczyną był brak poprawnego ustawienia środowiska projektu: http://mikrokontrolery.blogspot.com/2011...
Powyższe funkcje będą zawsze kiepsko działać. OW jest dostosowana do zmiennych timingów, jak popatrzysz w nocie to tolerancje są spore. W efekcie należy zawsze czekać na powrót magistrali do stanu recesywnego, aktywnie sprawdzając jej stan, a nie wrzucać jakieś magiczne opóźnienia. To dotyczy reset pulse, presence pulse, oraz sytuacji odbierania bitów....
Dla mnie Twoj sposob jest przekombinowany. Masz 776.502, mnozysz przez 1000 a dodajesz przecinek... Funkcja sprintf sluzy wlasnie do zamiany np float do postaci ASCII, ktora potem mozesz wyslac na wyswietlacz. Chyba, ze Twoja funkcja wyswietlajaca dziala na wartosciach typu int. Ale tego nie wiemy bo nie pokazales tej funkcji. BF
jest do rejestru procesora d0 A co to za rejestr? Nie słyszałem o takim Dodano po 9 za kolegą grko proponuję jednak użycie sprintf
Przebrnąłem przez ten kod :) Co do ogólnej organizacji kodu, to nie będę się wypowiadał, bo jest to rzecz subiektywna i nieco drażliwa ;) W mojej opinii nadużywasz typu float oraz operacji na tego typu zmiennych. W wielu miejscach można byłoby użyć typu uint32_t z odpowiednio skalowanymi wartościami - to nieco komplikuje kod, ale przynosi wymierne korzyści...
a mozna tez sprintfem wrzucic sfromatowany lancuch: float adc; unsigned char tmp[MAX]; adc = adc_result/1.0f; sprintf(tmp,"%f2.2 [V]",adc); oczywiscie trzeba pamietac o: -Wl,-u,vfprintf -lprintf_flt -lm
Szukam jakiegoś prostszego, lepszego sposobu na dany problem :) Pytanie na czym polega "lepszość" sposobu. Jeżeli ma być maksymalnie bezwysiłkowy, to o ile GCC na AVR-y posiada bibliotekę standardową (tego nie wiem), zastosować można fukncję sprintf(), np. w taki sposób: char buf[32]; // trochę długość na zapas, ale nie wiem jaki zakres liczb...
Witam! Wypróbuj ten kod: [syntax=c] void FloatToHex(float x) { int a; union { float f; char *h; } buf; buf.f = x; for (a = 0; a < sizeof (float); a ++) printf("%02.2x ", buf.h[a]); }[/syntax] zamiast printf() możesz użyć odpowiednika: sprintf() żeby zapisać do pamięci w formacie ASCII Pozdrawiam
Miałem wcześniej działający układ ze zmienną typu float , i użytą funkcją sprintf ale są bardzo pamięciożerne i ze względu na małą pamięć mojego atmega8 chciałbym to w jakiś sposób obejść.A odnośnie tych dzieleń to nie mój pomysł ale słyszałem że jest to potrzebne aby wyświetlić wynik pomiaru po przecinku.Co musiałbym zmienić lub dodać to mojego kodu...
Witam. Próbuje od jakiegoś czasu pojąć dlaczego dzielenie dwóch liczb zwraca mi zero, jak w kalkulatorze zwraca mi to 0,20~ float test = 2518/12512; sprintf_s(buf, "%f", test); Gdzie wynikiem jest 0.0000 Masz dzielenie stałoprzecinkowe, bo argumenty są całkowite. [syntax=c]float test = 2518.0/12512.0; [/syntax]
Nawias mi się tylko na elektrodzie wstawił. W programie go nie mam :D To na razie program testowy którym ustawiam położenie napisów na LCD. Oczywiście docelowo będzie to konwertowało zmienne typu integer a nawet float. Swoją drogą, sprintf int16_t też nie łyka. Chce koniecznie integera. Też muszę rzutować? Tutaj mogę zrozumieć. Ale przypadku z volatile...
Nie wiem w jakim srodowisku piszesz ale np. w Keilu dla 51 tez taki zapis nie przynioslby skutku, gdyz funkcja sprintf jest typu non-reentrant . Musisz zmienic zapis na: unsigned char Line[17]; float result; result=234.0/212.0 sprintf(Line, "%f", result); LCD_Write(Line); Powinno zadzialac. Pozdrawiam BF
Witam, przepraszam za późną odpowiedź. . Proszę o pomoc w następującej sprawie. 1- Muszę dopracować autoexec.bat, aby urządzenie budziło się tylko co 30 minut, pobierało odczyty i wysyłało je przez MQTT Jest to bardzo proste, wystarczy zmienić czas DeepSleep w autoexec.bat 2- Chciałbym mieć określony ładunek danych publikowany za pośrednictwem MQTT...
Na floatach wykonuje obliczenia predkosci oraz przejechanej drogi, konwersji float na char z uzyciem sprintf potem konwersja cyfry na bitmape i na LCD. Tak wiec mapy do lcd to tylko kawalek z prezentacja wynikow. Uzywam sdcc gdy daje --model-small a wiec data i idata wywala mi sie ze za malo pamieci w segmencie DATA wiec segment CODE mysle ze jest OK.
sprintf z "%.2f". Trzeba tylko zlinkować z odpowiednią wersją printf z biblioteki, żeby obsługiwała float. Kombinowanie z dzieleniem, mnożeniem i odejmowaniem floatów nie jest dobrym pomysłem, ze względu na zapis liczby zmiennopozycyjnej. Takie operacje mogą dać dziwne rezultaty, są też kosztowne obliczeniowo. Lepiej powierzyć to dedykowanym funkcjom...
Jeśli chodzi o sprintf to jak można sformatować tekst wyświetlany aby zawsze były wyświetlane dwie cyfry po przecinku nawet jeśli równają się zero np. 12.00?
print tego nie przekonwertuje lepiej, bo nie ma we float większej liczby danych potrzebnej do takiej konwersji. Serial.print() konwertuje float do string bez wykorzystania funkcji bibliotecznych typu sprintf() czy dtostrf(). Robi to "na piechotę" przez iteracyjne dzielenie przez 10 i konwersję poszczególnych cyfr do znaków. Błędy, jakie mogą się pojawić...
Hi, CRC nie sprawdzam, ale jestem w trakcie dopisywania mod wziety z http://pdfserv.maxim-ic.com/en/an/app162... W celu ulatwienia sobie zycia na poczatek obliczanie temperatury z dokladnoscia do 0.1 (bit konfiguracyjny na taka wskazuje) kod wyglada tak: res=temp_msb*256 + temp_lsb; res=(float) res/16.0; sprintf(str,"TEMP: %2.2f",res); Dziwna sprawa...
Na szybko .. nie wiem czy to optymalny sposób ale działa :) [syntax=c]#include <stdio.h> int main(int argc, char **argv) { char buf[100]; float liczba= 12.2; sprintf(buf,"%g",liczba); char *pbuf = buf; while( (*pbuf != 0) && (*pbuf != '.') ) pbuf++; if( *pbuf == 0 ) return 0; pbuf++; int j=0; if( *pbuf != 0 ) while(*pbuf!=0) { buf[j++]...
Przedewszystkim zrób to inaczej... po prostu... main() { char bufor[20]; ... funkcja(bufor, ...); } funkcja(char* bufor, ...) { } I w ogóle nie ma problemu. Zmienna tmp w ogóle jest nieporozumieniem. Przecież wewnątrz funkcji możesz sobie zadeklarowac tablicę o dowolnym wymiarze... funkcja(...) { char tablica[1000]; } A pamięć możesz zwalniać gdzie...
Może moglibyśmy dodać do tego polecenie... po prostu zmodyfikować tę funkcję, jak sądzę? [syntax=c] OBK_Publish_Result MQTT_ChannelPublish(int channel, int flags) { char channelNameStr[8]; char valueStr[16]; // allow users to force-hide some channels (those channels are NEVER published) if (CHANNEL_HasNeverPublishFlag(channel)) { return OBK_PUBLISH_OK;...
Troche się pogubiłem program pozmieniałem tak ale efekt ten sam co wcześniej czyli wartośc "0". [syntax=c] float ulamek=54.75701; u16 *ple; /***************************************... int main(void) { ple=(u16 *)&ulamek; EE_WriteVariable( VirtAddVarTab[_TP], *ple); ulamek=0; EE_ReadVariable( VirtAddVarTab[_TP], ple); sprintf(txt,"%f",...
I na terminalu pojawia mi się '0' :(. Wiem że msb i lsb są poprawnie odczytywane, natomiast wychodzi na to że floaty jako takie nie działają poprawnie. Np. deklaruję float a=4.25 i daję write_text z dtostrf i dostaje i tak 0 :/
Witam, Zacznijmy od przykładowego programu: [syntax=c] int main(void) { char Bufor[20]; float Liczba = 123.45; sprintf( Bufor, "liczba: %.2f", Liczba); while(1); return 0; } [/syntax] Tak wyglądający program skompilowany przy użyciu środowiska CrossWorks zajmuje około ~3,5kB natomiast po zakomentowaniu linijki z funkcją sprintf zajmuje ~1,5kB. Widać,...
Sprawa trochę skomplikowana inaczej. jest kilka pozycji do wyświetlenia:[syntax=c]//oblicz OCRx dla zegara T2 // OCR2= ((F_CPU/czestotliwosc_krokow) / (2*1024))-1 licznik =(float) F_CPU/czestotliwosc_krokow; //#ifdef DEBUG wys_parametr32(licznik); //#endif ----------------------------------------... void wys_parametr32(float...
Dobrze, że masz ATMEGA32, bo przy tym stylu programowania, zasoby mniejszego procka szybko by się wyczerpały - myślę o użyciu float do prostej operacji przeliczania temperatury, gdzie w zupełności wystarczy typ stałopozycyjny, lub użyciu molocha typu sprintf z typem float. No ale jeśli możesz sobie na to pozwolić to ok. Co do twojego problemu - skoro...
hmmm... jakaś taka egzotyczna ta funkcja, zarówno TextOut() i ten gcvt. Ja zawsze robiłem to sprintf() i wszystko działało tak jak trzeba, nawet precyzj sobie ustawiałem bez problemu. Problem jak już to leży po stronie wyświetlania/konwertowania, bo bazowo w typie float jak liczba jest całkowita to są zera po kropce :P
Witam, Mam dziwny problem. Za każdym razem kiedy wywołuje: sscanf(xxx,"%X",&out); lub sprintf(out,"%X",xxx); procek się resetuje i program startuje od początku.. Dla mnie to zachowanie jest przedziwne. Dodam że używam LCD Nokia przez SPI i przerwań UARTU. Ale po ich wyłączeniu dzieje się to samo za każdym razem... Próbowałem nawet innych ustawień w...
float sprintf arduino sprintf sprintf arduino
falowniki sterowanie analogowe satel perfecta zasilanie moduł zmywarka ariston hotpoint
napęd prędkościomierza napęd prędkościomierza
Centralny zamek nie działa w Fiacie Punto 2012 - prawe drzwi pasażera Schemat instalacji elektrycznej Ford Kuga MK1