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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 3 kwi 2025, o 17:32


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
    Autor Wiadomość
    PostNapisane: 2 paź 2019, o 23:34 
    Offline
    Nowy

    Dołączył(a): 02 lut 2017
    Posty: 12
    Pomógł: 0

    Otóż tak do sedna
    stan po włączeniu układu:
    timer1 zgłasza co 1ms przepełnienie i inkrementuje zmienną A;
    zmienna A liczy do zmiennej B (500), zeruje się i zmienia stan PA.7 zaświecając i gasząc leda
    Pętla główna kręci się i sprawdza stan przycisków za pomocą debounce, sub.
    tu jest wszystko ok.
    i teraz
    pierwszy stan niski (zwykły tact switch) na PD.3 ma wyzerować A, timer1 po przepełnieniu znowu zwiększa A co 1ms;
    drugi stan niski ma zatrzymać inkrementację A, przepisać jej wartość do B, wyzerować A i wznowić inkrementację A.
    i znów A liczy do zmiennej B (wartość pomiędzy pierwszym a drugim stanem niskim na PD.3) i zmienia stan PA.7.

    I niestety nie działa w żadnej konfiguracji - albo bardzo skraca się czas pomiędzy zmianą stanu albo bardzo wydłuża. W przerwaniu od timer1 jest "granica" wyznaczona na 15s.

    Innymi słowy: wciskam przycisk raz, mija jakiś czas, wciskam drugi raz - led ma zaświecać się i gasnąć w ten "jakiś czas".
    Dla zainteresowanych - ma to spełniać rolę TapTempo w sterowniku midi do procesora efektów, czyli podczas pierwszego nadepnięcia na przycisk sterownik wysyła cc on do procesora a podczas drugiego wysyła cc off i dioda ładnie mryga na sterowniku i w procesorze.
    Pomóżcie bo kombinuję drugi tydzień...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 07:09 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Panie kolego to jest forum techniczne, programistyczne a nie literacko-poetyckie - więc jeśli oczekujesz szybkiej porządnej odpowiedzi czy podpowiedzi - to posługuj się kodem zródłowym a nie prozą czyli opisami z których nic nie wynika. Na takich forach to się pokazuje albo kody albo schematy.

    Więc wstaw kawałek swojego kodu - najlepiej skrócony i okrojony tak aby tylko wyekstrahować sam problem i wtedy będzie wszystko czytelne ok?

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 08:38 
    Offline
    Nowy

    Dołączył(a): 02 lut 2017
    Posty: 12
    Pomógł: 0

    Yhmy ok. Inkrementacji zmienej po przerwaniu od timer1 chyba nie muszę podawać jako kodu?
    W pętli głównej program sprawdza stan przycisków:

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


    I procedura obsługi tego konkretnego przycisku:

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


    I teraz kwestia przełączania samego leda. Na początku programu, przy deklarowaniu zmiennych, do Licz2_timer wrzucam 500, żeby led przełączał się co 500ms. Z tego co wymyśliłem to żeby po późniejszym porównaniu (po akcji z przyciskami) trzeba zrobić tak:
    Składnia: [ Pobierz ] [ Ukryj ]
    język basic4gl
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    No i nie działa. Robię to porównanie w programie głównym, w przerwaniu od timer1, w subie od debounce w każdym case i nic. Albo bardzo się skraca albo wydłuża cykl liczenia.
    Czy teraz jest lepiej?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 15:53 
    Offline
    Użytkownik

    Dołączył(a): 19 lip 2013
    Posty: 771
    Pomógł: 40

    Nie ma całego programu to mi się nie chce tego wrzucać na swojego avrka. Podpowiem ci jak najłatwiej zlokalizować problem.
    Podłącz sobie uart. Zwiększ czas nie na 1ms tylko jakiś większy może 100ms i będziesz wiedział co sie dzieje w programie i gdzie się robi błąd .
    Przed pętla ustaw sobie Porta.7=1 albo =0 ,bo nie wiem czemu ale często tak mam ,ze samo toggle później w programie nie działa.Jak ustawisz raz na 1 lub 0 to juz normalnie działa. Druga sprawa masz timer na 1ms ,a samo debounce wprowadza chyba 20ms opóźnienia. Zrób ten przycisk tez na timerze.
    Jeszcze jedno w podprogramie zrób ,tylko
    Incr Licz_case
    If Licz_case = 3 Then
    Licz_case = 0
    End If
    Resztę w pętli


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 16:48 
    Offline
    Nowy

    Dołączył(a): 02 lut 2017
    Posty: 12
    Pomógł: 0

    Stan portu A jest ustawiany na początku w kofiguracji. Ale dzięki za rady po pracy będę kombinował.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 17:21 
    Offline
    Użytkownik

    Dołączył(a): 17 mar 2014
    Posty: 29
    Pomógł: 3

    Jak to możliwe to wrzuć cały kod, w tym co wstawiłeś wszystko wydaje się być ok.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 18:13 
    Offline
    Nowy

    Dołączył(a): 02 lut 2017
    Posty: 12
    Pomógł: 0

    Generalnie jakichś szczególnych rzeczy w programie nie ma - jeden timer obsługuje multipleks wyświetlaczy, kilka innych debounce w pętli głównej i wysyłanie po programowym uart kodu wciśniętego przycisku. Ale jak wróce z pracy to wrzucę lekko okrojony kod - chyba, że chcecie czytać flagi bitowe od kontrolek...
    Zastanawiam się czy obsługi tego jednego przycisku nie zrobić na INT1 jako że ma wyższy priorytet niż przepełnienie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 18:34 
    Offline
    Użytkownik

    Dołączył(a): 17 mar 2014
    Posty: 29
    Pomógł: 3

    Cytuj:
    Zastanawiam się czy obsługi tego jednego przycisku nie zrobić na INT1 jako że ma wyższy priorytet niż przepełnienie.

    Ja z DEBOUNCE nie korzystam wcale, każde DEBOUNCE blokuje program na jak dobrze pamiętam 20ms,
    20ms dla procka to szmat czasu, w bardziej rozbudowanych programach może to mieć znaczenie.
    Skoro timer odmierza 1ms, od jego przerwania zrób timer programowy na powiedzmy 10ms i na podstawie tego
    w pętli głównej zrób sprawdzanie przycisków.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 19:00 
    Offline
    Nowy

    Dołączył(a): 02 lut 2017
    Posty: 12
    Pomógł: 0

    Sprobuje pozmieniac czasy dla licznika zmiennej i odszumiania stykow.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 20:38 
    Offline
    Użytkownik

    Dołączył(a): 19 lip 2013
    Posty: 771
    Pomógł: 40

    Jesli masz tam jeszcze multipleksowanie wyświetlaczy to musisz to naprawdę dobrze napisać na bazie timerow. Ogólnie program wydaje sie dosyć prosty i w sumie powinien działać



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 21:52 
    Offline
    Nowy

    Dołączył(a): 02 lut 2017
    Posty: 12
    Pomógł: 0

    Dopóki nie przyciskam nieszczęsnego switcha wszystko jest ok - jeden timer sobie mieli wyświetlacze, drugi inkrementuje zmienną i doliczając do 500 (ustawiona wartość bazowa) zmienia stan leda, wysyła dobre dane przez midi podczas wciskania pozostałych przycisków. Wszystkie funkcje działają nawet jak się zwiesi timer1. Gdzieś jest jakaś pierdoła. Poniżej lekko okrojony kod. Obsługa pozostałych przycisków jest taka sama tylko wysyła inne wartości (określone na początku).
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język basic4gl
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2019, o 23:28 
    Offline
    Nowy

    Dołączył(a): 02 lut 2017
    Posty: 12
    Pomógł: 0

    Mam! Podpiąłem LCD żeby widzieć wartości zmiennych licz1_timer i licz2_timer. I okazało się, że z każdym naciśnięciem owszem, zerowałem licznik 1 ale drugi miał wpisaną poprzednią wartość pierwszego i następowało zerowanie pierwszego przy równości z drugim. I teraz podczas pierwszego wsićnięcia zeruję licz1_timer i wpisuję górną granicę dla licz2_timer czyli jakieś 65535 więc nie nastąpi wyzerowanie licz1_timer. Teraz już kosmetyka. Dziękuję wszystkim, którzy mnie nakierowali, w szczególności grzeniu73. Czasami wystarczy tylko jedno słowo by rozwiązać problem.



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

    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