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



Teraz jest 11 mar 2025, o 04:27


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 23 paź 2016, o 16:12 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 61
Pomógł: 0

Witam,
koledzy, mam taki problem, piszę sobie biblioteki do One Wire od podstaw i nie potrafię poprawnie rozwiązać problemu odczytu adresów urządzeń slave na magistrali. Funkcja ta ma realizować następujące założenia:
- zapisywać kolejny adres urządzenia do tablicy
- nie powtarzać adresów
- nie zapisywać nadmiarowych danych do tablicy.

Aktualnie eksperymentalny kod 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.


Jestem pewny, że zawiera parę podstawowych błędów, szczególnie odnośnie pracy przy tablicach i wskaźnikach. Aktualnie funkcja mniej więcej działa, tylko z niezrozumiałego dla mnie powodu funkcja opuszcza pętlę po 9, 12 albo 146 procedurach odczytu. Siedzę już nad tym trochę i nie potrafię do tego podejść ze świeżym spojrzeniem. Ma ktoś jakieś pomysły?

PS: Komentarze nie zawsze są adekwatne do wykonywanych instrukcji ze względu na ciągłe zmiany



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2016, o 16:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 cze 2016
Posty: 247
Lokalizacja: Rybnik
Pomógł: 13

A czym testujesz program? Czy to urządzenie działa bezbłędnie?

_________________
Situs != Situs



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2016, o 16:45 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 181
Lokalizacja: Kraków
Pomógł: 30

Ale czy jest sens tworzenia tych funkcji od nowa, skoro na stronie firmy Maxim-Dallas są podane gotowe algorytmy? Poniżej podaję kody, z których kiedyś korzystałem:
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: 23 paź 2016, o 19:11 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 61
Pomógł: 0

@Situs, atmega16 + LCD HD44780, zmontowane na płytce stykowej, testowane przy użyciu analizatora stanów logicznych na termometrach DS18b20. Jestem niemal pewny, że ze stroną sprzętową wszystko jest w porządku.

@janusz17
Przez pisanie wszystkiego samemu rozwijam swoją wiedzę.
Mam pełną wiedzę na temat tego co się dzieje w chwili wywołania danej funkcji.
Mam niemalże pełną kontrolę nad tym co będzie wykonywane i w jaki sposób.
Utrzymuje zgodność z innymi swoimi bibliotekami pod kątem standaryzacji nazewnictwa, komentowania oraz kompilacji selektywnej (warunkowej) wybranych bloków funkcyjnych.
Z tychże powodów uważam, że ma to sens i warto robić to po swojemu, nawet jeżeli początkowo biblioteki takie nie będą tak dobrze zoptymalizowane jak te wykonane przez kogoś innego.
Nie jestem za stosowaniem gotowców na dłuższą metę, choć zawsze stanowią one dobry punkt odniesienia dlatego też dziękuję za podane tutaj przykłady :)

Może jeszcze coś napiszę, co powinno ułatwić analizę problemu:
Elementy funkcji odpowiedzialne za odczyt pojedynczego adresu urządzenia slave działają dobrze, więc do momentu przepisania zawartości do tablicy ONE_WIRE_rom_tmp wszystko jest ok (w tym przykładzie działa to tylko dla dwóch urządzeń, ale to tymczasowo dla uproszczenia analizy). Po przepisaniu danych do wcześniej wspomnianej tablicy następuje sprawdzenie czy jakikolwiek bajt tablicy "tymczasowej" różni się od tego który został wcześniej zapisany "na stałe", jeżeli ten warunek jest spełniony to zapisuje elementy pod dalsze komórki pamięci. Ten sam blok warunkowy który odpowiada za zapis bajtów adresu do zewnętrznej tablicy, opuszcza pętlę jeżeli ówcześnie zapisany adres pokrywa się z dopiero co odczytanym adresem - jeżeli są takie same to opuszcza funkcję. Albo gdzieś w tym miejscu jest błąd związany z moim rozumowaniem, albo też ma to związek z błędnym odczytem/zapisem komórek w tablicy.

------------------------ [ Dodano po: 11 minutach ]

Teraz sobie uświadomiłem, że porównuje nowo odczytany adres jedynie z poprzednim, a iteracje 9,12 czy 146 znacznie przekraczają moją tablicę, która uwzględnia 64 bajty - czyli miejsce dla 8 adresów 64 bitowych. Problemem chyba jest to, że muszę sprawdzać nowy adres ze wszystkimi starymi adresami, bo z zasady dwa kolejne zawsze powinny się różnić. Sprawdzę to



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2016, o 20:27 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 61
Pomógł: 0

To chyba jednak nie to :/

Po kilku testach okazało się, że nie działa fragment który odczytuje kolejny adres slave, dokładniej ten fragment:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



W takim wypadku, adresy powtarzają się co 2 wywołanie, nie wiem za bardzo jak to rozwiązać w tej chwili :/



Ostatnio edytowano 24 paź 2016, o 16:35 przez Jatsekku, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 paź 2016, o 15:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 cze 2016
Posty: 247
Lokalizacja: Rybnik
Pomógł: 13

zaomniałeś [/syntax]

_________________
Situs != Situs



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: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO