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



Teraz jest 3 mar 2025, o 17:29


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 21 lut 2019, o 12:22 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 28 kwi 2015
Posty: 20
Lokalizacja: Bydgoszcz
Pomógł: 0

Witam
Wykonałem prosty włącznik oświetlenia wykorzystując czujnik zbliżeniowy i ATtiny13.
Napisałem do niego kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Program działa, ale nie wiem czy do końca tak jakbym chciał. Wydaje mi sie, że za szybko się przełącza. Wystarczy zwiększyć argument _delay_ms(), czy INT0 przerywa działanie _delay_ms(100) i nic to nie zmieni. Jeśli przerywa to jak opóźnić przełączanie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2019, o 13:49 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 428
Lokalizacja: Puck
Pomógł: 7

Witaj karlowic

Nie jestem orłem w te klocki ale na mój rozum
to wywołujesz przerwanie zewnętrzne w obsłudze przerwania
ustawiasz flagę na 1

dalej sprawdzasz czy flaga ma 1 jeśli tak to najpierw przełączasz przekażnik
potem czekasz 100 ms a następnie zerujesz flagę

w tym układzie nigdy nie będziesz miał zwłoki bo PIERW WŁĄCZASZ PRZEKAŻNIK A POTEM CZEKASZ

sprubuj zamienić miejscami _delay_ms(100); z PORTB ^= OUT;

wtedy będziesz miał oczekiwanie 100 ms a po nim dopiero włączenie przekażnika
i będziesz mógł regulować delayem czas po jakim ma się załączyć przekażnik



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2019, o 10:33 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 28 kwi 2015
Posty: 20
Lokalizacja: Bydgoszcz
Pomógł: 0

miki53 napisał(a):
w tym układzie nigdy nie będziesz miał zwłoki bo PIERW WŁĄCZASZ PRZEKAŻNIK A POTEM CZEKASZ

Nie chodzi mi o zwłokę w działaniu włącznika ale co dzieje się po tym działaniu.

zubik napisał(a):
blokujesz sobie program na te 100ms

Właśnie o to mi chodzi w tym programie.
Światło zapala się po machnięciu ręką. Jeśli palce przylegają do siebie, jest jeden długi impuls i wszystko jest w porządku.Jeśli palce nie przylegają do siebie następuje seria 4 impulsów i włącznik głupieje. Myślałem, że funkcja _delay_ms() zatrzyma działanie procesora na chwilę(czas wystąpienia niepotrzebnych impulsów). Teraz nie wiem, czy 100ms to za mało, czy INT0 przerywa i tak funkcję _delay_ms() czyli wydłużenie czasu nic nie da.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2019, o 13:45 
Offline
Użytkownik

Dołączył(a): 27 cze 2018
Posty: 116
Pomógł: 6

Wyłącz zezwolenie na globalne przerwania po if , włącz je przy wyjściu z If.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2019, o 18:13 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 428
Lokalizacja: Puck
Pomógł: 7

Czujnik Ci wariuje gdy rozszerzysz palce ręki bo każdy palec czujnik odbiera jako przeszkodę
a przestrzeń między palcami jako wolną przestrzeń , w ten sposób szybko ( 4 krotnie )
wysterowujesz czujnik który włącza i włącza Ci przekażnik i żarówa mruga zamiast się
włączyć lub wyłączyć

Zamknięta dłoń jest odbierana przez czujnik jako 1 przeszkoda a palce jako 4 przeszkody

w tym tempie wywołujesz przerwanie
teraz trzeba zrobić tak aby to szybkie przełączanie wywołane palcami nie miało wpływu
na przekażnik

może w ten sposób ( piszę bez sprawdzania kodu - sprawdz sam )

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: 24 lut 2019, o 21:11 
Offline
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 393
Lokalizacja: Mielec
Pomógł: 14

Poco zamrażać wejście, ustawiasz flage na 1 i nie ważne ile razy w ciagu 1sekundy bo caly czas bedzie 1, ważne aby stan wyjścia się nie zmieniał tyle razy co wejście w czasie np 1 sekundy, dlatego zeruj flage na samym końcu. Lub np licznikiem w innym if-ie

if ( tnc ==100 && flaga ==1) flaga = 0 ;

Tak można zerować globalną flagę np od wszystkich przerwań.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2019, o 22:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Witam,
może spróbuj 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łącz przerwanie co 1ms,
w przerwaniu timera co 1 ms dekrementuj zmienną np:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
co 1 ms zmienna dąży do '0' od zadanej wartości.
a w kodzie obslugi realizacjii INT'a :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
jeżeli jest przerwanie od INT'a, to zawartość ifa wykona sie dopiero wtedy gdy uplynie określony w 'CZEKANIE' czas od poprzedniego przerwania INT'a. jeżeli nie uplynął (przesuwane palce), to za każdym razem ustawi się czas oczekiwania na zadaną wartosć, a zadanie będzie odwleczone o następne 'CZEKANIE'_ms pomimo powtórnego wywolania przerwania INT.

Przesuwane palce będą wywoływać przerwanie INT, ale też będą odwlekać wykonanie poleceń w nim zawartych.

oczywiściew możnaby uformować to w funkcję prostą do używania w kolejnych liniach kodu- kolejnych zadaniach.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


trochę nagryźmoliłem, ale finalnie to kilka linijek kodu.
taka myśl. :)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2019, o 21:46 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 28 kwi 2015
Posty: 20
Lokalizacja: Bydgoszcz
Pomógł: 0

miki53 napisał(a):
może w ten sposób ( piszę bez sprawdzania kodu - sprawdz sam )

Właśnie złożyłem układ na ATB 1.05 i sprawdziłem. Działa jak napisałeś. Najprostsze rozwiązania są najlepsze.
Opóźnienie 500ms jest niewidoczne dla oka ale wystarczające, żeby przełącznik działał jak należy.
Wszystkim dziękuję za pomoc. Problem rozwiązany.
miki53 napisał(a):
sprubuj zamienić miejscami _delay_ms(100); z PORTB ^= OUT;

Sprawdziłem program bez zamiany miejscami tych linii i też działa prawidłowo.
zubik napisał(a):
Poza tym 100mS to może być trochę mało.

Kluczowym problemem był za krótki czas opóźnienia. Po wprowadzeniu 500ms program działa prawidłowo.
INT0 jeśli nawet przerywa działanie funkcji _delay_ms() (a przerywa na pewno) to i tak wraca do niej z powrotem i nic się nie zmienia (flaga dalej będzie równa 1). :)



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

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