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



Teraz jest 1 mar 2026, o 17:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 1 ] 
Autor Wiadomość
PostNapisane: 31 sty 2016, o 17:22 
Offline
Nowy

Dołączył(a): 11 lis 2015
Posty: 12
Pomógł: 0

Cześć wszystkim,

Jestem w trakcie swojego małego projekciku termostatu i z powodu uszkodzenia nogi RTC, który dysponuje solidnymi timerami, zmuszony jestem wybudzać jakoś swój układ za pomocą czegoś innego. Korzystam z ATmegi88PA-PU

Zdecydowałem się na taki system:
1. Jest odpalony timer z okresem 8s i posiada licznik, co w sumie zapewnia przepełnienie co minutę.
2A. Jeśli wciśnięty zostanie dowolny klawisz, timer z pkt.1. jest resetowany.
2B. Jeśli timer z pkt.1. się przepełni, to odpala WatchDogTimer i usypia układ.
3. WatchDogTimer ma okres 8s i posiada licznik, co w sumie zapewnia przepełnienie co 15min.

Przy usypianiu gaszone jest kilka modułów, co powoduje mniejsze zjadanie przez nie energii.
Przy budzeniu przez WDT sprawdzany jest licznik:
[*] Jeśli ten spadł do 0, to wołane jest wdt_disable() i odpalane są moduły. Liczniki timera i WDT są resetowane.
[*] Jeśli jest >0, to następuje jego dekrementacja, a następnie ponownie odpalany jest WDT i usypiany układ.

Ponadto istnieje flaga "isAsleep", która jest ustawiana na 1 przez Timer przy pierwszym odpaleniu WDT i usuwana przez WDT wybudzającego w pełni procek. Główna pętla programu wykonuje swoje instrukcje tylko jeśli isAsleep==0, inaczej to jest while(1);

Niestety póki co pomysł nie działa - prawidłowo idzie spać, tylko jeśli nie korzystam z guzików, prawidłowo gasi moduły przed i odpala je po wybudzeniu, jednak ilość czasu, którą spędza w śnie jest zdecydowanie za krótka. Procek siedzi w temp ok. 30 stopni, bo obok wentylatora komputera, a zatem i programatora (dane odczytane z modułu termometru).

Jakieś pomysły? Oczywiście na czas testowania ustawiłem sobie mniejsze wartości - timer przepełnia się po 16s, WDT tak samo.

Poniżej wrzucam pseudo kody implementacji tego usypiania. Funkcje do sleepa i wdt brane są z bibliotek avr ;)

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


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


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


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


Przerwania:
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 1 ] 

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