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



Teraz jest 28 mar 2024, o 11:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 13 lut 2018, o 22:44 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Cześć. Napisałem sobie prosty program nie blokujący na podstawie kodu z BB z rozdziału do czasu rzeczywistego. Powołałem sobie timer programowy jak w książce i jeśli w pętli głównej togluję diodę, to wszystko działa. Ale jeśłi chcę sobie migać dwukropkiem na LCD, to jest lipa. Nie miga mi dwukropek na ekranie. Na pewno mam wszystko dobrze podłączone, ponieważ jeśli chcę tylko wyświetlić znak na LCD, to on się wyświetla. Program testuję na zestawie ATB. A tutaj jest mój kodzik. Potrafię już sobie napisać prosty program - stoper. Ale to mnie przerosło ;):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lut 2018, o 22:51 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Dodałbym zmienną (której stan też zmieniasz z 0 na 1) i w oparciu o to ustawiał dwukropek na wyświetlaczu. To co masz teraz od razu ustawi pusty znak. Przykład:
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łę

_________________
Dragonus Cracovus: Biomagia



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

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Dziękuję, za przykład. Przetestowałem i działa. Ale czy możesz mi wyjaśnić dlaczego mój przykład nie chce działać?

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lut 2018, o 23:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

wojciechgorzolka napisał(a):
Ale czy możesz mi wyjaśnić dlaczego mój przykład nie chce działać?
Bo u Ciebie wykonają się wszystkie komendy natychmiast - zatoglujesz diodą, ustawisz sobie pozycje 1,2, wyświetlisz dwukropek, ustawisz zmienną Timer 1, ustawisz pozycję 1,2. wyświetlisz spację (skasujesz dwukropek), ustawisz ponownie zmienną Timer1. I to wszystko od razu. Kasowanie dwukropka powinno być przemiennie z wyświetlaniem i to zawsze po minięciu czasu Timera.

--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lut 2018, o 23:21 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Twój przykład nie działa, bo wpisanie do timera programowego Timer1 wartości nie oznacza, że tam program się zatrzyma. Wykona się po kolei wszystko co w warunku if(!Timer1) i po wyjściu warunek nie będzie spełniony i kod nie zostanie wykonany dopóki timer sprzętowy nie zmniejszy wartości zmiennej Timer1 do zera. Taki prosty przykład też nie zadziała:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

A taki już tak, ale jest to program blokujący:
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łę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lut 2018, o 23:41 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Dziękuję Wam za odpowiedź. Znów jestem mądrzejszy o Wasze przykłady. Ja pierwszy raz używam timera zamiast delay i stąd moje błędy. Myślałem,że Timer1 można używać jak delay, ale teraz widzę,że tak nie jest :) Gdy zrobiłem sobie stoper oparty o delay, to wszystko było bardziej proste. Jednak występował problem z klawiszami, bo raz działały,a raz nie. Postanowiłem pójść o krok dalej i zrobić pierwszy program bez delay-ów. Zobaczę co mi z tego wyjdzie. Dziękuję

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2018, o 07:50 
Offline
Użytkownik
Avatar użytkownika

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

wojciechgorzolka napisał(a):
Myślałem,że Timer1 można używać jak delay, ale teraz widzę,że tak nie jest


Zauważ że tym "delayem" jest objęte tylko to co znajduje się wewnątrz warunku if( timer1){ o tu... }
Pozostała część kodu żądzi się swoimi prawami czasowymi.

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2018, o 09:43 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

jeśli będę robił zegarek, w którym będę miał trzy klawisze do ustawiania godzin min i itp, i jeśli obsługa tych trzech klawiszy będzie wyglądać identycznie, to czy do każdego klawisza z osobna muszę ustawić osobny timer programowy (timer1, timer2, timer3), czy mogą być wszystkie trzy klawisze np na Timer1? A do tykania sekund ustawię Timer2. Do migania diodą w innym tempie niż tykanie sekund ustawię Timer3. A do buzerka kolejny Timer4.
Stworzyłem sobie funkcję na bazie przykładu kolegi Krauser:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i tą funkcyjkę wrzucam zamiast _delay_ms(x);

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2018, o 10:49 
Offline
Moderator
Avatar użytkownika

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

wojciechgorzolka napisał(a):
i tą funkcyjkę wrzucam zamiast _delay_ms(x);

zrozum timery programowe nie mają na celu ZASTĘPOWANIE kocich delayów

Timery programowe mają umożliwić uruchamianie pewnych zdarzeń, twoich fragmentów kodu w jakichś interwałach czasowych

więc twój błąd polega na tym, że ty wciąż próbujesz myśleć o tym jak tu zastąpić delaya - czyli czekać i blokować program ale zrobić to inną metodą.

Wyobraź sobie lepiej, że masz potrzebę aby coś było wykonywane co 500 ms ... normalnie użyłbyś delaya(500) i blokował całą pętlę główną na 500ms - po co ?

Za to bierzesz timer programowy , nastawiasz go żeby tykał co 500ms i dzięki temu twój fragment kodu odpala się co 500ms zaś pętla główna zapitala z pełną kosmiczną prędkością procesora, tylko co 500ms wykona to co masz w tym timerze programowym. Teraz może troszkę jaśniej ?

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

Tak jak napisał wyżej kolega:
Krauser napisał(a):
A taki już tak, ale jest to program blokujący:


taka pętla jest blokująca i NICZYM się nie różni od kociego delaya
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
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: 14 lut 2018, o 11:10 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

Rozumiem,że Timery są właśnie od nie blokowania. Ale dziękuję za sprostowanie przykładu Krausera, ponieważ myślałem,że ten przykład nie blokuje( źle odczytałem post). Ale faktycznie gdy go wczoraj testowałem z tykaniem licznika i dodatkowo miganiem diody, to działało to właśnie blokująco. Wieczorem pewnie znów przysiądę do napisania jakiegoś warunku, który pozwoli mi nie blokować pętlę główną. Czyli trzeba pogłówkować ;)

_________________
Nikt nie mówił,że będzie łatwo...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2018, o 11:55 
Offline
Moderator
Avatar użytkownika

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

wojciechgorzolka napisał(a):
Czyli trzeba pogłówkować

Zajrzyj proszę do Bluebooka do rozdziału "Projekt wielozadaniowy" tam masz przecież ŚLICZNIE to nie tylko opisane ale podany przykładowy bardzo prosty kod testowy - masz go na dołączonym nośniku do książki .... widzę że masz zestaw ATB więc jego uruchomienie żeby podpatrzeć co i jak działa za co odpowiada kilka timerów programowych tam użytych to pestka ... wystarczy jak mówię ten rozdział prześledzić a jak będą do niego jakieś pytania to wtedy dopytać tutaj - po co wyważać głową drzwi, gdy dzięki BB są przecież otwarte ;)


Autor postu otrzymał pochwałę

_________________
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: 14 lut 2018, o 12:05 
Offline
Użytkownik

Dołączył(a): 28 maja 2016
Posty: 469
Lokalizacja: Katowice
Pomógł: 1

:mrgreen: Ołkej. zaglądnę, ale od przepisywanie kodu człowiek się nie nauczy ;) . Oczywiście żartuję sobie, ponieważ korzystam z BB przy tym kodzie.

_________________
Nikt nie mówił,że będzie łatwo...



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

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

wojciechgorzolka napisał(a):
Czyli trzeba pogłówkować ;)

kurcze,
ja się zastanawiam czy czasem nie próbujesz przypisać timerom jakichś nadzwyczajnych właściwości. :)
Powolujesz jakąś zmienną, np timer1.
W przerwaniu tę zmienną dekrementujesz systematycznie w określonych odstępach czasowych. ( np. przerwanie co 1s a w nim if(timer1) timer1--;

Pamiętając że pętlą główna będzie wykonywana b szybko, część programu zamykasz w ifie w którym sprawdzasz czy timer1 "spadł" już do 0.

Jeżeli tak, to: {
wykonujesz swoje funkcje,
i przypisujesz do timer1 nową wartość.( np 60).
Dopiero Za 60 sekund timer1 będzie miał wartość 0.
, a tylko wtedy ta część kodu objęta klamrami się wykona.
}
Pozostała część pętli głównej będzie zapylać z pełną prędkością omijając tego nie spełnionego IFA.
I tak przez najbliższe 60 s.
To wszystko, nie doszukują się w tym jakiejś magicznej właściwości. ;)



Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 10:44 
Offline
Użytkownik

Dołączył(a): 31 sty 2018
Posty: 41
Lokalizacja: Tarnów
Pomógł: 0

mirekk36 napisał(a):
Zajrzyj proszę do Bluebooka do rozdziału "Projekt wielozadaniowy"

Czy projekt wielozadaniowy nie jest czasem w Greenbooku ?
Bo nie mogę go zlokalizować w Bluebooku



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 11:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

To chyba rozdział "Wstęp do systemów czasu rzeczywistego". Tam Mirek opisał program z wykorzystaniem wielu peryferiów



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2018, o 11:45 
Offline
Użytkownik

Dołączył(a): 31 sty 2018
Posty: 41
Lokalizacja: Tarnów
Pomógł: 0

Marhef napisał(a):
To chyba rozdział "Wstęp do systemów czasu rzeczywistego".

Rozumie teraz przeglądnąłem "GB" i tam znalazłem lcd + projekt wielozadaniowy myślałem że to o nim mowa.
Dzięki za podpowiedź



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

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