AVR C poszukiwany odpowiednik funkcji ulltoa()

Mar 06, 2016 17 Replies

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?


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