Cześć! Mam mały problem, otóż bawię się z termometrem DS18b20 i udało mi się dopisać do biblioteki odczytywanie numerów seryjnych(z pomocą tablicy). Chciałbym zrobić to za pomocą zmiennej 64bitowej(łatwiej mi będzie porównywać numery seryjne(w każdym razie tak mi się wydaje)) i tu mam problem - konwersja ultoa() obsługuje max. 32 bitowe liczby, a ja potrzebuję przekonwertować 64bity(dla wyświetlacza). Niestety ulltoa() brak. Kompilator to avrgcc. Ma ktoś z Was pomysł jak to ugryźć? Bo mnie na razie do głowy wpadł pomysł na podzielenie w/w zmiennej na 2 zmienne 32bitowe i potem na babranie się z wyświetlaniem tego, ale może da się łatwiej?
AVR C poszukiwany odpowiednik funkcji ulltoa()
Mar 06, 2016
17 Replies
przepraszam za śmiałość, ale gdzie tu jest pytanie?
W dniu 2016-03-06 o 18:21, platformowe głupki pisze:
To takie zdanie, gzie na końcu jest " ? " :) Widziałem tam takie :P
Po pierwsze dlaczego ultoa ma pomagać a komparacji numerów seryjnych?
Po drugie numery seryjne 1Wire sa naturalnie prezentowane w hex.
On Sun, 06 Mar 2016 18:46:54 +0100, Sebastian Biały napisał/a:
To do odpluskwiania przy okazji(składam te parę bajtów do kupy i wyświetlam), a poza tym wydaje mi się że łatwiej było by porównywać dwie
64bitowe zmienne niż dwie tablice 8 bajtowe.
Tak samo jest w hex. O tyle lepiej że zajmuje mniej miejsca i czasu cpu. Prezentacja tych numerów w dec jest absurdalna bo nie ma to żadnych zalet za to ma wady (np. jest dłuższe).
A jaka jest róznica między nimi? 8 bajtów to 64 bity.
Ja widze że próbujesz skonwertować do napisów dwie liczby i porównać
*napisy*. Gorzej chyba nie da się już zrobić.Porównaj 8 bajtów i koniec.
On Sun, 06 Mar 2016 19:50:46 +0100, Bo(o)t manager napisał/a:
Samo ultoa do komparacji raczej nie pomoże, ale jak wiem co mi się dzieje w środku(co widzę na lcd to mi pomaga).(to tak gwoli wyjaśnienia)
On Sun, 06 Mar 2016 20:07:40 +0100, Sebastian Biały napisał/a:
Chciałem to zrobić trochę inaczej: utworzyłem 64b uinta. Potem chciałem zrobić tak: dokleić na końcu bajt z tablicy potem uinta przesunąć w lewo o 8 bitów, znów dokleić na końcu, znów przesunać itd. Na końcu mam 64 bitowego uinta do porównania z drugim u64 tym w epromie. Ale faktycznie może porównać tablice bajt po bajcie.
Nie rozumiem co kombinujesz: jak masz tablice 8 bajtow i uint64_t to po prostu wzywasz memcmp. Jak chcesz przerobic jedno na drugie to wzywasz memcpy.
Użytkownik "Bo(o)t manager" <bo.o.t snipped-for-privacy@WYTNIJTOpoczta.wp.pl> napisał w wiadomości news: snipped-for-privacy@autostopem.przez.galaktyke.org...
na PC pod Builderem jakbym miał porównać dwie tablice (byte t1[8], t2[8]) to zrobiłbym: if(*(qword*)t1 == *(qword*)t2)... (typy byte i qword to moje typedef). P.G.
Użytkownik "Piotr Gałka" napisał w wiadomości grup dyskusyjnych:nbjl0r$55a$1$ snipped-for-privacy@news.chmurka.net...
Ale czy AVR przepusci ten qword ?
W 16-bitowym uP C moze nie miec zadnego 64-bitowego typu.
J.
Użytkownik "J.F." <jfox snipped-for-privacy@poczta.onet.pl> napisał w wiadomości news:56dd5ad7$0$699$ snipped-for-privacy@news.neostrada.pl...
Wychodziło, że ma jakiś typ 64 bitowy ale pisząc nie chciałem szukać jaka nazwa występowała. P.G.
Szczególnie, że ten AVR jest 8 bitowy
On Mon, 07 Mar 2016 11:46:49 +0100, Piotr Gałka napisał/a:
[ciach]Dokładnie to uint64_t z biblioteki inttypes.h
Użytkownik "Marek" snipped-for-privacy@fakeemail.com napisał w wiadomości news: snipped-for-privacy@news.neostrada.pl...
Poszukałem. Cytat z autora wątku:
---------------- Chciałem to zrobić trochę inaczej: utworzyłem 64b uinta.
---------------- Znaczy, że ma jakiegoś 64 bitowego uinta. P.G.
Sun, 6 Mar 2016 18:10:11 +0100 "Bo(o)t manager" <bo.o.t snipped-for-privacy@WYTNIJTOpoczta.wp.pl> napisał:
Ale po grzyba tak? AVR jest 8bitowy i najlepiej radzi sobie ze zmiennymi typu char. Potraktuj te seriale po prostu jako char[8]. Porównanie to przecież banalna sprawa:
char owserialcmp(char * ser1, char * ser2) { char n;
for(n=0;n<8;n++) if(ser1[n]!=ser2[n]) return(0); return(1); }
Wyprowadzanie takich danych jako hex to też prosta sprawa.
A jakby tak ten numer seryjny był 1024-bitowy? Próbowałbyś zastosować uint1024_t? :-)
On Sun, 06 Mar 2016 18:10:11 +0100, Bo(o)t manager napisał/a:
Dzięki wszystkim za pomoc. Zrobiłem klasycznie(chyba).
uint8_t sprawdzSN(void){ uint8_t i = 0, ii, wynik = 0; odczytSN(); for(ii = 0; ii < 8; ii++){ GotoKsiazka(0,7); for(i = 0; i < 8; i++){ a = ram_dane.adresDSb[ii][i]; b = adresDS[i]; if(ram_dane.adresDSb[ii][i] == adresDS[i]){wynik
+= 1; } else{ wynik = 0; }} if(wynik == 8){ tekst("czujnik juz zapisany"); break; tablica_zajetosci_epromu[ii] = 1;} } GotoKsiazka(0,0); if(wynik != 8){ tekst("czujnik niezapisany"); tablica_zajetosci_epromu[ii] = 0;} return wynik;
}
Po prostu siadasz i piszesz. I masz własną utoa.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required