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



Teraz jest 30 mar 2024, o 09:51


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 24 lip 2017, o 10:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

Witam.

Posiadam dwa układy zawierające w sobie procesorki jak w temacie.
Wgrywam do nich ten sam program, mają taką samą konfigurację.
Uruchamiam na nich program, w którym pewna zmienna inkrementowana jest w zakresie od 0-59(sekund) z krokiem 1 sekunda.
Problem tkwi w tym, że po minucie mam już prawie 2 sekundy rozjazdu pomiędzy nimi (sprawdzone poprzez podglądanie zmiennych poprzez UART).

Czytałem o rejestrze OSCCAL. Podłączyłem więc programator do obydwu egzemplarzy i odczytałem wartość tego rejestru.
Jedna z nich to 0x52 (dla pierwszego egzemplarza) a dla drugiego 0x92.
Zgodnie z informacjami zawartymi w nocie katalogowej różnica w taktowaniu dla tych wartości to aż 1MHz co może dawać te dwie sekundy różnicy pewnie.
Zmieniłem zatem wartość jednego z egzemplarzy tak, aby była taka sama jak w drugim, ale dalej jest taki rozjazd czasowy.

Proszę o pomoc.

------------------------ [ Dodano po: 26 minutach ]

Chyba źle interpretuję ten OSCCAL.
Zrobię tak jak jest w BB w rozdziale "Inicjalizacja kalibracja". Zobaczymy co będzie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2017, o 10:59 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 544
Pomógł: 27

Poszukaj poradnika Mirka o attiny 10 i analizatorze logicznym jeden z nowszych poradników Mirek dość szeroko tam pokazuje podejście do wewnętrznego oscylatora jak to zmierzyć itp.

Poza tym to złe podejście do sprawy bo częstotliwość takiego generatora jest bardzo zależna np od temperatury napięcia zasilania i wielu innych czynników .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2017, o 11:25 
Offline
Moderator
Avatar użytkownika

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

matej1410 napisał(a):
Problem tkwi w tym, że po minucie mam już prawie 2 sekundy rozjazdu pomiędzy nimi (sprawdzone poprzez podglądanie zmiennych poprzez UART).


Panie panie - jakby to miało zależeć od OSCAL to byś niczego nawet na UART nie zobaczył tylko jakieś śmieci

Rzeczywiście źle interpretujesz OSCCAL ponieważ on ma związek TYLKO I WYŁĄCZNIE - z taktowaniem procka za pomocą wewnętrznego oscylatora a ty NAWET nie piszesz w jaki sposób taktujesz procka.... Jeśli z zewnętrznego kwarca - to próba zmiany wartości OSCCAL da ci tyle co nic ...

Jeśli zaś masz taktowanie z wewn. oscylatora to opisane przez ciebie objawy mówią tylko o tym, że coś bardzo mocno a wręcz tragicznie mocno przekombinowałeś w projekcie ... opisz więc co robisz - i jaki jest cel programu żeby można było pomóc jakoś

Poza tym KAŻDY egzemplarz procka może mieć i w większości przypadków ma inną wartość OSCCAL i to nie jest nic dziwnego - wręcz normalne bo po to jest ten rejestr żeby fabryka mogła skalibrować wewn. oscylator do prawidłowej pracy


Autor postu otrzymał pochwałę

_________________
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: 24 lip 2017, o 14:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

Mikrokontroler taktuję z wewnętrznego oscylatora.
Program działa tak, że zrobiłem sobie takiego pseudo watchdoga tzn. jeżeli licznik zliczy do 60 to następuje wywołanie pewnej funkcji, jeżeli licznik zostanie zresetowany np. przez użytkownika i nie doliczy do 60 to zaczyna od zera, i tak w kółko.
Problem jest taki, że mam kilka osobnych układów (w każdym ten sam procesor i ten sam program), resetowane są wszystkie naraz i na 100%, zawsze mają wspólny punkt czasowy "Zero". Obserwuje sobie te zmienne licznikowe dwóch egzemplarzy no i jak nic jeden "Działa wolniej od drugiego".

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

Zauważyłem, że zmianiając wartość OSCCAL niejako udaje mi się przyspieszyć albo opóźnić prace procesora, zgodnie z tym Mirku co pokazałeś w swoim poradniku, ale czy to znaczy, że będzie trzeba badać i kalibrować 1000 urządzeń z osobna, bo każde jest nieskalibrowane?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2017, o 16:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Ale nie wiem czy wiesz, częstotliwość wewnętrznego oscylatora rc dosyć mocno zależy od temperatury, i zasilania. Wartości w rejestrze OSCAL zazwyczaj są różne, ponieważ na etapie produkcji procka wewnętrzny oscylator ma duże rozrzuty i po wyprodukowaniu rezonator jest dostrajany właśnie poprzez zapisanie takiej wartości OSCAL by mieścił się w założonej dokładności dla takiego oscylatora. A jak się przyjrzysz nocie to zauważysz że dokładnością to one nie grzeszą.
Więc odpowiadając na twoje pytanie: Tak musiałbyś kalibrować każde urządzenie. Oscylatory kwarcowe zostały wymyślone właśnie po to by poprawić stabilność taktowania gdy takowa dokładność jest potrzebna (a w dużej ilości przypadków taka dokładność jest po prostu zbędna) i jeśli chcesz mieć zbliżone parametry budowanych urządzeń to wykorzystaj do tego kwarc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2017, o 18:05 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 544
Pomógł: 27

Cytuj:
i jeśli chcesz mieć zbliżone parametry budowanych urządzeń to wykorzystaj do tego kwarc.


A jeśli zależy ci na tym aby wszystkie te urządzenia resetowały się w tym samym czasie to musisz podejść całkowicie inaczej to tematu .
Ja bym to zrobił tak jedno urządzenie jako master i te by odliczało czas poza tym obustronna komunikacja między masterem a resztą urządzeń.
master odpytywał by slave a w razie braku odpowiedzi reset. można też użyć układów RTC ale to też będzie się rozjeżdzać chyba że zrobisz synchronizację z serwerem czasu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2017, o 18:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

tonygryps napisał(a):
Cytuj:
i jeśli chcesz mieć zbliżone parametry budowanych urządzeń to wykorzystaj do tego kwarc.


A jeśli zależy ci na tym aby wszystkie te urządzenia resetowały się w tym samym czasie to musisz podejść całkowicie inaczej to tematu .
Ja bym to zrobił tak jedno urządzenie jako master i te by odliczało czas poza tym obustronna komunikacja między masterem a resztą urządzeń.
master odpytywał by slave a w razie braku odpowiedzi reset. można też użyć układów RTC ale to też będzie się rozjeżdzać chyba że zrobisz synchronizację z serwerem czasu.


Niestety nie ma takiej możliwości urządzenia będą pracowały w odległości kilkudziesięcu metrów od siebie.
Urządzenia resetują się w tym samym czasie. Rozjeżdżają się w miarę inkrementacji zmiennej licznikowej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2017, o 06:51 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 544
Pomógł: 27

I będą się rozjeżdżać nawet po ustawieniu rejestru OSCCAL ponieważ generator wewnętrzny nie jest do takich zastosowań (duża rozbieżność pod wpływem zasilania temperatury i to w każdej atmedze inaczej ) nawet na kwarcu będzie się rozjeżdżać co prawda dużo mniej ale będzie ba nawet na RTC tylko tu już w skali miesiąca .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2017, o 11:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

Udało mi się skalibrować zgodnie z tym:
http://www.atmel.com/Images/Atmel-2555- ... AVR053.pdf
Mam na tacy podaną wartość jaką należy wpisać do rejestru OSCCAL. Urządzenia chodzą równiusieńko.
Problem jest teraz inny. Jak wpisywać te różne wartości do poszczególnych egzemplarzy urządzenia? Za wszelką cenę chciałbym, aby program wgrany do procesora był taki sam dla każdego egzemplarza.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2017, o 13:32 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 544
Pomógł: 27

Cytuj:
Udało mi się skalibrować zgodnie z tym:
http://www.atmel.com/Images/Atmel-2555- ... AVR053.pdf


Ja nie powiedziałem że się nie da z kalibrować tylko że to się i tak rozjedzie z biegiem czasu (no chyba że to ma zadziałać tylko chwilę )
co do zapisu to niestety ale dla każdego procesora musisz ustawić OSCCAL indywidualnie na początku funkcji main.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2017, o 16:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

możesz ewentualnie zrobić funkcję kalibracji w samym programie, i np wartość OSCAL jaka wyjdzie w kalibracji zapisać do EEPROMU badź flash (jak to Mirek pokazał w yellowbooku).
Samą funkcję kalibracji można zrobić na różne sposoby, w oparciu o transmisję uart (jak w ćwiczeniu z bluebooka odnośnie UARTA) albo zrobić sobie (bądź wykorzystać posiadany) wzorcowy generator który podczas kalibracji można podać na wejście licznika i program zwiększając bądź zmniejszając wartość OSCAL będzie dążył do tego by wartość zliczonych impulsów w jednostce czasu się zgadzała. Zapewne sposobów na taką kalibrację znajdzie się jeszcze wiele...


Autor postu otrzymał pochwałę


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

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