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



Teraz jest 11 gru 2024, o 21:18


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: 27315
Lokalizacja: Szczecin
Pomógł: 1041

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: 763
Pomógł: 38

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: 763
Pomógł: 38

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