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



Teraz jest 23 kwi 2026, o 06:30


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 3 gru 2015, o 11:02 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Witajcie.
Chciałbym połączyć 2 projekty ze sobą zegarek z Mirka blogu DS3231 z moim GPSem.
Problem w tym, że po połączeniu tych 2 projektów dane na UART przestają przychodzić poprawne i zegarek nie chce się ustawić. Tak sobie myślę, że DS3231 co 1s wysyła impuls na INT0 Atmgi która wykonuje przerwanie i przez to brakuje czasu na odebranie i sparasowanie ramki od GPS.
Albo przerwanie od UARTu nie może być razem z przerwaniem od INT0 - i to się gryzie
Na razie wywołuje to parasowanie przed przerwaniem z DS3231 (pamiętacie że to przerwanie jest wyzwalane co 1s z DS3231 i podawane na PD2:INT0) i niestety przy takim wywołaniu na UART spływa sieczka (dowolne losowe znaki)

Chciałbym żeby za każdym razem po załączeniu zasilania zegarek pobrał godzinę z DS3231 a w tle sprawdzał GPSa jeśli FIX będzie 1 lub 2 to sprawdzi czy godzinę i datę ma właściwą a jeśli nie to przepisze do DS3231 - po tej operacji już czasu i daty nie musi sprawdzać więc pozostanie mu tylko analiza ramki GPGGA oraz GPVTG (z prędkością) - prędkość jest co prawda jeszcze w ramce z datą ale cały czas miałem na uwadze żeby po zsynchronizowaniu nie sprawdzał tej ramki, a GPVTG jest o wiele krótsza.

Tak sobie myślę - może zwiększyć prędkośc z 11,0592 MHz do 20 :)
może przestawić GPSa na szybszy RS232 (jest 9600)
Może funkcję parasującą wywoływać też w przerwaniu zegarka co 1s.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 gru 2015, o 12:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Wrzuć main'a, to może coś poradzimy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 gru 2015, o 12:42 
Offline
Moderator
Avatar użytkownika

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

iwi napisał(a):
(pamiętacie że to przerwanie jest wyzwalane co 1s z DS3231 i podawane na PD2:INT0) i niestety przy takim wywołaniu na UART spływa sieczka (dowolne losowe znaki)

Panie - przerwanie INT może być wywoływane nawet i 100x szybciej niż co 1 sekundę i nie będzie żadnej sieczki z UART'a ... A skoro masz sieczkę to znaczy, że niestety jest ona spowodowana (bez urazy no ale tak jest) sieczką w kodzie źródłowym ... Gdy mnie coś nie działa w programie, to nie mawiam sobie, że winne jest temu jakieś przerwanie, jakiś timer, czy bóg wie jaki inny moduł w procku - tylko szukam właśnie sieczki w swoim kodzie źródłowym ....

A kolega widzę po raz kolejny upatruje czarodziejskich problemów w sprzęcie. Gdyby przerwania INTx miały przeszkadzać w pracy UART'a to kolego ;) .... toż to byłaby masakra na skalę światową a procki, które by tak miały - trzeba byłoby wywalić do kosza ;) na śmieci

iwi napisał(a):
Tak sobie myślę - może zwiększyć prędkośc z 11,0592 MHz do 20

Można - ale z punktu widzenia opisanego problemu wydaje się to być ruch KOMPLETNIE nieuzasadniony , dlaczego ? Dlatego że to co robisz to można byłoby spokojnie robić popędzając procka kwarcem 1.8432 MHz (zakładając że potrzebujesz baudrate max 38400) albo 3.6864 MHz jeśli potrzeba większego baudrate np 115200, i to działałoby bez mrugnięcia okiem .... Ba! .... gdyby procek miał obsługiwać tylko DS3231 i parsować dane z GPS'a to hmmm byłby wykorzystywany w kilku promilach swoich możliwości - a resztę czasu leżałby odłogiem do góry brzuchem nic nie robiąc.

------------------------ [ Dodano po: 3 minutach ]

iwi napisał(a):
może przestawić GPSa na szybszy RS232 (jest 9600)


to działałoby nawet na 4800 albo i 2400 jeśli twój moduł GPS może z takimi prędkościami nadawać - żadna różnica


iwi napisał(a):
Może funkcję parasującą wywoływać też w przerwaniu zegarka co 1s.

To pokazuje, że kolega niestety KOMPLETNIE nie rozumie jak działa parsowanie w oparciu o zdarzenia. W ogóle co to są zdarzenia.

Zrozum - zdarzenia EVENTS, dają to, że dane są parsowane prawie NATYCHMIAST gdy nadlecą, gdy nastąpi takie zdarzenie w procku. A to, że ty chcesz sterować czasem kiedy ma dochodzić do parsowania np co sekundę to już masakra amerykańską piłą tarczową. Dlaczego ? Dlatego, że jeśli np dane będą nadlatywały chociażby 10 razy na sekundę, a nie zmieszczą się w buforze cyklicznym to masz pan pozamiatane i tracisz kupę nadlatujących informacji.

_________________
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: 3 gru 2015, o 14:02 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Dziękuję Mirku za konstruktywną krytykę.

Najpierw wydzielę DS3231 do osobnej biblioteki bo na razie w main.c jest tego sporo.
Najważniejsze że uzyskałem odpowiedź że to nie wina procka i wydajności - a stąd było takie przypuszczenie że skoro oba projekty jako osobne działają bezproblemowo a połączone ze sobą już nie to tutaj podejrzenie padło na sprzęt. Sprawdzę jeszcze tą bibliotekę do GPSa czy czasami to parasowanie nie trwa za długo - wrzucę jakiegoś taimera i sprawdzę ile razy w ciągu sek się zinkrementuje :)
Tak więc posprzątam trochę i jak będę miał pytania to się odezwę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 gru 2015, o 23:24 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

No i miałeś rację Mirku.
Po przerzuceniu wszystkiego do osobnych plików trochę się wyczyściło w funkcji main i teraz prawie działa.
Piszę prawie bo mam problem na konwersjach typu i porównywaniu tych dat (z GPSa i RTC).
1. Czas z GPS jest w zmiennej np.
Kod:
ggmmss[7] = "233000"

Czas w DS3231 jest w BCD ale my w programie mamy uniostrukturę
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


jak teraz porównać te 2 wartości w prosty sposób.
najlepiej byłoby mi założyć taką samą unię do biblioteki GPS'a ale powiem szczerze że mnie to na razie przerasta
tak pytam na sucho na razie - zanim zacznę coś psuć - bo tak na okrędkę to można stworzyć dodatkowe zmienne tablicowe i przekopiować dane i potem je porównywać, ale pewnie będzie łatwiej wskaźnikami - tylko jak się do tego dobrać?

i drugie pytanie (tylko nie czepiajcie się że chcę być za dokładny) - na razie synchronizację zrobiłem z palca i po naciśnięciu guzika czas z GPS przepisywany jest do DS3231 - ale niestety mimo ze działa synchronizacja to zawsze jest różnica i o 1 sekundę jest opóźniony RTC
czyżby te konwersje tyle trwały
Funkcje do zapisu wyglądają tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

a dlatego się pytam bo jak już zrobie sprawdzanie czy czas GPS == czas RTC to ta 1 sekunda wyjdzie.

no i w końcu muszę dorobić obliczanie dnia tygodnia - ale to już na deser.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2015, o 10:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Musisz się zastanowić kiedy co się dzieje i jakiej dokładności potrzebujesz. Pomyśl - dostajesz ramkę z GPS, obrabiasz. Do następnej ramki (pewnie po sekundzie) masz jeden czas. Teraz tak. Ramka już troszkę ma, musisz ją zapisać do RTC i wtedy już czas z ramki GPS jest "starszy" od RTC. Prawdopodobnie tu jest ta różnica. Dodatkowo podobnie jest z odczytem i porównaniem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2015, o 12:22 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

przespałem się z tym i wymyśliłem że dokładność do 5 sekund przecież jest super wystarczająca. Dodatkowo nikt nie będzie widział czasu zarówno z GPS jak i RTC (teraz tak mam, ale to tylko testowo) więc jak ta różnica się zwiększy to wtedy przepisze czas. Dodatkowo wprowadzę zmienną w EEPROM która się będzie inkrementowała za każdym razem kiedy czas będzie zapisywany z GPS do RTC - ciekawe ile razy w ciągu roku takie przypisanie nastąpi.
A tak teoretycznie tylko się zastanawiałem czy można super idealnie to zsynchronizować.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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