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



Teraz jest 16 kwi 2024, o 06:26


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 5 lut 2018, o 19:11 
Offline
Nowy

Dołączył(a): 05 lis 2017
Posty: 15
Pomógł: 0

Umieściłem ten temat w dziale "rybny" ponieważ pewnie większość z was zna lepsze sposoby na osiągnięcie zamierzonego efektu. O co chodzi? Chcę napisać program którego zadaniem jest włączać i wyłączać 2 diody led, sterowanych za pomocą jednego przycisku. Zależy mi na tym aby gdy jedna z diod świeci się to po wciśnięciu klawisza gasła a po następnym wciśnięciu zapalała się druga oraz aby po ich włączeniu świeciły określony czas to znaczy że jeśli zapalę pierwszą na sekundę to druga kiedy ją zapalę też świeciła się tyle samo i aby po przekroczeniu określonego czasu (od początku włączenia) dioda gasła. poniżej wklejam mój obecny kod który jak w temacie nie działa (czas po włączeniu nie ma wpływu na stan diody).
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Myślę że źle skonstruowana jest obsługa przerwania. Bardzo proszę o pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2018, o 21:17 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

To Ci w ogóle nie działa, prawda?
I to nie w przerwaniu leży główna przyczyna,
ale w konstrukcji całego programu

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2018, o 21:23 
Offline
Nowy

Dołączył(a): 05 lis 2017
Posty: 15
Pomógł: 0

Działa, ale nie tak jak bym chciał, gdy wciskam przycisk to dioda zapala się, kolejne wciśnięcie ją gasi, a 3 wciśnięcie powoduje włączenie drugiej. Brakuje samoczynnego wyłączania po określonym czasie.

------------------------ [ Dodano po: 6 minutach ]

A co do konstrukcji całego kodu to na pewno jest co najmniej kiepska i zdaję sobie z tego sprawę, stąd też ten cały wątek i wybór działu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2018, o 21:39 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Wydaje mi się, że nie do kkońca przemyślałeś jak działa Twoja zmienna Timer2.
Jest ona inkrementowana lub dekrementowana w przerwaniu "cały czas".
A Ty próbujesz ( ;) ) wstrzelić się w dwa konkretne momenty kiedy ma ona
wartość 0 lub 150. To chyba jak trafienie w totolotka.


Autor postu otrzymał pochwałę

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2018, o 21:42 
Offline
Nowy

Dołączył(a): 05 lis 2017
Posty: 15
Pomógł: 0

Dzięki masz rację, dobrze że mi to uświadomiłeś :)
Ale nadaj nie wiem jak zapisać warunek (w procedurze obsługi przerwania) aby timer2 zwiększał się kiedy świeci się jedna dioda a zmniejszał kiedy robi to druga.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2018, o 22:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Idea jest prosta. O ile Cię dobrze zrozumiałem to czas świecenia drugiej diody ma być czasem zmierzonym między dwoma kliknięciami. Coś podobnego wykorzystałem kiedyś do programowalnych wycieraczek samochodowych i w metronomie gdzie tempo nabiało się tapnięciami w obudowę.
Najprościej - powołaj dodatkową zmienną i togluj ją przyciskiem (jego obsługa oczywiście musi być nie blokująca) każdy wcisk to zmiana stanu tej zmiennej. Teraz w zależności od tej zmiennej program przechodzi w tryb mierzenia czasu lub odliczania zmierzonego czasu. Sposób pomiaru pozostawiam Tobie :) Myślę, że załapiesz o co mi chodzi w tym prostym algorytmie.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2018, o 11:46 
Offline
Nowy

Dołączył(a): 05 lis 2017
Posty: 15
Pomógł: 0

Dzięki za odpowiedź to dobry pomysł, ale chodzi mi o coś trochę innego, mianowicie wymyśliłem sobie że to jest program do sterowania roletami w domu (te rolety mają 3 przewody- neutralny zawsze podłączony, drugi- ruch w górę i trzeci- ruch w dół, przy czym nie można dać jednocześnie stanu wysokiego na przewody odpowiedzialne za ruch) choć czasy podnoszenia i ich opuszczania są różne to pominąłem to i założyłem że są takie same. Kod miał działać tak aby za pomocą przycisku wyłączać roletę (jeśli się przesuwa) a po powtórnym wciśnięciu przesuwała się ale w przeciwnym kierunku, do tego dochodzi moment kiedy roleta będzie w skrajnym położeniu- wtedy chcę kliknąć raz a nie dwa dlatego ten cały timer2. A i na koniec dopowiem że ta roleta jeśli dojdzie do położenia skrajnego to np. na dół to na przewodzie (dla ruchu w dół) może być stan wysoki to rolety nie uszkodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2018, o 12:02 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

To może powołaj sobie 2 zmienne
Jedna ruch i druga kierunek
Przy naciśnięciu sprawdzasz czy roleta jest w ruchu
jeśli tak to zmieniasz na stop i zmieniasz kierunek na przeciwny
jeśli roleta się nie przesuwa to uruchamiasz w kierunku jaki określa
zmienna kierunek

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2018, o 12:12 
Offline
Nowy

Dołączył(a): 05 lis 2017
Posty: 15
Pomógł: 0

Po poprawkach (pewnie złych) jest ten sam błąd, czy na pewno obsługa przerwania jest ok?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Prawdopodobnie to przerwanie ponieważ na klawisz jest reakcja, a reakcji na przerwania brak.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2018, o 12:47 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

A kiedy w przerwaniu ma się wykonywać warunek else?


Autor postu otrzymał pochwałę

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2018, o 13:17 
Offline
Nowy

Dołączył(a): 05 lis 2017
Posty: 15
Pomógł: 0

No tak, co myślisz o tym?
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: 6 lut 2018, o 14:40 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

ale po co tak komplikować?
Powinny wystarczyć zwykłe if'y po zwiększeniu czy zmniejszeniu.
Przecież po if możesz w klamrach umieścić więcej niż jedną instrukcję.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2018, o 14:43 
Offline
Nowy

Dołączył(a): 05 lis 2017
Posty: 15
Pomógł: 0

Niestety z pętlą while i bez niej atmega sama nie wyłącza diody.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2018, o 15:12 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Ale to nie jest związane z przerwaniem.
Tak po prostu napisałeś program.
Zerknij.
Najpierw sprawdzasz CZY klawisz wciśnięty LUB MoveAndNot jest różne od zera
jeśli tak to wchodzisz do pętli w której nie sprawdzasz już tego MoveAndNot to niezależnie
co będzie się działo w przerwaniu to Ty się w tej pętli o tym nie dowiesz bo czekasz
tylko na naciśnięcie klawisza.
To raz
A dwa
Przecież wcześniej zatrzymałeś operacje na zmiennej timer2
Bo przecież do całego portu B wpisałeś 0 a to zatrzymuje zliczanie.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lut 2018, o 21:58 
Offline
Nowy

Dołączył(a): 05 lis 2017
Posty: 15
Pomógł: 0

Ok, albo jestem głupi i nie rozumiem ale czy jeśli timer2 (bo PORTB=0) nie zmienia się to i to MoveAndNot też, wiec nie wiem do czego potrzebne jest wiedzieć o zmianie w przerwaniu, być morze dla wielu to oczywiste ale to mój 1 własny projekt, i pierwsze kroki. Co do zmian odnośnie ostatniego wpisu to wygląda to tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Kolejny raz nie pomaga wiec zastanawiam się czy po prostu nie zmienić całego kodu. Nawet jeśli zadziałało by to nie była by przechowywana wartość timer2 więc nie byłoby idealnie.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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