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



Teraz jest 2 sty 2025, o 23:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 11 wrz 2014, o 20:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Witam.
Realizuję od jakiegoś czasu swój projekt prostego zegarka sterowanego za pomocą atmegi8.
Problem polega na tym, że nie mam pojęcia jak ustawić fusebity za pomocą mkavrcalculatora dla kwarcu zegarkowego (32.768kHz).


(jeden procek już padł (w sumie nie wiem czemu skoro podobno za pomocą mkavrcalculatora nie da się zablokować procka -> Mam talent xD))

Może ktoś podpowie?
Oczywiście kwarc podpięty jest pod TOSC1 TOSC2 w otoczeniu dwóch kondensatorów ceramicznych 22pF.
Co chcę osiągnąć? Odliczanie dokładnie 1 sekundy. (W końcu to projekt zegarka ;) )



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

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

Kwarc podłączony do TOSC1 i TOSC2 służy do taktowania Timera2 pracującego w tzw. trybie asynchronicznym a nie do taktowania procesora, który w tym czasie musi być taktowany albo wewnętrznym oscylatorem albo kwarcem zewnętrznym np. 16MHz. Timer2 w trybie asynchronicznym nie zlicza impulsów z oscylatora "głównego" tylko właśnie z rezonatora podłączonego do TOSC1 i TOSC2.

Tak więc powinieneś ustawić taktowanie procesora na wewnętrzny oscylator np. 8MHz, a Timer2 ustawić w tryb asynchroniczny.
Poniżej przykładowa konfiguracja Timera2
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wtedy przerwanie od porównania będzie wywoływane co sekundę
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę


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

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Spróbowałem, wyświetlacze kompletnie zgasły..
Nie bardzo rozumiem dlaczego. Ogółem Twoją metodę rozumiem i widziałem ją gdzieś tu na forum (wcześniej pomagałeś komuś).
tu kod przerwania oraz konfiguracja timera (to co działa jednak nie co dokładnie 1 sek..)
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: 11 wrz 2014, o 22:18 
Offline
Użytkownik
Avatar użytkownika

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

Chyba musisz trochę więcej kodu udostępnić, bo tutaj wszystko wygląda na poprawne... Jeśli oczywiście dobrze interpretuję Twoje definicje :P

Pamiętałeś o sei()? :D



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

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Tak, pamiętałem.
Chodzi o to że jeśli dodaję do mojego kodu załączenie trybu asynchronicznego (ASSR |= (1<<AS2);) to wyświetlacze gasną.
Bez tej linijki kodu wszystko działa jak należy, jednak nie mam odliczania co dokładnie 1 sek.

Edit. A może to jest problemem...

Mam podobne podłączenie kwarcu i kondensatorów 22pF:
Obrazek

Nie powinno być jak tu?:
Obrazek

W sumie jeśli to byłby problem to spokojnie sobie płytę poprawię ;)



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

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

Najlepiej podaj tu cały kod. Schematu też by nie zaszkodziło pokazać. Bo widzę, że kwarc masz podpięty pod jakieś nóżki 12 i 13. To są numery pinów procesora czy może te cyfry oznaczają coś innego.

Podaj jeszcze na jakim taktowaniu działa procesor. Nie chodzi mi o 32768Hz bo to jest taktowanie Timera2 odliczającego czas jednej sekundy. Timera2, którego używasz do multipleksowania wyświetlaczy.



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

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

grochal7 a słuchaj może mała zmiana koncepcji, procesor do sterowania wyświetlaczem ale jako zegarek elegancki scalak RTC DS3231 :)

Masz do niego rewelacyjny poradnik i libsa:
http://mirekk36.blogspot.com/2013/11/rtc-ds3231-najdokadniejszy-zegarek-na.html

Wg. mnie nie ma co kombinować z sama Atmegą, programem i kwarcem bo nie osiągniesz takiej dokładności i stabilności zegara, dlaczego? to wyjaśnia już Mirek w w/w poradniku. Naprawdę polecam.

A tu mój test z multiplexowaniem jego :)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2014, o 14:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

jacekk232 na numery pinów nie patrz, to tylko przykład znaleziony na necie ;)

Procesor taktowany jest wewnętrznym oscylatorem - 8Mhz ;) (w jednym z innych tematów w których pomagałeś czytałem, że nie ważne jakie taktowanie wewnętrznego oscylatora kwarc zegarowy powinien pozwolić na otrzymanie niemal dokładnie 1 sekundy.)

("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ą.")

Intre co do scalaka RTC DS3231 chętnie ale przy którymś z kolejnych projektów ;)
W tym wypadku mam już wytrawioną i polutowaną płytę ;) Małe poprawki mogę wprowadzić ale z dorzuceniem scalaka byłoby trochę ciężko :D

Schemat:

Obrazek

main.c

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


wyswietlacz.h

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


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




Ogółem w większości sugerowałem się poradnikami Pana Mirka i innymi projektami jakie znalazłem w necie ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2014, o 17:31 
Offline
Użytkownik
Avatar użytkownika

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

Jeśli chcesz to koniecznie zrobić tylko na procku to do obsługi multipleksowania użył Timera0.
A Timera2 użyj do odmierzania sekund, minut i godzin np. tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Możesz też użyć Timera2 do multipleksowania i odmierzania czasu. Oczywiście Timer2 w trybie asynchronicznym taktowany kwarcem 32768Hz. Ale wydaje mi się, że sposób z osobnymi timerami do multipleksowania i odmierzania czasu jest na początek prostszy i bardziej przejrzysty.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2014, o 17:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Właściwie przed sekundą wpadłem na pewien materiał na innym forum gdzie ktoś miał podobny problem i zauważyłem właśnie że najlepiej będzie użyć dwóch różnych przerwań z dwóch różnych timerów.
Spróbuję to wykorzystać, trochę poczytam i jak tylko uda mi się zrobić tak jak należy (bądź nie uda się...) to umieszczę efekty pracy ;)



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

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

No i bawię się z tym przerwaniem.
Zrobiłem tak jak mówiłeś, jedno przerwanie dla multipleksowania a drugie.. no tu znów problem.
Nie lepiej byłoby użyć np
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


żeby przerwanie zwiększało tylko ilość sekund? A dalsze sprawdzanie ilości godzin i minut zrobić w funkcji zegarek();?? W ten sposób mógłbym użyć tych sekund także np do Timera (którym mam zamiar się zająć jak już uporam się z samym zegarkiem ;p ) tylko czy to nie wpłynęłoby na dokładność mojej sekundy?

reszta kodu:
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: 12 wrz 2014, o 22:25 
Offline
Użytkownik
Avatar użytkownika

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

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

Bo co się stanie jeśli zmienna s będzie równa 59 i program, z różnych przyczyn, przez dłuższy czas nie sprawdzi tego warunku. A zmienna w tym czasie osiągnie wartość 61. Jeśli będzie to zmienna uint8_t to warunek się spełni za jakieś 256 sekund. Bo zmienna doliczy do 255 a potem od 0 do 60.
Takie warunki lepiej napisać tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ja osobiście aktualizowanie zmiennych sekund, minut i godzin zrobił bym w przerwaniu. Bo nawet jak pętla główna będzie bardzo zajęta przez dłuższy czas to przerwanie jednak się będzie wykonywać i te zmienne wciąż będą aktualne. Nawet jak byś wstrzymał pętlę główną na kilka minut to czas nadal będzie aktualny. Może z tym wstrzymaniem pętli głównej trochę przesadziłem, ale miało to zobrazować dlaczego wg mnie te zmienne aktualizować w przerwaniu.

Piszesz, ze chcesz zmiennej s użyć do jakiegoś Timera. Domyślam się, że chodzi o timery programowe. A co szkodzi utworzyć jeszcze jedną zmienną i ją inkrementować w przerwaniu. Zegarek na dokładności raczej nie straci. Zegara atomowego z niego i tak nie zrobisz :-)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2014, o 23:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Cenna uwaga ;)

I masz rację. Aktualny czas jest dość ważny zwłaszcza jeśli chcę do mojego programu dorzucić jakieś inne funkcje niż sam zegar ;)
Tylko mam problem z tym, że jakbym tego nie zapisał to za każdym razem coś nie gra.

A konkretniej wyświetlają mi się same zera.
Tak jakby przerwanie nie wpływało na wartość zmiennych sekundy, minuty i godziny.

Kod w tej chwili 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.


Trochę sporo już zawracam Ci głowę tym swoim programem. To mój pierwszy projekt i zależy mi żeby fajnie wszystko działało ;)

Edit. przerwanie wpływa na wartość zmiennych sekundy minuty i godziny jednak sekunda niestety nie trwa sekundę tylko hm... Około 15 sekund.



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

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

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

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

Bo jeśli będziesz chciał wyświetlać zmienną sekundy na wyświetlaczu to będzie to troszkę bardziej skomplikowane. A tak zmienna sekundy nadal zmienia się w zakresie 0...59.

Przerwanie do obsługi multipleksowania wywołuje się co ok 3kHz. Wydaje mi się, że to jest troszkę dużo i spokojnie można zmniejszyć częstotliwość odświeżania wyświetlacza do momentu aż migotanie nie zacznie być dokuczliwe.

A program sprawdziłem na Atmedze32 i zmienna sekund ładnie zwiększa swą wartość co... sekundę :-) Zrobiłem tylko tą modyfikację w przerwaniu od Timera2 bo bez tego sekundy na wyświetlacza zwiększały mi się co pół sekundy.

Sprawdź dokładnie wszystko jeszcze raz. A zwłaszcza ten kwarc zegarkowy i kondensatory przy nim.


Autor postu otrzymał pochwałę


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

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Co do przerwania od multipleksowania dziś w przerwie w pracy czytałem troszkę książkę typowo o AVRkach i właśnie podkreślono że lepiej zmniejszyć częstotliwość przerwań w multipleksowaniu, żeby odciążyc procesor - tak też zrobię ;)

A co do czasu mojej "sekundy"...

Zmierzyłem wartość napięcia jaka podawana jest na nóżki atmegi..
Użyłem atmegi8A której wartość napięca pracy waha się od 4,5 do 5,5V. A niestety na nóżki atmegi podawane jest tyko 3,58V ;)
Podejrzewam, że w tym właśnie problem. Sprawdzę to a rezultatem podzielę się niżej ;)



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

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

Ok, wszystko pięknie działa ;)
Teraz będę powoli zajmować się obsługą klawiszy ;)

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

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



Ostatnio edytowano 13 wrz 2014, o 21:43 przez grochal7, łącznie edytowano 1 raz

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

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

Dzieląc częstotliwość kwarcu równą 32768Hz przez preskaler o wartości 256 wychodzi nam, że otrzymaną częstotliwość musimy podzielić jeszcze przez 128 aby otrzymać 1Hz.
Licznik TCNT2 liczy od zera więc to zero również musimy wziąć pod uwagę przy określaniu wartości rejestru OCR2. Przerwanie od porównania ma nastąpić po 128 impulsach. Licząc od zera do 127 mamy właśnie te 128 impulsów.


Autor postu otrzymał pochwałę


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

Dołączył(a): 29 lip 2014
Posty: 58
Pomógł: 0

W sumie dość proste.
Dzięki za pomoc ;)
Bez Twoich porad nie byłoby tego co jest w tej chwili ;)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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