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



Teraz jest 22 maja 2018, o 18:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 24 ] 
Autor Wiadomość
PostNapisane: 16 maja 2018, o 11:21 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

Witam szanownych kolegów.
Proszę o wyjaśnienie pewnej kwestii odnośnie funkcji _delay_ms(xx);.
Napisałem, kawałek kodu, który niestety dla kompilatora odbił się czkawką w postaci:

c:\program files\atmel\avr tools\avr toolchain\avr\include\util\delay.h:163:28: error: __builtin_avr_delay_cycles expects a compile time integer constant
__builtin_avr_delay_cycles(__ticks_dc);

Ten kawałek kodu wymyśliłem sobie, zakładając, że jest zgodny z C, ale wychodzi na to, że nie, a więc proszę się nie śmiać zbyt głośno ;) .

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


Opiszę, jakie było założenie i co program miał robić.

Zakładając, że przy pierwszym obiegu pętli program natrafi na wartość adc większą od 500, to nastąpi przypisanie do zmiennej temp wartości 255. Następnie mają wykonać się instrukcje
z ifa.
Teraz przy drugim obiegu pętli ponownie sprawdzany jest if. Zakładając, że wartość adc jest mniejsza od 500, to instrukcję z ifa się nie wykonają i wykona się wszystko po else.
W pierwszej kolejności nastąpi opóźnienie o wartość przypisaną przy pierwszym obiegu, czyli tmp=255. Dla tego _delay_ms(tmp). Następnie zostaną wykonane kolejne instrukcje z else.
Na koniec instrukcji else do zmiennej tmp zostanie przypisana wartość 0, czyli zakładam, że będzie postać _delay_ms(0);
Teraz, zakładając, że przy trzecim obiegu pętli ponownie adc będzie mniejsze od 500, to wykona się wszystko po else, ale już bez opóźnienia. Opóźnienie będzie nieaktywne dopóty, dopóki
z jakichś przyczyn adc nie wzrośnie powyżej 500.
Wówczas ponownie do zmiennej tmp zostanie przypisana wartość 255 i tak w kółko.
W zależności od zmiany napięcia adc będą zachodziły zmiany w wyświetlaniu na lcd.
Generalnie program ma działać w ten sposób, że jeśli adc nie przekroczy wartości 500, to ma się tylko statycznie wyświetlać napis_staly_na _lcd. Natomiast, jeżeli adc przekroczy 500, to
mają się wykonać instrukcje z pod ifa i wyświetlić napisy z ifa. Po zmniejszeniu wartości adc ma się wykonać wszystko po else, ale ze zwłoką przypisaną do temp.

Pewnie moja logika znów odmówiła posłuszeństwa. Nie mogę sobie z tym poradzić, dla tego proszę o jakieś wskazówki. Jak tu zakombinować, a żeby uzyskać zamierzony efekt. Może
nie stosować _delay_ms(xx);, ale wydało mi się to proste i słuszne. Z góry dziękuję za pomoc. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 maja 2018, o 11:24 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 1424
Pomógł: 68

Do delaya musisz podać stałą a nie zmienną. Jak byś się upierał na rozwiązaniu z delayem to musisz sobie zrobić swoją funkcyjkę z instrukcją for a w środku np. delay 1ms :).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 maja 2018, o 11:49 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

Dzięki micky
Ja się nie upieram przy funkcji _delay_ms(xx); , tylko to było pierwsze, co mi przyszło na myśl i co rozumiem tak na szybko. No i stwierdziłem, że tak na prawdę, to pomimo, że jest to delay,
to nie będzie on zatrzymywał programu (no może tylko przy przejściu z if do else, ale o to właśnie mi chodzi). Czy mógłbyś mi coś więcej pokazać z tą pętlo for i ewentualnie inne poprawne
rozwiązanie ?. Nie proszę o gotowy kod, ale coś, co pozwoli mi zaskoczyć i napisać całość. Pozdrawiam. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 maja 2018, o 12:29 
Offline
Tech-support
Avatar użytkownika

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

Tworzysz swoją funkcję, która przekazuje jako argument ilość milisekund do opóźnienia.
A w funkcji masz pętlę, w której masz tylko jedną funkcję: _delay_ms(1). I teraz w zależności od tego, ile będzie obiegów pętli, o tyle milisekund opóźnisz program. Takie rozwiązanie widziałem gdzieś tu na forum.
I mała uwaga: taka funkcja nie zapewni dokładnego czasu, bo musisz doliczyć:
- wywołanie swojej funkcji
- obsługę pętli
- wywołanie funkcji _delay_ms(1)
Ale nie budujesz przecież zegara atomowego, pojedyncze milisekundy chyba nie będą problemem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 maja 2018, o 12:31 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

Dzięki Marhef
Natrafiłem na ciekawy temat. Może o tym piszesz.

topic4840.html

Pokombinuję i napiszę, czy się udało. Pozdrawiam. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 maja 2018, o 13:00 
Offline
Tech-support
Avatar użytkownika

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

Tak, dokładnie o to mi chodziło. W sensie rozwiązanie zaproponowane przez Mirka



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

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

No więc zastosowałem metodę, o której była mowa. Coś zaczyna wychodzić, ale jeszcze nie do końca jest ok. Trochę się gryzie z resztą programu. Muszę jeszcze nad tym popracować
w wolnej chwili. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 maja 2018, o 07:26 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

Zastosowałem "Mirkowy" sposób do mojego kodu. Znalazłem przy okazji podobne rozwiązania na innych blogach. W pewnych sytuacjach bardzo dobrze zdaje to egzamin, ale w mojej
konkretnej sytuacji nie do końca jest ok. Kod w uproszczeniu:

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



Nie zauważyłem złego podejścia, póki nie sprawdziłem :cry: . Wszystko niby jest ok, ale zakładając, że po obniżeniu się wartości adc poniżej 500 i po upływie np. 0,5s ponownym pojawieniu
się wartości powyżej 500 program i tak pozostaje przy wykonywaniu wszystkiego w else, a powinien skoczyć do ifa natychmiast. Czeka, ponieważ zmienna tmp przyjęła wartość 2000ms i musi
się wyzerować. Oczywiście pod warunkiem, że to co napisałem jest słuszne.
Myślę i myślę i nie mogę wpaść na jakiś pomysł, jak to poprawić. Może któryś z kolegów coś podpowie ?. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 maja 2018, o 07:34 
Offline
Nowy

Dołączył(a): 07 kwi 2017
Posty: 1
Pomógł: 0

Wywal delay całkowicie.
Program oprzyj o maszynę stanów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 maja 2018, o 07:39 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

JK76 dzięki za zainteresowanie.

Możesz coś zademonstrować na początek, a żebym złapał tropa ? Wiem, że maszyna stanów wiąże się np. z menu, ale jeszcze nie miałem okazji korzystać z tzw. maszyny stanów.
Pozdrawiam. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 maja 2018, o 07:46 
Offline
Moderator
Avatar użytkownika

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

Robert_1967 napisał(a):
Możesz coś zademonstrować na początek, a żebym złapał tropa ?

Masz niby Bluebooka - jak widać w ikonkach w podpisie - i nie chce ci się do niego sięgnąć ? Gdzie masz opisane jak pozbywać się delayów ? jak przestać pisać kod LINIOWO ? ..... Boże, przecież właśnie o tym jest ta książka ;) i do tego prowadzi ... gdzie ukoronowaniem jest rozdział "wstęp do systemów czasu rzeczywistego" z przykładowym kodem jak pisać nawet prosty kod przez początkującego ale bez delajów ...eeeeeh

_________________
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: 17 maja 2018, o 07:56 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

Witaj Mirku.
Ok. Dzięki :oops: .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 maja 2018, o 08:00 
Offline
Moderator
Avatar użytkownika

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

masz tam też kod na DVD/Pendrive do tego ćwiczenia - wystarczy zajrzeć - no ale też przeczytać jak to działa i jak to jest zorganizowane ... a gdy coś będzie niejasne to wtedy śmiało pytaj na forum

_________________
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: 17 maja 2018, o 11:46 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

Witam ponownie.
A żeby nie pozostawić tematu niedokończonego, to co naskrobałem. Aktualnie nie mam BB przy sobie, a więc wykombinowałem coś takiego. Oczywiście przestudiuję, co
Pan Mirek zasugerował.

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 sprawia wrażenie, że pracuje prawidłowo i zgodnie z oczekiwaniami, nie mniej jednak proszę o ewentualne sugestie i baty, jeśli takowe są konieczne :lol:.
Co ewentualnie można by poprawić i czy ta droga jest słuszna. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 maja 2018, o 14:29 
Offline
Tech-support
Avatar użytkownika

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

Nie wiem, czy taki był zamiar. W załączonym kodzie w linijce nr 4 jeżeli pomiar(PA6) > 50, to tylko ustawi zmienną wartosc_chwilowa, natomiast to, co jest w klamrach od linijki 5 do 23 wykonają się niezależnie od wartości pomiar(PA6)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 maja 2018, o 21:38 
Offline
Tech-support
Avatar użytkownika

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

cześć,
poza tym co kolega Marhef napisał,

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


wykonują się także gdy Timer1 nie jest 0. chyba że to zamierzone działanie. hmm. ?
pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2018, o 06:30 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

Witam.
Dopiero mogę napisać. Postać programu (w uproszczeniu) wygląda następująco i napiszę, jak ja to rozumiem:

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


Jeśli adc się nie pojawi, to wykona się drugi if, ponieważ wartość początkowa zmiennej wartosc_chwilowa == 0. Natomiast, jeśli adc > 50, to wykona się pierwszy if i zmiennej wartosc_chwilowa
zostanie przypisane 50. Wykona się if(!Timer)..... , który jest delayem 3000ms. Następnie wyzeruje się wartosc_chwilowa, ponieważ inaczej ciągle miałaby wartość 50 i pomimo, że np. zanikła
wartość adc, to i tak nie wskoczy do drugiego ifa. W drugim ifie mogłoby być również if(wartosc_chwilowa ==0).
Proszę o zrozumienie, że tyle rozpisuję się, ale mam taki sposób wchłaniania wiedzy i rozkładam wszystko na czynniki pierwsze, a żeby zrozumieć sens i logikę działania. Bez tego ani rusz dalej.
Oczywiście nie twierdzę, ze moja interpretacja jest 100% prawidłowa, a więc dla tego jestem tutaj :) .
Ostatecznie na ten moment (postać kodu) działanie wizualne programu jest następujące:
Jeśli pojawi się adc > 50, to program natychmiast reaguje i wskakuje do pierwszego ifa. Jeśli nagle zabraknie napięcia adc, to program pozostaje przez 3 sekundy w pierwszym ifie i następnie
przełącza się do drugiego ifa. Tak chciałem. Jedyny mankament, to to, że czasami zwłoka jest mniejsza, niż 3 sekundy ( może zależy od tego, w którym momencie na osi czasu-pętli jest aktu-
alnie Timer1 ?????). Może mogę zrobić to inaczej, a może źle myślę. Proszę o ewentualne komentarze. Dzięki. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2018, o 07:04 
Offline
Moderator
Avatar użytkownika

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

Jeśli ten fragment kodu jest w pętli głównej while(1) - to niestety jest to kompletnie źle napisany kod, i jeśli jak pisałeś masz wrażenie, że dobrze działa - to masz rację "masz wrażenie" ... tymczasem pętla główna jest że tak powiem ogólnie "zamulana" na maxa ... a ty z kolei w kodzie powtarzasz wciąż niepotrzebnie ogromne fragmenty kodu. Zobacz na obrazek ... zakładając nawet, że całe podejście byłoby dobre to masz jak byk widoczne dwa identyczne fragmenty kodu, po co je powtarzać ? Ten drugi można wywalić i nadal będzie taki sam efekt

Obrazek

Poczytaj sobie w książce o mechanizmie FLAG, które można stosować jak najbardziej również tylko w pętli głównej, niekoniecznie są one zarezerwowane tylko do zastosowań z przerwaniami.

Jeśli zatem zależy na jakimś MEGA szybkim sprawdzaniu warunków ADC to kompletnie nie ma potrzeby w tych warunkach miliard razy na sekundę wyświetlania czegoś na LCD bo tylko przez takie podejście DRASTYCZNIE spowalniasz pracę pętli głównej tworząc niewidocznego dla siebie koszmarnego delaya tymi niepotrzebnymi wyświetleniami. A twoje oko nawet nie widzi, że na ekranie ten sam tekst przez długi czas wyświetla się 100 tys razy na sekundę ... a po co ? Jak mógłby się wyświetlić TYLKO WTEDY i TYLKO RAZ gdy zajdzie potrzeba.

oczywiście nie wiem co to są u ciebie za tajemnicze funkcje instrukcja_1(), instrukcja_2() itd ... jeśli to tylko jakieś przełączanie portów czyli szybkie operacje i jest to konieczne z punktu widzenia działania projektu to ok - ale podejrzewam, że je również można uzależnić od flag.

Jakiś taki przykład ... ale tylko poglądowy bo i tak kompletnie nie wiem o co chodzi w kodzie dlatego, że ty opisujesz to co ma robić twój program - jakby oczami wyglądu twojego kodu - zamiast oderwać się na chwilę od kodu i narysować sobie algorytm ...

Robert_1967 napisał(a):
to program pozostaje przez 3 sekundy w pierwszym ifie

Nie ma czegoś takiego, że program POZOSTAJE przez 3 sekundy w jakimś IFie .... tutaj mocno popłynąłeś ale to pewnie dlatego, że jeszcze nie rozumiesz timerów programowych ...

a żeby je zrozumieć to warto najpierw porobić sobie sporo prostych ćwiczeń nawet z diodami LED samymi aby zobaczyć jak to działa ... ty zaś się rzucasz od razu na jakiś projekt nie rozumiejąc narzędzia a cały czas próbujesz te timery programowe mierzyć miarką DELAYA - że one ci zastąpią jakiegoś delaja i to jest NAJWIĘKSZA twoja pułapka w którą wpadasz i się zniechęcisz jeśli dalej będziesz szedł tą drogą.

zobacz:

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



ale masz jakiś przykład - i jeśli chcesz żeby cię naprowadzić to opisz co ma twój projekt realizować ale broń boże nie w taki sposób jak to wyżej opisałeś mówiąc kodem źródłowym. Zapomnij na chwilę o kodzie i po prostu opisz swoim językiem w kilku punktach co program ma realizować

_________________
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: 18 maja 2018, o 07:42 
Offline
Użytkownik

Dołączył(a): 10 lip 2015
Posty: 328
Pomógł: 29

Co więcej po pomiarze adc wykona się warunkowo tylko przypisanie wartości do zmiennej, z powodu źle postawionych klamer.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2018, o 07:44 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

Dzień dobry Mirku.
Dziękuję za zainteresowanie. No tak. Oczywiście tylko ja wiem, co program ma robić w moim zamyśle, a wiec dopiszę. Fragment kodu, który zamieściłem jest przykładem.
1. Ten kod znajduje się w sekcji MENU na samym początku i traktuję go, jako main screan. W pierwszym ifie są dokonywane pomiary adc i wyświetlane, ale wyświetlane dopiero po przekroczeniu
zadanej wartości. Jeśli ta wartość się nie pojawi, to ma się wykonywać drugi if, czyli statyczne, ciągłe wyświetlanie stałych komunikatów. Menu jest dość krótkie, a więc zrobione na case i break.
Ten kod znajduje się w sekcji case 0.
Wzrokowo całość pracuje powiedzmy "poprawnie", ale tak, jak piszesz Mirku, to tylko wzrokowo. No właśnie...Poczytam, pomyślę, poćwiczę...Może faktycznie źle interpretuję te przerwania. Ja
oglądałem poradniki, czytałem BB, no ale może źle zinterpretowałem zawartość. Ja nie mam z kim zasiąść do przysłowiowego piwka i przedyskutować jakieś zagadnienie
tak, żeby mi wytłumaczył "po mojemu" na żywo. Nikt w mojej okolicy nie interesuje się C i rozumiem, że tu nie jest uczelnia, czy kursy programowania, tylko forum. Dla tego nie chcę nadużywać
cierpliwości kolegów i staram się jak najwięcej sam dochodzić, a w ostateczności piszę. Tylko,że jak widzę, to źle pojmuję to i owo.
Tak, czy inaczej na pewno się nie zniechęcę :) . Idę się douczyć. Pozdrawiam. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2018, o 08:01 
Offline
Tech-support
Avatar użytkownika

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

Jeżeli komunikaty są stałe, to może wystarczy je wyświetlić tylko raz. A jeżeli wartość ADC przekroczy próg (50), to wtedy dopiero zmieniasz to, co na wyświetlaczu.
Przepraszam, trochę się czepiam. Ale ten opis jak dla mnie nadal nie jest oderwany od kodu programu. Spróbuj to jeszcze bardziej oderwać od programowania.

Na przykład w ten sposób:
1) jeżeli zmierzone napięcie jest niższe niż 2,5V, to na wyświetlaczu w pierwszej linii ma się wyświetlić "Za niskie napięcie"
2) jeżeli napięcie wzrośnie powyżej 2,5V i utrzyma się przez 3 sekundy, to na wyświetlaczu w drugiej linii ma się wyświetlić wartość tego napięcia
3) jeżeli napięcie wzrośnie powyżej 2,5V, ale nie utrzyma się przez 3 sekundy, to licznik 3 sekund ma się wyzerować

Nie mam pojęcia, czy w jakikolwiek sposób trafiłem w Twoje założenia do projektu, ale to miał być tylko przykład.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2018, o 08:41 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

Witaj Marhef
Nie ma w tym żadnego czepiania, spoko. Musiałem w jakiś sposób nawiązać do kodu, ponieważ Mirek słusznie zauważył, ktoś nie wie, czy sytuacja dotyczy pętli while(1), czy czegoś innego...,
a więc wspomniałem o kodzie.
Założenie jest mniej więcej, jak piszesz. Gdy nic się nie dzieje, to wyświetlam komunikaty i nic więcej. Natomiast kiedy wartość adc "urośnie", to zmienia się zawartość na lcd, zmienia się np.
stan portu (załącza przekaźnik). Z tym nie miałem problemu, ale ważne dla mnie jest założenie, a żeby po zaniku wartości adc program odczekał chwilę i dopiero przeszedł w stan statycznego wyświetlania (2, 3, 5 sekund). Ale z kolei w chwili pojawienia się napięcia opóźnienie jest nie wskazane, czyli ten "delay" ma działać tylko w jedną stronę. Z tego, co widzę, to mam problem z napisaniem nieblokującego programu. Muszę zaniechać wszystkiego i porządnie zasiąść do przerwań i flag, jak pisał Mirek.
Dopóki tego nie opanuję, nie przećwiczę, to będzie lipa i tylko niekończące się posty, a forum też ma swoją cierpliwość :lol:. Przemyślę to, co napisałeś o statycznych tekstach. Pozdrawiam. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 maja 2018, o 10:03 
Offline
Moderator
Avatar użytkownika

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

Robert_1967 napisał(a):
. Natomiast kiedy wartość adc "urośnie", to zmienia się zawartość na lcd, zmienia się np.
stan portu (załącza przekaźnik). Z tym nie miałem problemu, ale ważne dla mnie jest założenie, a żeby po zaniku wartości adc program odczekał chwilę i dopiero przeszedł w stan statycznego wyświetlania (2, 3, 5 sekund). Ale z kolei w chwili pojawienia się napięcia opóźnienie jest nie wskazane, czyli ten "delay" ma działać tylko w jedną stronę. Z tego, co widzę, to mam problem z napisaniem nieblokującego programu


Nie .. zła diagnoza - ty nie masz problemy na razie z napisaniem nieblokującego programu, ty na razie nie potrafisz a może nawet nie chcesz stworzyć sobie algorytmu działania. A ALGORYTM jest zupełnie oderwany od kodu źródłowego w jakimkolwiek języku. Prościej mówiąc to tylko opis działań .... Ty zaś sam zakładasz sobie pętle na szyję, i wchodzisz w sidła - po czym dziwisz się, że się przewracasz ... Broń BOŻE nie piszę tego złośliwie .... tylko już któryś raz ja np proszę abyś opisał co ma realizować (w punktach) ten twój projekt a ty po raz już trzeci albo czwarty wciąż to samo że ... coś tam wchodzi w IF'a, że coś przechodzi w stan statycznego wyświetlania 2,3,5 sekund a jakiś przedziwny twój delay ma działać w jedną stronę.

Uwierz mi to co opisujesz to sidła które zastawiasz sam na siebie i swoje myślenie....

Powiedz mi (ale już ostatni raz pytam i biorę udział w dyskusji - bo jeśli nie pojawi się w końcu skrócony opis działania projektu tylko znowu będziesz pisał o IFach itp to nie ma dalej sensu podpowiadać bo spełza to na niczym) ... więc napisz nam przede wszystkim do czego to jest? np: Informacja o pracy KRAŃCÓWKI w maszynie na podstawie wartości napięcia

a później w punktach opis typu:

1. maszyna gdy pracuje normalnie to napięcie jest poniżej wartości X (u mnie adc < 50 )
2. gdy coś tam się stanie w maszynie to napięcie na krańcówce wzrasta do wartości Y
3. chcę to zobrazować na LCD tak aby
a.) mieć bieżącą informację o stanie krańcówki na bazie napięcia
b.) gdy napięcie przekroczy jakąś wartość to ma się wykonać operacja AAAA
c.) po przekroczeniu napięcia i wykonaniu operacji AAAA ma wykonać się operacja BBBB ale ta musi się wykonać po 3 sekundach od zakończenia operacji AAAA


to jest opis - oczywiście jakiś bzdurny i przykładowy - ale widzisz żebym ja tu gdzieś pisał o IF'ach ? Delayach? statycznym wyświetlaniu na LCD ?

za to na bazie takiego opisu można już by usiąść i zacząć rysować sobie algorytm działania - poczytaj sobie gdzieś co to są algorytmy i jak się je rysuje ( a one jak mówiłem wyżej również nie mają ni w ząb - żadnej styczności z kodem)

DOPIERO jak masz algorytm to siadasz do pisania kodu - wybierasz język programowania - rozumiesz ?

_________________
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: 18 maja 2018, o 11:15 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 217
Pomógł: 0

Tak, Rozumiem Panie Mirku.
Przepraszam i obiecuję się poprawić. Poczytam o algorytmach, zapoznam się z tematem. Jako, że zaczyna się weekend i mam sporo zajęć z domem, to nie odezwę się natychmiast, ale wrócę
i opiszę, jak się należy. Ja wiem, że nie piszesz tego złośliwie i czasami masz taki sposób porozumiewania się z nami laikami ( też nie piszę tego złośliwie ). Przywykłem ;) .
Zdaję sobie sprawę, jaką trzeba mieć nieraz cierpliwość i jeszcze czas. Pozdrawiam wszystkich. Robert.



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

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