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



Teraz jest 29 mar 2024, o 01:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 25 wrz 2018, o 21:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Witam , problem dotyczy pewnej funkcji , którą napisałem jednak jest bardzo nie elegancka programowo.
Opiszę dokładnej o co mi chodzi.
Pewna grupa impulsów określa w urządzeniu jaka jest wyświetlana wartość cyfry na wyświetlaczu 7-mio segmentowym , przykład na rysunku:

Obrazek

Jak widać na rysunku każda wyświetlana liczba różni się zarówno ilością , jak i szerokością impulsów , które jednak dają się porównać.
Do tego celu uruchomiłem przerwanie ICP , w którym cały ten przebieg karmię zmienną globalną

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 stworzyłem własną funkcję do odczytu :lol:

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


Funkcja wprawdzie zwraca wynik , ale sami widzicie jak to wygląda :(
Podpowiedzcie jak to zrobić na trochę wyższej jakości programowania chodzi również o zmniejszenie kodu , żeby nie zajmował tyle pamięci.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 wrz 2018, o 05:42 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Może stworzyć w pamięci tablice wzorców danych łańcuchów i porównywać je z ramką która nadleci.
Przy czym każda komórka wzorca to znak odpowiadający danemu zakresowi od-do
dajmy na to:
między 29 a 32 wartość we wzorcu = 'A'
między 45 a 55 = 'B'
i tak dalej.
Tworząc ramkę w przerwaniu też ustalasz zakres przyleciał impuls mieszczący się w zakresie to wpisujesz daną wartość
Potem w pętli porównanie łańcuchów i w przypadku zgodności wzorca z tym co przyszło stop pętli wartość zmiennej która inkrementuje pętlę wystawiasz jako wynik.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No trzeba by powalczyć z tablicą wskaźników do łańcuchów tekstowych. Ale widzę że masz GB.
Popatrz na parsowanie komend AT. Tam jest jak stworzyć łańcuchy we flash-u i jak je porónywać.
W funkcji:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jest ładnie wszystko pokazane.
Masz napisanego gotowca prawie na wyciągnięcie ręki na półkę z książką :)

P/S
Jadąc do pracy tak sobie pomyślałem że można było by ze wzorca wywalić czasy przerwy i zostawić tylko czasy impulsów.
Może to by wystarczyło do identyfikacji a skróciło by łańcuchy o połowę.
Patrząc na zdjęcie wzorcem mogłaby być tablica składająca się z około 20 znaków.

P/S 2
Ale mnie to męczy ten Twój problem.
Zauważyłem jeszcze coś.
Czas trwania pierwszego zera jest taki sam we wszystkich ramkach
Tak samo czas trwania ostatniego zera, wygląda na taki sam.
Można jeszcze pokombinować tak: zera to małe litery, impulsy to duże
Czyli ramka testowa wyglądała by na przykład tak:
aCCABBCDb
Każda inna przerwa niż 'a' lub 'b' to 'c'
Badamy tylko zero początkowe i końcowe oraz długości impulsów.

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 wrz 2018, o 10:03 
Offline
Użytkownik

Dołączył(a): 04 cze 2013
Posty: 33
Pomógł: 0

Nie wiem czy to Ci ułatwi sprawę, ale po przeanalizowaniu sygnałów, wydaje mi się, że można jednoznacznie zidentyfikować cyfrę po ilości impulsów oraz długości trwania drugiego i ostatniego. Za impuls traktuję przejście w stan wysoki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 wrz 2018, o 19:49 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

A mi to wygląda na zwykłą transmisję UART. Nie wiem jaki masz analizator, ale próbowałeś włączyć analizator transmisji szeregowej asynchronicznej. Spróbowałbym ustawień standardowych: 8 bit, 1 bit stopu, bez parzystości, LSB jako pierwszy, AutoBaud podejrzewam 128000 baud, ale nie jestem pewien - jeśli masz możliwość włącz autodetekcję.
No i nie zaszkodziłoby zwiększenie częstotliwości próbkowania, jeśli masz możliwość.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 paź 2018, o 08:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Bardzo dziękuję za podpowiedzi, wątek jest dalej aktywny ja się tylko teraz doszkalam, jednak proszę o zwrócenie uwagi na jeden fakt.
Impulsy są tak ustawione że przesuwają rejestr przesuwny i w momencie kiedy impulsy wysterują rejestrem w taki sposób że zapalone odpowiednie segmenty wyświetlacza led zaświecą w odpowiednich
dla siebie pozycjach następuje zatrzask i wyświetlacz wyświetla cyfrę aż do nadejścia kolejnej itd,



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 paź 2018, o 11:01 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

AKSELINEK napisał(a):
jednak proszę o zwrócenie uwagi na jeden fakt.
Impulsy są tak ustawione że przesuwają rejestr przesuwny i w momencie kiedy impulsy wysterują rejestrem w taki sposób że zapalone odpowiednie segmenty wyświetlacza led zaświecą w odpowiednich dla siebie pozycjach następuje zatrzask i wyświetlacz wyświetla cyfrę aż do nadejścia kolejnej itd

A skąd mieliśmy znać ten fakt, żeby na niego zwrócić uwagę?
Jaki to rejestr przesuwny, jeśli można wiedzieć?
Rejestr przesuwny wymaga dodatkowego sygnału zegarowego (informującego o tym, w którym momencie przesunąć dane), czyli można przyjąć, że to transmisja synchroniczna. Przy transmisji synchronicznej czasy trwania impulsów są (przynajmniej w przypadku rejestru przesuwnego) bez znaczenia, istotne są zbocza sygnału zegarowego, który to sygnał należy wykorzystać, by prawidłowo odczytać przesyłane dane.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2018, o 10:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Bardzo dziękuje za zainteresowanie tematem, kiedyś analizowałem to dokładnie jednak nie miałem jeszcze analizatora stanów, może te zapisy trochę naświetlą temat.

Obrazek

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2018, o 12:53 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Czyli jest tak, jak napisałem. Oprócz linii danych musisz tam mieć sygnał zegarowy. Musisz obydwa te sygnały podłączyć do mikrokontrolera (ewentualnie można też sygnał STROBE, jeśli masz do niego dostęp). Sygnał CLK najlepiej podłączyć pod wejście mogące generować przerwanie (np. INT0). Tworzysz sobie zmienną, do której będziesz odczytywał dane. W momencie zanotowania zbocza narastającego na CLK przesuwasz zmienną w lewo (lub w prawo), odczytujesz stan panujący na linii danych i zapisujesz jego wartość do najmłodszego (lub najstarszego) bitu Twojej zmiennej. Po odebraniu wszystkich bitów danego pakietu w Twojej zmiennej będzie odebrany ciąg bitów, który możesz sobie analizować.

Analiza czasów trwania impulsów nic Ci tu nie da, bo przy transmisji synchronicznej nie jest gwarantowane, że czas trwania poszczególnych bitów (czyli czas pomiędzy dwoma kolejnymi zboczami narastającymi sygnału zegarowego) jest zawsze taki sam.

Na początek podłącz sobie do analizatora sygnały CLK i DATA (ewentualnie również STROBE), zarejestruj i przeanalizuj jakąś transmisję. Na tej podstawie będzie można stworzyć prawidłowy algorytm programu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2018, o 09:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Bardzo ciekawy opis i bardzo dziękuję koledze andrews , ale problem jest tym że moje urządzenie ma czytać tylko impulsy , ja nie chcę ingerować w układ wenętrzny .
Urządzenie mi działa - tylko jest niedbale napisane.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2018, o 10:24 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Trochę to dla mnie dziwne, że masz dostęp do linii DATA bez ingerencji w układ wewnętrzny, a nie masz do linii SCK. One powinny być obok siebie. Skoro jednak urządzenie działa, to już bez znaczenia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2018, o 17:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Problem jest trochę inny , w podanym układzie pracują dwa osobne moduły oddalone od siebie kilka metrów informacja i komunikacja między nimi idzie poprzez magistrale danych .
Ja chcę odczytywać i przetwarzać informację tylko z tego punktu (z tej magistrali )i takie mam założenie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2018, o 17:56 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

AKSELINEK napisał(a):
Problem jest trochę inny , w podanym układzie pracują dwa osobne moduły oddalone od siebie kilka metrów informacja i komunikacja między nimi idzie poprzez magistrale danych

Właśnie o to mi chodzi że przedstawiłeś za mało danych o urządzeniu, a lepiej jest zidentyfikować, jaka to magistrala (ile przewodów, jakie poziomy napięć, jakie dokładnie układy podłączone są bezpośrednio do tej magistrali), bo najprawdopodobniej, zamiast tej całej gimnastyki z pomiarem czasów, a później ich analizą za pomocą tych nieszczęsnych ifów, wystarczy użyć odpowiedniego interfejsu komunikacyjnego (zapewne wbudowanego w mikrokontroler), odczytać to, co jest przesyłane po magistrali i wyłowić tylko te dane, które są przesyłane do konkretnego odbiornika. Jeśli na magistrali są tylko dwa wyświetlacze i jakiś nadajnik (zapewne jakiś mikrokontroler), to protokół transmisji nie będzie szczególnie skomplikowany, skoro jakoś udało Ci się zdekodować to poprzez analizę czasów.

Nie obraź się, ale mam po prostu wrażenie, że niepotrzebnie komplikujesz sobie życie, a problem można rozwiązać dużo prościej, nie mówiąc o tym, że Twoja analiza czasów niekoniecznie musi działać stabilnie i pewnie.

Nie chcę Ci oczywiście tutaj nic narzucać. Jeśli Twoje rozwiązanie spełnia Twoje oczekiwania, to nic nie stoi na przeszkodzie, żebyś z niego korzystał. Chciałem Ci tylko pokazać, że prawdopodobnie niepotrzebnie poszedłeś okrężną drogą, bo być może wyciągniesz z tego jakieś wnioski.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2018, o 21:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 546
Pomógł: 0

Może metoda jest pół okrężna , bo nie chodzi tu tylko o przypadkowe czasy (chociaż tak może to wyglądać) , ale zwróć uwagę że analizę rozpocząłem od 13 impulsu na w/w porównaniu graficznym .
Zwróć uwagę że np. cyfra 1 ma w 16 i 20 impulsie krótki czas i ten krótki czas określa które segmenty świecą(czyli B i C) - cały wyświetlacz składa się 7 segmentów .
Dla porównania cyfra osiem ma zaświecone wszystkie segmenty czyli 7 i impulsów krótkich na porównaniu graficznym jest dokładnie 7 , a cyfra dziewięć ma jeden zaświecony segment mniej i tak samo
odpowiednio jest 6, wróć na to uwagę bo w tym porównaniu to fajnie widać.

Obrazek

Ciesze się że zainteresowałeś się tematem , czy zgodzisz się ze mną że występowanie tych impulsów w danym momencie nie jest przypadkowe i zawsze jest zachowana zasada.
Jak zobaczę na oscyloskopie ramkę to zawsze odczytam jaką cyfrę określa , nawet zrobiłem ćwiczenia, czy zgodzisz się ze mną?
Układ nadawczy składa się z mikrokontrolera , a po drugiej stronie są rejestry przesuwne i drajwery z wyświetlaczami i nie ma tam mikrokontrolera.
Ciekawe jest też to że impulsy mniejsze niż 13 działają w drugą stronę to znaczy do mikrokontrolera leci informacja jaki przycisk w klawiaturze został naciśnięty(nie pokazałem tego na rysunku graficznym, ale też zanalizowałem).
Co do stabilności to jest ok ale procesor musiał mieć prędkość 16 Mhz Attmega 32, bo przy mniejszej nie widział tych krótkich impusów. (zbyt długi był kod w przerwaniu ICP).



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 8 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