AVR C poszukiwany odpowiednik funkcji ulltoa()

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?

Reply to
Bo(o)t manager
Loading thread data ...

przepraszam za śmiałość, ale gdzie tu jest pytanie?

Reply to
platformowe głupki

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

Reply to
Arkadiusz Kaczmarek

Po pierwsze dlaczego ultoa ma pomagać a komparacji numerów seryjnych?

Po drugie numery seryjne 1Wire sa naturalnie prezentowane w hex.

Reply to
Sebastian Biały

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.
Reply to
Bo(o)t manager

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.

Reply to
Sebastian Biały

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)

Reply to
Bo(o)t manager

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.

Reply to
Bo(o)t manager

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.

Reply to
Waldek Hebisch

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.

Reply to
Piotr Gałka

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.

Reply to
J.F.

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.

Reply to
Piotr Gałka

Szczególnie, że ten AVR jest 8 bitowy

Reply to
Marek

On Mon, 07 Mar 2016 11:46:49 +0100, Piotr Gałka napisał/a:

[ciach]

Dokładnie to uint64_t z biblioteki inttypes.h

Reply to
Bo(o)t manager

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.

Reply to
Piotr Gałka

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? :-)

Reply to
__Maciek

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;

}
Reply to
Bo(o)t manager

Po prostu siadasz i piszesz. I masz własną utoa.

Reply to
slawek

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.