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



Teraz jest 21 mar 2026, o 14:15


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 1 wrz 2014, o 00:15 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Witam, ostatnio szybko udało Wam się rozwiązać mój problem ze źle działającym odmierzaniem czasu za co bardzo dziękuję. Teraz mam kolejny problem i liczę na Waszą pomoc.

Cały czas próbuję zrobić zegarek ale mam problem z właściwym odmierzaniem sekundy (albo jej części). W trybie CTC na wewnętrznym taktowaniu 8MHz mam błąd 12 sekund na każde 20 min.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Pomyślałem, że jest to wina niedokładnosci uC, więc zabrałem się za oscylator zewnętrzny zegarkowy (32768 Hz). Na początku ustawiłem odmierzanie za pomocą przepełnienia (nie mam niestety już kodu), a potem za pomocą 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.


Przerwanie nie następuje co 1 sekundę. Zauważyłem też, że czas w jakim zmienna zmieni swoją wartość uzależnione jest od ustawienia częstotliwości wewnętrznego oscylatora!
Po przeczytaniu kilku pomocy odnośnie pracy asynchronicznej zegara sądziłem, że zewnętrzny oscylator nie jest powiązany z wewnętrznym (jest tylko zalecenie, aby częstotliwość kwarcu była minimum 4-krotnie mniejsza od częstotliwości uC).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 wrz 2014, o 10:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

W pewnym moim projekcie w ten sposób ustawiłem Timer2. Przerwanie było zgłaszane co pół sekundy.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Przerwanie ustawiłem na pół sekundy bo było mi to potrzebna do migania diodami dwukropka.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 wrz 2014, o 15:26 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Dziękuję za zainteresowanie się tematem.
Z twoim kodem chodzi mi tak samo. Najwyraźniej ta część kodu nie jest winna.
Jesteś w stanie sprawdzić, czy po zmianie częstotliwości wewnętrznej uC, zegarek chodzi tak samo?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 wrz 2014, o 20:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Ustawiłem Timer2, w Atmedze32, w tryb asynchroniczny tak aby przerwanie od porównania wywoływane było co sekundę. W przerwaniu zmieniałem stan diody LED na przeciwny. Program ten sprawdziłem na taktowaniu od 1MHz do 20MHz. I z każdą wartością taktowania dioda migała z tą samą częstotliwością.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 wrz 2014, o 22:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
matek45 napisał(a):
...Najwyraźniej ta część kodu nie jest winna...

Uwierz; nie chcę się czepiać, ale czasem nawet uda mi się coś dojrzeć błędnego i pomóc choć w programowaniu uC "ledwo dyszę". Tylko postaw się w roli czytającego i chcącego Ci pomóc - na podstawie jakich danych ma to zrobić? Tak jak w tamtym temacie wypada odpisać: "Masz rację, musisz zmienić coś w swoim kodzie i na pewno będzie OK " ;)

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 wrz 2014, o 16:24 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

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




Zrobiłem najprostrze zadanie, żeby wartość zmiennej "a" co 1 sekundę wzrastała o 1 - wszystko zgodnie z zaleceniami w nocie katalogowej i w dalszym ciągu nie uzyskałem dokładnie 1 sekundy, a przy zmianie częstotliwości wewnętrznej uC zmienia się częstotliwość przyrostu wartości zmiennej "a". Ma ktoś pomysł, gdzie może być pies pogrzebany?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 wrz 2014, o 20:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Co do tego pierwszego kodu - spróbuj może z wartością OCR1A = 125...

Tak na szybko szacując tutaj może uciekać to 12 sekund na 20 minut, bo 12s / (20 * 60s) = 0,01
Z kolei 1 / 124 = ~0,008

Jeśli dołożyć do tego brak precyzji oscylatora, to kto wie :D

(Chyba, że ucieka Ci sekund w drugą stronę niż ja liczę :P)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 wrz 2014, o 20:27 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Heh :) Te 12 sekund to z dokładnością do 0,5 sek. Rozwiązanie raczej słabe, bo będę musiał po tym sprawdzać ile sekund się spieszy/późni w stosunku do większej długości czasu (kilku godzin), wprowadzać korektę i znowu sprawdzać.
Oczywiście zawsze to jakieś rozwiązanie :)
Bardziej potrzebuję pomocy z funkcji przepełnienia niż porównania, która będzie niezależna od taktowania kontrolera.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 wrz 2014, o 20:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Korzystasz pewnie ze wzoru OCR = F_CPU / TIMER_PRESCALER / ŻĄDANA_CZĘSTOTLIWOŚĆ - 1 ? :P

Tak sobie teraz przeliczam i przemyśliwuję kilka rzeczy i zastanawiam się, czy to "- 1" jest tutaj na miejscu... W sumie niby tak, bo należy doliczyć wartość "zero" rejestru OCR, która wystąpi zaraz po Compare Match-u...

Ale czy na pewno...? (Myślę na głos :P) Mam na balkonie automat do podlewania kwiatków w cyklu dobowym, który chodzi już kilka ładnych miesięcy na kwarcu i ani się nie późni, ani nie spieszy (doświadczalnie ustaliłem mu kalibrację na 1s do tyłu co kilkanaście dób - ale co to jest przy 12 s na 20 min...). Z ciekawości spojrzałem do kodu tego podlewacza (który pisałem w tamtym roku, kiedy jeszcze raczkowałem z uC) i o dziwo tam mam wyliczoną wartość OCR bez tego "- 1".. :?

Muszę zanurkować w szczegóły tego "ceteceka", żeby się upewnić jak to z nim jest :P

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

- - -


Zdążyłeś mnie ubiec z postem, więc... teraz i w tryb asynchroniczny zanurkuję :P


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 wrz 2014, o 21:23 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Też się nad tym zastanawiałem :p Jednak w nocie katalogowej dla atmegi8 na stronie 87, 89, 109 jest wszędzie (1 + OCRn) lub (1+ TOP), ale TOP może przyjmować wartość OCR. Jedynie dla trybu PWM jest bez żadnych +/- jedynek.

Próbowałeś kiedyś bawić się z zewnętrznym oscylatorem?

Jak właściwie działa twój automat do podlewania kwiatów? Przyznam, że zaciekawiłeś mnie. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2014, o 08:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Z zewnętrznym do taktowania samego timera sprzętowego nie :)


Ten automat zrobiłem jak tylko opanowałem przerwania od timerów, jeszcze zanim w ogóle wiedziałem o istnieniu magistrali I2C i układów takich jak PCF8583 :P Zorganizowałem prosty zegar w oparciu o przerwanie 1Hz, który zliczał sekundy, minuty, godziny i doby.

Za prezentację godziny i programowanie parametrów służy multipleksowany siedmiosegmentowiec. Za pomocą trzech przycisków mogę w prostym menu ustawiać godzinę a także do 4-ech czasów załączenia/wyłączenia wyjścia przekaźnika (z rozdzielczością 1 sekundy). Jako że płytkę zasilam z dość mocnego zasilacza 12V, kupiłem zanurzeniową pompkę wody do umywalek w przyczepach kempingowych (dwunastowoltową) 0,5 bara.
Postawiłem na balkonie kanister 20 litrów, do środka wrzuciłem pompkę z wyprowadzonym wężykiem paliwowym na poręcz, gdzie wiszą donice. Średni czas podlewania mniejszej rośliny tą pompką to 1 sekunda, większej 2-3 sekundy. Jeśli roślin jest kilka, to lutownicą można porobić otworki w wężyku i ustawić np. 10 czy 20 sekund podlewania. 20 litrów wody starcza mi od maja do września :P

------------------------ [ Dodano po: 1 minucie ]

Więc na wczasy nawet na dwa miesiące można spokojnie wyjechać bez obawy, że nam dom zaleje :)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2014, o 20:13 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Fajna sprawa jak ma się mało roślin. U mnie na podlanie wszystkich roślin w okresie letnim potrzeba 3 pełne konewki dziennie. Wynajęcie babci lub siostry jest w moim przypadku lepszym rozwiązaniem :)


Wracając do problemu - może znalazł ktoś jakieś rozwiązanie?
Sprawdziłem jeszcze na uC atmega8L (wcześniej miałem bez "L") i też źle działa. Może to być wina, że nie mam podłączonych kondensatorów przy oscylatorze?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2014, o 20:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Co do podlewania: wystarczy w sterowniku zamiast pompki podłączyć elektrozawór i podlewać z wodociągu :P


Co do kwarca, zawsze warto dać kondensatorki!


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2014, o 21:05 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Ostatnio mojemu wujkowi sąsiad z góry zalał mieszkanie, więc jestem teraz uczulony na takie rzeczy. Przy jakimś zawieszeniu programu skutki mogłyby być katastrofalne :/

Wiem, że kondensatory są potrzebne tylko w tej chwili ich nie posiadam (już zamówione i jadą do mnie). Chciałbym wiedzieć czy ich brak może być przyczyną mojego problemu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2014, o 21:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 lis 2013
Posty: 120
Lokalizacja: Koło
Pomógł: 6

matek45 napisał(a):
Sprawdziłem jeszcze na uC atmega8L (wcześniej miałem bez "L") i też źle działa. Może to być wina, że nie mam podłączonych kondensatorów przy oscylatorze?


Dołóż kondensatorki 33pF i coś mi się wydaję, że nie będzie już problemu :) Też się kiedyś męczyłem i dołożenie kondensatorów załatwiło sprawę raz na zawsze :)


Autor postu otrzymał pochwałę

_________________
Kompleksowa realizacja ogrodów



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2014, o 21:21 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

W takim razie nie mogę się doczekać przesyłki :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 wrz 2014, o 13:39 
Offline
Nowy

Dołączył(a): 19 mar 2014
Posty: 18
Pomógł: 0

Nareszcie przyszły kondensatory. Podłączyłem po 33pF na każdą nóżkę oscylatora i ... działa jak natura chciała :D Nie sądziłem, że bez nich uC będzie tak wariował :/
Bardzo dziękuję wszystkim za pomoc. Teraz mam nauczkę, że każdy elemencik jest ważny.

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

kicajek napisał(a):
Masz rację, musisz zmienić coś w swoim kodzie i na pewno będzie OK

Kod okazał się jednak dobry.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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