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



Teraz jest 19 sty 2025, o 08:15


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 11 cze 2016, o 11:27 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

Witam, tak jak w temacie - poszukuję sposobów na uzyskanie kontrolowanego resetu mikrokontrolera, w moim przypadku jest to attiny13a.

Na początku od razu mówię, że nie jestem jakimś "mózgiem" w sprawach programowania.
Głównym problemem, z którym się droczę jest zresetowanie odliczania czasowego, gdy moje schody przestaną świecić. Aktualnie mam taką sytuację, że gdy ATTiny13a wykryje stan wysoki na jednej z jej pinów, to zaczyna odliczać 2 minuty po czym daje na pinie wyjściowym stan wysoki, który jest podany na ATMegę8. Gdy Mega dostanie stan wysoki - gasi wszystkie schody (Tak, wiem, pewnie są prostsze sposoby na uzyskanie takiego wygaszania czasowego, jednak tak jak mówiłem, nie jestem dobry w te klocki, przez co użyłem tego pomysłu, który jako jedyny przyszedł mi na myśl).
Jednak problem się pojawia, ponieważ czasami dzieje się tak, że jest "ruch" na schodach, przez co zdarza się tak, że wyłączają się schody, gdy dana osoba dopiero po nich wchodzi - dlatego chciałbym zastosować reset odliczania, za każdym razem, gdy schody zapalą się na nowo.
Wpadłem na taki pomysł, żeby podać fizycznie przewodem stan niski z "leda" na reset attiny. Wtedy, gdy schody byłyby zgaszone, to ten stan niski poszedłby na pin resetu i go zresetował - jednak nie wiem, czy jest to zgodne z etyką i to w ogóle ma prawo działać, a nie chcę niczego uszkodzić.
Jeżeli mielibyście jakieś inne pomysły jak dokonać resetowania odliczania, przy gaszeniu ledów, to byłoby świetnie ;)
Poniżej wstawiam napisany program na ATTiny13A, który odlicza czas.

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 cze 2016, o 11:39 
Offline
Użytkownik

Dołączył(a): 19 lip 2013
Posty: 763
Pomógł: 38

Nie znam C ale musisz zrobić sobie timer który będzie co 500mA sprawdzał czy ktos jest na schodach jesli jest to światło zapalone czas =0 jeśli nie ma to incr czas.Jak dojdzie do ustawionego pulapu wyłączy światło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 cze 2016, o 12:05 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Zakładam, że chcesz zrobić tak:
- światło włącza się, gdy z detektora ruchu otrzyma stan wysoki na pinie PB2 i świeci się przez ustalony czas,
- jeśli w tym czasie ponownie pojawi się lub będzie się utrzymywał stan wysoki na pinie PB2, to czas powinien zacząć się odliczać od nowa.
Możesz spróbować tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W ten sposób światło powinno zgasnąć zadaną ilość czasu po zaniku sygnału z detektora ruchu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2016, o 14:24 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

andrews napisał(a):
Zakładam, że chcesz zrobić tak:
- światło włącza się, gdy z detektora ruchu otrzyma stan wysoki na pinie PB2 i świeci się przez ustalony czas,
- jeśli w tym czasie ponownie pojawi się lub będzie się utrzymywał stan wysoki na pinie PB2, to czas powinien zacząć się odliczać od nowa.
Możesz spróbować tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W ten sposób światło powinno zgasnąć zadaną ilość czasu po zaniku sygnału z detektora ruchu.


Dzięki wielkie za pomoc, jednak nie do końca o to mi chodziło, pewnie przez to, że napisałem trochę to wszystko zagmatwanie.

Przedstawię od początku jak wygląda sytuacja:

Stan wysoki na Pinie PB2 otrzymuję poprzez poprowadzenie przewodu z pinu na ATMedze8, który odpowiada za sterowanie sygnałem jednego stopnia ledowego. Tak więc, gdy detektory wykryją ruch na schodach, zapalą się wszystkie stopnie za pośrednictwem ATMega8, wtedy pojawi się stan wysoki na PB2 na ATTiny13A - co wiąże się z tym, że rozpocznie się odliczanie czasu w ATTiny13A.

Teraz przejdę do tego, co chciałem otrzymać:

Gdy drugi detektor wykryje ruch, czyli gdy osoba wejdzie na piętro, rozpoczyna się sekwencja wygaszania stopni LED za pośrednictwem ATMega8. I teraz, gdy stopnie LED są wygaszone, program cały czas odlicza zadany czas, a chciałbym, żeby przerwał odliczanie i był w stanie gotowości, by zaczął odliczanie, gdy ponownie ktoś będzie chciał wejść na górę/zejść na dół.

Możesz zadać sobie pytanie "a po co mi te odliczanie, skoro stopnie same się gaszą, gdy drugi detektor wykryje ruch?". Dlatego chciałbym zastosować takie odliczanie, ponieważ czasami gdy nikt nie wchodzi po schodach, stopnie się same zapalają - wynika to z tego, że czasami wystarczy podmuch cieplejszego wiatru, by detektor uznał to za ruch. Dlatego też, gdyby tak się stało, chciałbym by ATTiny13A po odliczeniu czasu, podał stan wysoki na PB4, który będzie odpowiadał za natychmiastowe wygaszenie wszystkich stopni (PB4 jest za pomocą przewodu zwarte z pinem na ATMega8, także gdy ATMega8 otrzyma stan wysoki od PB4, automatycznie wyłącza schody).

Mam nadzieję, że mimo zagmatwania jakoś jasno przedstawiłem o co mi chodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2016, o 16:43 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Jeśli dobrze rozumiem, masz dwa detektory (nazwijmy je dolny i górny).
Algorytm jest taki, że kiedy dolny detektor zadziała to oświetlenie schodów zostaje załączone i aby je wyłączyć jest potrzebny sygnał z górnego detektora (i odwrotnie, zależy czy ktoś wchodzi czy schodzi).
Odliczanie czasu ma na celu wyłączenie oświetlenia po określonym czasie, gdy nastąpi przypadkowe i niezamierzone załączenie jednego z detektorów. Wtedy mikrokontroler nie uzyska sygnału z drugiego detektora i światło będzie włączone cały czas. Odliczanie czasu ma na celu wyłączenie oświetlenia w takim przypadku, niezależnie od tego, czy sygnał z drugiego detektora zostanie wysłany, czy też nie.

Nie wiem jak często zdarzają się takie niezamierzone załączenia, ale to nie do końca rozwiązuje problem, bo światło i tak się będzie niepotrzebnie włączać. Może lepiej zainwestować w lepszej jakości czujniki ruchu?

No ale prościej mówiąc, światło ma się świecić:
od momentu wykrycia ruchu przez pierwszy detektor,
do momentu otrzymania impulsu z drugiego detektora
lub
do momentu odliczenia określonego czasu.

Jeśli tak, to nie wiem po co stosujesz dwa mikrokontrolery. Jeden w zupełności wystarczy.

Nie napisałeś tego, ale zakładam, że sygnał na PB2 zostaje wyłączony w momencie otrzymania sygnału z drugiego detektora i wygaszenia światła. W tym momencie odliczanie czasu ma zostać przerwane i układ ma oczekiwać na następny stan wysoki na PB2, po otrzymaniu którego ma zacząć odliczanie od początku. Proponowałbym tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Niemniej proponuję zrobić to na jednym mikrokontrolerze, bo to tylko niepotrzebna komplikacja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 cze 2016, o 14:42 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

andrews napisał(a):
Jeśli dobrze rozumiem, masz dwa detektory (nazwijmy je dolny i górny).
Algorytm jest taki, że kiedy dolny detektor zadziała to oświetlenie schodów zostaje załączone i aby je wyłączyć jest potrzebny sygnał z górnego detektora (i odwrotnie, zależy czy ktoś wchodzi czy schodzi).
Odliczanie czasu ma na celu wyłączenie oświetlenia po określonym czasie, gdy nastąpi przypadkowe i niezamierzone załączenie jednego z detektorów. Wtedy mikrokontroler nie uzyska sygnału z drugiego detektora i światło będzie włączone cały czas. Odliczanie czasu ma na celu wyłączenie oświetlenia w takim przypadku, niezależnie od tego, czy sygnał z drugiego detektora zostanie wysłany, czy też nie.

Nie wiem jak często zdarzają się takie niezamierzone załączenia, ale to nie do końca rozwiązuje problem, bo światło i tak się będzie niepotrzebnie włączać. Może lepiej zainwestować w lepszej jakości czujniki ruchu?

No ale prościej mówiąc, światło ma się świecić:
od momentu wykrycia ruchu przez pierwszy detektor,
do momentu otrzymania impulsu z drugiego detektora
lub
do momentu odliczenia określonego czasu.

Jeśli tak, to nie wiem po co stosujesz dwa mikrokontrolery. Jeden w zupełności wystarczy.

Nie napisałeś tego, ale zakładam, że sygnał na PB2 zostaje wyłączony w momencie otrzymania sygnału z drugiego detektora i wygaszenia światła. W tym momencie odliczanie czasu ma zostać przerwane i układ ma oczekiwać na następny stan wysoki na PB2, po otrzymaniu którego ma zacząć odliczanie od początku. Proponowałbym tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Niemniej proponuję zrobić to na jednym mikrokontrolerze, bo to tylko niepotrzebna komplikacja.


Coś jednak nie działa tak jak powinno. Gdy zaprogramowałem uC i podłączyłem wszystko, to gdy pojawia się stan wysoki na PB2, automatycznie, bez żadnego odliczania pojawia się stan wysoki na PB1. Od razu mówię, że nic nie jest zwarte.

@Edit

Rozwiązałem sprawę w taki sposób:

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


Mimo wszystko, dziękuję bardzo za pomoc ta funkcja "if( !(PINB & 0x04) ) break;" była funkcją kluczową, której szukałem :)



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

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