Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 9 kwi 2026, o 17:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 33 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 16 cze 2014, o 17:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

Chciałbym porozmawiać na temat dekodowania C-stringów.
Mi osobiście jest to potrzebne podczas korzystania z Transceiver`ów RFM12.
Do ich obsługi wykorzystuję wiadomo biblioteki Mirka z Grennbook.

Może zacznę od przykładu, gdyż uważam że będzie łatwiej zrozumieć o co mi chodzi :)
Dajmy na to że mamy termometr ds18b20 i chcemy przesłać jego pomiar do odbiornika.
Nie będę ładować całych kodów obsługi tego czujnika, LCD, rfm12 itd. bo są one z książek Mirka.
Sprzętowo do testów tego zagadnienia używam dwóch zestawów ATB więc ładowanie schematów podłączenia procesora itd. też używam za zbędne.
Skupię się więc tylko na kluczowych funkcjach i zagadnieniach. Jeśli ktoś jednak żeby mi pomóc potrzebuje jakiś dodatkowych informacji to oczywiście uzupełnię.

Dajmy na to mamy temperaturę: 21,3 C i chcemy jej wartość przesłać do drugiego odbiornika i wyświetlić na LCD.
Wiec jak powszechnie wiadomo dane z czujnika DS odczytujemy w ten sposób:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

więc uzyskujemy zmienne:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dla temperatury przykładowej jaką przedstawiłem przyjmą one taką wartość:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No i teraz żeby przesłać je jako string przez RFM12 należy je zamienić na typ "char" , a następnie połączyć jako jedną zmienną takiego typu, a po stronie odbiornika zdekodować.
Nie wiem czy to dobry sposób ale ja tak sobie zrobiłem:

Powałem zmienne char:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Następnie w funkcji po odczycie danych z czujnika temperatury za pomocą funkcji itoa i strcat przekształcam oraz scalam w 1 zmienną typu char.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No i po takich zabiegach uzyskuję elegancką zmienną char subzero_char o wartości 0213

Jak wiadomo funkcja w Mirka bibliotece do przesłania danych przez RFM12 nazywa się : rf12_txstart
Więc za jej pomocą przesyłam moja zmienną do odbiornika w ten sposób:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No i ta zmienna się pięknie się w nim ukazuje wykorzystując do jej odczytu funkcje rf12_rxstart(); i rf12_rxfinish(dane); wpisując mi ją do tablicy
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
mam więc 0213 po stronie odbiornika, które teraz zmieniam na 21,3 C, i sobie wyświetlam na LCD w następujący sposób:
powołałem dodatkowe zmienne:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


a następnie za pomocą funkcji atoi wyświetlam sobie je na LCD:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No i to ogólnie działa elegancko, jakbym chciał sobie zrobić termometr pokojowy dla temperatur dodatnich z 1 czujnikiem to w sumie po temacie bo byłoby ok ale...


No właśnie tu dochodzimy do sedna sprawy bo zaczynają się dla mnie schody bo ja chciałbym dwa i więcej czujników, a do tego dorzucić jeszcze np. pomiary z kilku kanałów ADC.
Po stronie nadajnika to myślę że sobie załaduję dane do zmiennych, tablic przerobie na typ char i za pomocą funkcji rf12_txstart wyśle analogicznie jak w pokazanym wyżej przykładzie.

Ale tajemnica dla mnie jest jak to realizować w odbiorniku jak rozpoznawać że dane są z czujnika nr.1, 2 itd. albo z ADC itp. gdyż funkcja rf12_rxfinish wpisuje mi dane do 1 tablicy.
Myślę że stringi lecące do odbiornika mogły by wyglądać tak np.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
,
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
, a potem np. tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

No i teraz pytanie jak to odczytać? Jak sobie zaprojektować funkcje, która by czytałaby najpierw słowo, potem dane i na podstawie słowa uzupełniała odpowiednią zmienną czy tablice danymi jakie zawiera dany string ;)
Intuicja mi podpowiada, że chodzi o zagadnienie podobne do analizowania danych odebranych z UART z ostatniego rozdziału GreenBooka przy omawianiu komend AT.
Na moim poziomie wiedzy obecnej przyznam są one dość złożone i jeszcze niezbyt jasne żebym sobie tak mógł sam te funkcje zaadoptować. Chyba że jest to prostsze niż mi się wydaje.
Zwracam się w zasadzie teraz z prośbą czy byłby, ktoś wstanie mi podpowiedzieć jak napisać sobie taką funkcje lub może nawet robił coś podobnego i ma własne rozwiązanie jak czytać sobie takie zmienne tekstowo liczbowe, a potem używać ich w programie i by się nimi podzielił :). A może jest jakiś inny i prostszy sposób np. z danymi liczbowymi. Myślałem żeby np. przed wysłaniem finalnym stringa liczbowego bez liter w postaci cyfr doklejać mu jeszcze dodatkową liczbę, a później działaniem matematycznym ją w odbiorniku wyłuskiwać by trafiała do właściwej zmiennej. Pewnie pomysłów jest tyle ile jest programistów :)

No ale też możliwe jak to zwykle bywa że ogólnie wszystko" pokiełbasiłem" skomplikowałem bo prostu czegoś nie doczytałem bądź źle nie zrozumiałem i nie potrzebnie wyważam otwarte drzwi nie widząc prostego przyjemnego rozwiązania :lol: Proszę więc o wasze rady, sugestie wskazówki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2014, o 18:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Zauważyłem pewną nieścisłość w kodzie
może dlatego że jest to przykład

a więc deklarujesz zmienną
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

a później do niej "doklejasz" kolejne
przekonwertowane zmienne na char

tylko cały sklejony string ma długosc 4 (0213)
i teoretycznie nie zmieści się w subzero_char[3]
i jeszcze do tego należałoby dodać znak końca stringa,
ale nie wiem czy to konieczne przy funkcji atoi
w odbiorniku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2014, o 19:12 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

króciutko ;)

jeśli mamy:

Cytuj:
&subzero, &cel, &cel_fract_bits


to wystarczy ;)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


co my tu zrobiliśmy ;) ? .... pomnożyliśmy dziesiątki razy 10 tak? czyli jak mamy temperaturę np 23,1 stC, to na tym etapie wynik = 230 zgadza się ? ... teraz dodajemy to co po przecinku ;) i otrzymamy liczbę 231 zgadza się ;) ... no i teraz wystarczy ją pomnożyć razy -1 jeśli jest mniejsza od zero albo razy jeden jeśli większa od zero

czyli na końcu w zmiennej temperatura otrzymamy +231

a np dla temperatury -7.5 st C ile otrzymamy ? ... no łatwo zgadnąć, że -75 zgadza się ?

no to jesteśmy w domu ... teraz wystarczy zamienić liczbę typu int na łańcuch za pomocą czego ? znanej funkcji itoa() ;)

czyli

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


zgadza się ;) i już mamy w tablicy buf GOTOWY STRING z temperaturą - po co te wszystkie sklejania mniejszych łańcuchów .... jak zwykle korzystamy "troszeczkę" z metody pseudo matematycznej ;)

i wysyłamy sobie bufor ;)

czy mam mówić jak go odkodować ? ... ok króciutko - dokładnie działania w odwrotną stronę ;) czyli

załóżmy że w odbiorniku, sparsowana temperatura trafiła nam do tablicy buf ;)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i włala :lol: mamy w zmiennej int wartość np +231 albo -75 z przykładów wyżej ... co dalej

no prosto

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


wsio

PS ... można oczywiście jeszcze na milion innych sposobów

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2014, o 22:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

No proszę jakie ładne podpowiedzi :)

Ale najcieplej tematu jest jak dla mnie kolega mokrowski z wątkiem, który polecił oraz sposobem "prasowania" danych się zapoznaje. Mirek w tym temacie wskazuje na funkcje strtok() oraz strtok_r() i miejsca gdzie szukać w książkach zamierzam się doszkolić i zaproponować zmienną oraz sposób jej czytania wg. tego co się dowiem.

Zaba - tak to był tylko przykład żeby zobrazować dobrze o co mi chodzi a jednocześnie zweryfikować czy dobrze robię. Ale powiem że pomimo wartości [3] to przesyła mi się 4 cyfrowa liczba, przypuszczam że funkcja strcat(); skleja i wydłuża wartość a funkcja strcpy(); kopiuje i mogło by zabraknąć wtedy miejsca. Ale głowy nie daje i jest to tylko moje gdybanie na logikę.

mirekk36 - Mirku no Twój sposób wpisania danych do stringa jest przedni wręcz kaitalny :) prosty i skuteczny no i daje funkcjonalność liczby + oraz -. No ale sprawdza się dla 1 czujnika a ja bym potrzebował narzędzia, które by mi pozwoliło identyfikować dane z kilku czujników w odbiorniku dla temperatury ale również np. dane przychodzące z z różnych kanałów ADC I taki własnie prosty i skuteczny sposób by mi był potrzebny.
Po patrze więc na tą funkcje strtok() może mi się uda coś zrobić. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2014, o 23:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

@Intre jest jeszcze inna możliwość
wpisywane jest poza rozmiarem tablicy i
na razie działa do puki inne dane
(myślę o następnej tablicy która będzie miała
początek zaraz za subzero_char)
jej nie nadpiszą .

Ale pewności nie mam też dopiero się uczę



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 cze 2014, o 02:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

Hahaha :lol: no więc jak miło się czegoś nowego dowiedzieć nauczyć i jeszcze to zrobić i działa :) Wspaniałe uczucie :)

Do rzeczy, zrobiłem narzazie tak że dane przesyłam z nadajnika po prostu wstawiając je ręcznie stosując separator "^", symulują one dane pomiarów z 4 czujników DS.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Przesyłam je przez RFM12 no i elegancko docierają one do odbiornika wpisując się w tablice data[120];

Do ich odczytania i obrobienia utworzyłem sobie następujące zmienne oraz zdeklarowałem funkcje:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No i teraz najlepszy smaczek( jak to Mirek mówi :lol: ) i najważniejsza dla mnie funkcja w tym przypadku:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Aż mi się za prosta wydaje ale działa :)
I następnie wysyłam te dane na wyświetlacz LCD w ten sposób:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No i to tyle. 4 pomiary z czujników przez radio na LCD się ślicznie wyświetlają :)
Dziś wieczorem i popołudniu będę dorabiał prasowanie danych w nadajniku z separatorami "^" no i te pomiary z ADC :)
A jak ktoś coś widzi że można poprawić lub udoskonalić to proszę o sugestie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 cze 2014, o 06:32 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Intre napisał(a):
No ale sprawdza się dla 1 czujnika


Intre - nie, nie sprawdza się tylko dla 1 czujnika - sprawdza się nawet dla miliona czujników naraz i to bez tworzenia mega tablic ;) tzn zakładam (może źle), że chcesz za jednym zamachem przesłać dane z kilku czujników naraz

uważaj teraz:

tworzysz bufor takiej wielkości RAMKI. Czyli przykładowo jeśli to mają być TRZY pomiary naraz ;) a następnie

1. wpisujesz (kopiujesz - jak chcesz) dane z pierwszego czujnika i dodajesz PRZECINEK (czyli separator)
2. w dalszej części bufora dodajesz dane z kolejnego czujnika i PRZECINEK
3. j.w

w efekcie otrzymamy np string:

"231,-75,185"

i wysyłasz pan ten bufor ;) i nie musisz nawet oznaczać który czujnik jest który bo masz je w kolejności - rozumiesz? Twoim zadaniem po stronie odbiorczej jest TYLKO sparsować tokeny (TOKEN TO KAŻDA CZĘŚĆ STRINGA POMIĘDZY SEPARATORAMI (PRZECINKAMI)) ...

do tego właśnie możesz wykorzystać funkcje strtok() .... opisane już w Bluebooku w rozdziale o UDP/Ethernet

Czy myślisz że tokenami można przesłać TYLKO liczby ? ;) nie nie można nawet tekst ;) np:

"jakis tekst",237,-75,45,"inny tekst"

gdzie akurat tokeny z tekstem objąłem jeszcze w cudzysłowy zakładając że w tekście mogą pojawić się przecinki ....

jak widzisz możliwości są nieogranicznone - albo inaczej patrząc możliwości są ograniczone tylko naszą wyobraźnią

------------------------ [ Dodano po: 2 minutach ]

ale jakbyś chciał mieć jeszcze inną inspirację i nie stosować bufora na to aby najpierw do niego załadować KAŻDY TOKEN (już wiesz co to token) ;) ....

to można KAŻDY token (bufor) od razu wysyłać oczywiście wysyłając po nim separator np przecinek

potem czytasz pomiar kolejnego czujnika i znowu wysyłasz - również z separatorem jeśli ma polecieć kolejny

rozumiesz ? .... a po stronie odbiorczej i tak nadleci CAŁA RAMKA z tokenami tak jak w przypadku opisanym wyżej

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 cze 2014, o 09:28 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

tzn - żebym nie został źle zrozumiany, ja pisząc o tym, że nie trzeba przy wysyłaniu podawać numerów czujników wcale nie pisałem tego w kontrze do czyjejkolwiek wypowiedzi ;) ... nawet nie zdążyłem przeczytać innych ... więc proszę nie rozumieć mnie tak - że ja twierdzę - że sposób o którym mówię jest jakiś lepszy czy najlepszy czy naj- naj- naj-lepszy jak to się zdarza na elektrozgrozie

raczej tu odniosłem się do takiego prostego numerowania czujników w tablicach jak pokazał Intre

char czujnik_ds1 [120] = "0223^01";
char czujnik_ds2 [120] = "0415^02";
char czujnik_ds3 [120] = "0169^03";

to 01, 02, 03 .... to właśnie to można zastąpić ustalonym porządkiem przekazywania danych w całej ramce ;) ... i nie trzeba numerować że 1,2,3 ...itd

a co do przesyłania numerów fabrycznych czujników szczególnie tych DSxxxx to już caaaałkiem inna sprawa i ich wartości mogą być bardzo potrzebne w takim projekcie no ale jeśli to prosty projekt to mogą równie dobrze być niepotrzebne jeśli chodzi o tylko pomiary temperatury

więc z mojej strony to tylko luźne rozważania no i podpowiedzi bardziej kierunków w jakich można iść .... a własną szczegółową drogę można samemu już dalej opracować

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 cze 2014, o 10:45 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

mokrowski napisał(a):
Nie ma sensu stosować np (Ło Jezu) XML'a


chociaż wiesz - czasem dla własnej wprawy, nabycia większego skill'a ;) .... bo nawiasem mówiąc to fajnie wygląda jak taki mały duperelek 8-bitowiec - nawet gdzieś w jakimś podaje dane chociażby w CSV, a już w XML'u czy innych .... to w ogóle odjazd ...

więc wszystko ma swoje zalety - a takie dyskusje są o tyle fajne - że mogą być inspiracją do wielu różnych rozwiązań nawet jak nie na teraz to na przyszłość

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 cze 2014, o 11:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

No Mirku dokładnie można się sporo dowiedzieć, dlatego temat nazwałem od razu rozważania i pytania :)

Dziękuję wam za podpowiedzi, cel założony jaki chciałem uzyskać na tą chwilę został osiągnięty. I wg. mnie takie rozwiązanie do moich potrzeb mi wystarczy na razie gdyż nie planuje międzygwiezdnej komunikacji satelitarnej :lol: ale oczywiście póki co :lol:

Jeszcze mi się co prawda urodziło jak zrobić żeby że tak powiem kolokwialnie ifować zmienną po literkach żeby ładnie program coś zrobił na podstawie słowa literowego czyli coś w stylu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No ale już kolega rezasurmar mi podpowiedział i nakierował na takie rozwiązanie na zasadzie porównania:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

kod pobrany stąd: http://cpp0x.pl/dokumentacja/standard-C/strcmp/320

Czyli w odbiorniku sobie zdefiniuje jakby dane wzorcowe i kiedy będą identyczne to się if wykona.
Przypuszczam że zaraz mi podpowiecie kilka innych sposobów, ale ten chodź jeszcze go nie testowałem wstępnie mi się podoba :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 12:36 

Pomógł: 0

Mirku maleńki (a w sumie spory) błąd ;)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kod powinien wyglądać tak

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Bo zamiast mnożyć (cel*10)+cel_fract_bits) przez wynik działania całego wyrażenia (subzero>0)?-1:1, mnożymy go tylko przez pierwszy jej człon czyli (subzero>0).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 12:59 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rezasurmar napisał(a):
Bo zamiast mnożyć (cel*10)+cel_fract_bits) przez wynik działania całego wyrażenia (subzero>0)?-1:1, mnożymy go tylko przez pierwszy jej człon czyli (subzero>0).


Sorki ale kompletnie nie rozumiem o co chodzi ? :(

a w obliczeniach wyżej nie ma żadnego błędu bo to:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


zostanie zamienione na to

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


albo to

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w zależności czy subzero jest >0 czy może =0

więc gdzie ty tu widzisz błąd ? ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 13:00 

Pomógł: 0

Testowałeś to na żywca?, mnie w wcześniejszej postaci nie działa, wynik jest albo 1, dla dodatnich, albo -1 dla ujemnych temperatur.

Czyli tak jak niżej działa.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Może chodzić o kolejność działań.

przykład ;)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


daje wynik 2x większy, pomniejszony o jeden.

a znowu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


daje wynik prawidłowy ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 13:25 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

ale skąd ty tam tą dwójkę bierzesz ? ;) ... kurczę teraz nie mam jak sprawdzić , przecież tam jest wyrażenie warunkowe ?: ono ma silniejszy priorytet

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 13:32 

Pomógł: 0

mirekk36 napisał(a):
ale skąd ty tam tą dwójkę bierzesz ? ;) ... kurczę teraz nie mam jak sprawdzić , przecież tam jest wyrażenie warunkowe ?: ono ma silniejszy priorytet


To tylko test kolejności działań ;). Dlatego pytam, bo mnie działa jak wyżej.

Czyli bez zawiasów ;), błąd jak opisywałem, z zawiasami działa dobrze, stąd moje wątpliwości.

Po za tym zgodnie z http://pl.wikibooks.org/wiki/C/Operatory

Operator ?: ma dużo niższy priorytet niż * (mnożenie)



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 13:46 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

No ok .... ale dopiero później tzn może wieczorkiem to sprawdzę dokładnie ok ? być może jest jak mówisz

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 13:49 

Pomógł: 0

mirekk36 napisał(a):
No ok .... ale dopiero później tzn może wieczorkiem to sprawdzę dokładnie ok ? być może jest jak mówisz


Nie spieszy się ;). Po prostu się cieszę że działa :lol:, tylko zastanawiam się bo zbiło mnie to trochę z tropu.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 14:02 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

polecam codepad.org jako szybkie narzedzie do testowania takich problemow ;)

http://codepad.org/9sxsDmxw



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 14:14 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rezasurmar napisał(a):
Operator ?: ma dużo niższy priorytet niż * (mnożenie)


No OCZYWIŚCIE ;) ... dlatego KONIECZNIE potrzebny jest zawias;)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


tak jak pisałeś na początku .....

bo INACZEJ WSZYSTKO po lewej stronie od znaku zapytania było traktowane jako wyrażenie do sprawdzenia i na wyjściu dostawaliśmy albo 1 albo -1

------------------------ [ Dodano po: kilkunastu sekundach ]

charsz napisał(a):
polecam codepad.org jako szybkie narzedzie do testowania takich problemow ;)

http://codepad.org/9sxsDmxw


fajna stronka ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 14:26 

Pomógł: 0

mirekk36 napisał(a):
bo INACZEJ WSZYSTKO po lewej stronie od znaku zapytania było traktowane jako wyrażenie do sprawdzenia i na wyjściu dostawaliśmy albo 1 albo -1


O widzisz, to jeszcze inaczej niż myślałem ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 15:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

Reza nie wiem co tam kombinujesz ale ja zrobiłem sobie wyświetlanie temperatury odebranej z RFM12 tak, może Ci coś to pomoże.

//najpierw sprasowanie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


po zparsowaniu- (fragment z większego rozparsowania z innymi danymi)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.




Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 16:48 

Pomógł: 0

Spoko, na tą chwilę to co podał Mirek po poprawce działa słitaśnie ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 18 wrz 2014, o 13:58 

Pomógł: 0

[quote="mirekk36"]
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jeszcze jeden maleńki błąd
jest

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Powinno być

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 18 wrz 2014, o 14:22 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

reza tak - być może na szybko to pisałem - no ale jak widać - takie błędy każdy spokojnie sam szybko zauważy i naprawi tak jak ty to zrobiłeś ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 wrz 2014, o 14:24 

Pomógł: 0

mirekk36 napisał(a):
reza tak - być może na szybko to pisałem - no ale jak widać - takie błędy każdy spokojnie sam szybko zauważy i naprawi tak jak ty to zrobiłeś


Próbuję tylko to uruchomić :). Jest jeszcze parę kwiatków w bibliotekach RFM12, dla nie uważnych :lol:



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 18 wrz 2014, o 14:32 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rezasurmar napisał(a):
Jest jeszcze parę kwiatków w bibliotekach RFM12, dla nie uważnych


to podpowiedz gdzie ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 wrz 2014, o 14:51 

Pomógł: 0

Cytuj:
to podpowiedz gdzie ?


Tj. Biblioteka jest w porządku jako przykład do zielonej książki.
Tylko w przypadku użycia int2 np.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Nie ma problemu ;)

Tylko że RF_PORT jest portem softwerowego SPI, dla INT0 trzeba wpisać PORTD ;), ja wiem, że to niby oczywista oczywistość, ale będąc początkującym można przy przestawianiu portów dla INT2/1/0 (gdyż są one na innych PORTach ;) ) można się zdziwić.
Ogólnie rzecz biorąc biblioteka w/g schematu z książki działa wyśmienicie. Natomiast przy zmianach, trzeba uważać i tyle ;).
Ale już mam szatański plan by wprowadzić modyfikacje podobne jak dla LCD, by wszystko można było zrobić przez jedną "zmienną" preprocesora, a reszta za pomocą #if #endif się już skonfiguruje, by nie trzeba skakać po pliku przy zmianie konfiguracji pinów.
To pierwsza sprawa.

Druga, to czy zauważyłeś taki problem, że po zmianie parametrów dotyczących RFM bezpośrednio, jak kanał itp. trzeba wyłączać zasilanie?, bo sam reset nie starcza.
Czy to problem softwerowego SPI? czy szukać problemu po stronie inicjacji RFM?



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 18 wrz 2014, o 15:02 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rezasurmar napisał(a):
Tj. Biblioteka jest w porządku jako przykład do zielonej książki.
Tylko w przypadku użycia int2 np.


no ale o tym jest co nieco już w erracie zdaje się

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 paź 2014, o 13:04 

Pomógł: 0

mirekk36 napisał(a):
rezasurmar napisał(a):
Tj. Biblioteka jest w porządku jako przykład do zielonej książki.
Tylko w przypadku użycia int2 np.


no ale o tym jest co nieco już w erracie zdaje się



Nie wszystko, bo sam zmieniałem na procesor 644 i niestety nadal problem z koniecznością on/off występuje ;).

To jest tak jak człowiek chce po swojemu, Intre nie ma tego problemu bo ma podłączone zgodnie z książką. U mnie będzie tinka dlatego rzeźbię w ustawieniach ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 14 paź 2014, o 13:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

Wcale bo nie prawda ja mam to na Atmedze 128 :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 33 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 12 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO