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



Teraz jest 22 lut 2025, o 20:10


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 21 lut 2015, o 10:53 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

Witam mam problem z łączeniem warunków, tzn. np chciałbym aby dioda LED się zapaliła tylko jeśli przycisk pod PD0 oraz PD1 będzie wciśnięty
oczywiście można zrobić to w taki sposób
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ale nie chciałbym tak robić ze względu na to iż jest tutaj o co najmniej jednego "ifa" za dużo, a ponieważ mam zamiar użyć podobnej konstrukcji w przerwaniu które wyszło mi STRASZNIE opasłe to może się to okazać kluczowe... a poza tym nie wydaje się aby to było optymalne...

szukałbym czegoś w stylu

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


tylko że oczywiście powyższe nie zadziała bo uzyskamy (0x01 & 0x02) = 0
tak samo jest jeśli chciałbym aby dioda się zapaliła tylko jeśli 1 jest równe 1 (albo dowolny inny warunek arytmetyczny) a przycisk pod PD1 jest wciśnięty. Poniższy kod również 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.


oczywiście można się bawić w przesunięcia w stylu

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

ale nie wiem czy jest to "ładne" pomimo że powinno działać

czy jest jakiś "elegancki" sposób na robienie tego typu złożonych warunków??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 10:56 
Offline
Moderator
Avatar użytkownika

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

panie kolego podstawy C

operatory bitowe

& |


a tu operatory logiczne

&& ||

rozumiesz ? ;)

czyli

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łę

_________________
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: 21 lut 2015, o 11:05 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

hahaha oczywiście - coś tam dzwoniło w uszach że przecież to oczywiste ale nie mogłem sobie przypomnieć
tak to jest jak się zbyt długo robi w językach wyższego poziomu ... :)
dzięki

edit. bardzo smaczna i zdrowa ryba :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 13:02 
Offline
Użytkownik

Dołączył(a): 05 lut 2014
Posty: 252
Lokalizacja: obok Częstochowy
Pomógł: 14

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


jak się nie mylę



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 19:50 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

@mokrowski serio?? - w sensie zgadzam się z Tobą taki kod bardzo przyjemnie się czyta i edycja dzięki temu jest niesamowicie prosta...
ale nie wiem czy nie przeczytałeś czy o co chodzi ale zależało mi na zmniejszeniu liczby cykli ... a to co zaproponowałeś jest chyba jednym z mniej optymalnych rozwiązań z możliwych ...

osobiście uważam że rozwiązaniem 10 razy lepszym byłoby robienie na definicjach preprocesora jak już się w to bawimy i wtedy

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


i przynajmniej nie wywołujesz funkcji które robią nic
ale zupełnie nie o to było pytanie ...
zresztą wydawało to o czym pisałem na początku to tak jak zaznaczyłem to był jedynie przykład (tak jak z warunkiem 1 == 1)
bardzo się cieszę że chcesz się podzielić swoją wiedzą i bardzo się cieszę że Ci się chce odpisywać innym, ale mam wrażenie, że było to odrobinę "nadopiekuńcze" i jeszcze w dodatku nie spełniało jakiś tam moich założeń

btw. jakiś konkretny powód dla którego przyciski do GND czy "tak się po prostu robi"?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lut 2015, o 20:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 sie 2013
Posty: 230
Lokalizacja: Zabrze
Pomógł: 17

rekon napisał(a):
@mokrowski serio?? - w sensie zgadzam się z Tobą taki kod bardzo przyjemnie się czyta i edycja dzięki temu jest niesamowicie prosta...
ale nie wiem czy nie przeczytałeś czy o co chodzi ale zależało mi na zmniejszeniu liczby cykli ... a to co zaproponowałeś jest chyba jednym z mniej optymalnych rozwiązań z możliwych ...

Nie tylko przyjemnie się czyta ale i debuguje, co przy twoim rozwiązaniu z define jest problematyczne. O ile w przypadku prostego programu to różnic nie będzie, to szukanie przyczyny wadliwego działania w trochę bardziej zaawansowanym programie już jest znacznie mniej przyjemne. A teraz przypuśćmy, że masz uszkodzony przycisk - jak namierzysz w programie opartym na define'ach ten "problem"? Z funkcjami po prostu lecisz krokowo w debugerze i już.
A co do optymalizacji, to kompilator prawdopodobnie (tu wszystko zależy od ustawień optymalizacji kompilatora) wygeneruje tak samo wydajny kod. Wbrew pozorom twórcy kompilatorów potrafią uwzględnić takie "puste/niepotrzebne" przebiegi funkcji.

_________________
40-32:2=4!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 10:39 
Offline
Moderator
Avatar użytkownika

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

rekon napisał(a):
ale mam wrażenie, że było to odrobinę "nadopiekuńcze" i jeszcze w dodatku nie spełniało jakiś tam moich założeń

Być może kolega ma jakieś "dziwne" hmmm wręcz chore przyzwyczajenia z innych forów... np z ele. Gdzie nie jest ważne wyjaśnienie dogłębne, nie jest ważna przyjacielska atmosfera tylko jakieś bezsensowne trzymanie się tematu - podczas gdy często autor pytania często nawet nie zdaje sobie sprawy że np idzie złą drogą, gdy ktoś chce mu pokazać szerszy aspekt problemu ...
Zawsze powtarzam, że warto pomagać nawet gdy się popełni jakiś błąd - bo inni (którzy akurat wiedzą więcej chętnie poprawią i zrobią to kulturalnie - dlatego na naszym forum także często pomagają całkowicie początkujący ....)
A tu nomen omen tak się akurat tobie trafiło że dostałeś odpowiedź i to jeszcze jaką! od na prawdę wysokiej klasy specjalisty, który świetnie przedstawił wszystko co trzeba i poza tobą jeszcze wiele innych osób może skorzystać z takiej odpowiedzi czytając w przyszłości ten post ...

REASUMUJĄC - panie kolego rekon .... rzadko udzielam ostrzeżeń na forum (to się chyba WARN nazywa) ale w tym przypadku to robię i proszę na przyszłość dostosować się do zasad naszego forum .... i działać z nami - serdecznie zapraszam. W przeciwnym wypadku - po co się tu z nami męczyć ?

_________________
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: 22 lut 2015, o 12:12 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

mokrowski odpowiadając od końca przepraszam Cię, zareagowałem bardzo nieuprzejmie conajmniej. Na swoje usprawiedliwienie mogę dodać że wczoraj był bardzo męczący dzień aczkolwiek to nie jest żadne usprawiedliwienie...
3. brak doświadczenia zdecydowanie cechuję moją osobę, w ciągu ostatnich 3 lat na studiach uczono nas programować w 6 czy 7 językach programowania więc w każdym wiem wystarczająco dużo żeby nie wytrzymywać z nudów czytając książki odnośnie języków programowania, a czasem po prostu miesza się to wszystko i zapomina się o takiej rzeczy jak "&&", a niestety pomimo iż powinni uczyć nas przede wszystkim programować sprzęt to jest to zupełnie pominięte ale za to zrobiłem już ze 3 kalkulatory ...
1-2. to o co zapytałem było elementarne i to nie tylko wg. Ciebie - jest to podstawowa operacja i tłumaczy się to wszędzie jeśli tylko wspomina się o instrukcjach warunkowych niestety dziura w głowie wyżarła tą informację, Twoja odpowiedź faktycznie była staranna i całe szczęście że są jeszcze ludzie którym się chce
Jeszcze odnośnie początkującego - jestem początkującym w AVR ale nie koniecznie w programowaniu, stąd jakaś tam chora ambicja i duma poczuła się dotknięta kiedy zwróciłeś uwagę na konwencję którą raczej znam i zwykle stosuje ale chciałem aby opis problemu był najłatwiejszy z możliwych
0. Co do GND, ehhhh >>westchnął patrząc na swoje rezystory przy przyciskach<<. "Podciąganie programowe" nawet mi nie przyszło do głowy - na szczęście. Element zaskoczenia zawsze jest pozytywny bo sprawdza czujność ;) nawet jeśli jest zaskoczenie jest niezamierzone.

-1. Co do kodu w asemblerze dzięki za sugestię - byłem, sprawdziłem:)
Faktycznie jestem zdziwiony, ale chyba nie tak jak miałem.
Pozwolę sobie wrzucić tutaj kody w C oraz asemblera wygenerowanego z tych kodów. Dodałem jedynie coś w warunku oraz część else.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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


oraz kod oparty na define'ach

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


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


Pierwsze moje zaskoczenie dotyczyło instrukcji "call", która wg. specyfikacji atmega8, jeśli dobrze zrozumiałem została usunięta w 2003 roku ze specyfikacji, szczerze powiedziawszy nie wiem co ma to oznaczać tak dokładnie. W sumie zastanawiam się dlaczego usunięto tą instrukcję oraz dlaczego w takim razie kompilator nadal tego używa.
Cytuj:
Removed instructions CALL and JMP from the datasheet.


Kolejna rzecz która mi się podoba w rozwiązaniu z "define" to fakt że omija wszystkie inne warunki jeśli pierwszy powoduje, iż całość się nie powiedzie od razu przeskakując do części else. Poza tym w tych listingach jest mniej więcej to czego się spodziewałem, ale być może nie rozumiem wyższości tych funkcji z tego poziomu.

Postanowiłem jeszcze sprawdzić taki kod, który z punktu widzenia człowieka jest oczywiście bez sensu i aż się prosi aby napisać to lepiej, ale w celach edukacyjnych test odnośnie jakichś usprawnień (wiem że jest to związane z wybranym kompilatorem itd. ale chciałem sprawdzić co się dzieje domyślnie).
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Daje kod wynikowy

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


No i na koniec jest chyba jedno rozwiązanie, które w jakiś tam sposób pogodzi te 2 różne opcje, rozwiązanie które nie wykorzystuje instrukcji call i ret a mimo wszystko daje to możliwości debugowania o czym wspomina PJS. A tym rozwiązaniem są po prostu funkcje z przedrostkiem inline. W takim przypadku wilk syty i owca cała - chyba.

Dziękuję panom za chęci pomocy pomimo mojej postawy.

Podczas pisania posta (które zajęło dość długo) dostałem ostrzeżenie, przyjmę z pokorą. Mam nadzieję, że będzie mi dane "odpracować w polu" moje zachowanie.

edit. Odnośnie mojego zdziwienia funkcją "call" zdziwienie było spowodowane tym że program był kompilowany pod atmege 16, a specyfikacja w którą patrzyłem była dla atmegi 8 ... po sprawdzeniu kodu wynikowego dla atmegi 8 wszystko w porządku jeśli o to chodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 14:56 
Offline
Moderator
Avatar użytkownika

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

rekon napisał(a):
ale być może nie rozumiem wyższości tych funkcji z tego poziomu.

Być może się mylę ale ...

po pierwsze nie chodzi tu o wyższość jednego rodzaju funkcji nad drugą w sensie stricte np zajętości pamięci Flash. Nie zawsze optymalizacja kodu wiąże się TYLKO przecież z ilością kodu we flash, czasem wiąże się właśnie z CZASEM wykonywania i wtedy godzimy się nawet na to żeby zajętość FLASH była większa ....

ale czasem - i to bywa chyba NAJWAŻNIEJSZE ... optymalizujemy kod pod kątem przyszłego użycia, hmmm stylu programowania, bo ważniejsze jest nie to jak dużo kod zajmie (można wziąć przecież procka z większą pamięcią flash) .... ale na ile kod będzie czytelny nawet po 10 latach gdy do niego sięgniemy albo jak wyżej pisał kolega na ile łatwo będzie w takim kodzie odnaleźć błędy ... i to (wydaje mi się) chcieli także koledzy wyżej przekazać ....

dodatkowo warto zwrócić uwagę na to ... że język C to nie asembler a często zapominają o tym osoby mocno związane z asemblerem i próbują rozpatrywać nawet prosty kod pod kątem każdej najbardziej niskopoziomowej instrukcji procesora gdy tymczasem najczęściej nie ma to najmniejszego znaczenia - że kod wykona się w 2 czy w 5 cyklach zegara. To jest też taki właśnie przypadek ( tak mi się wydaje - zaznaczam ) ....

Jak widać kwestii czytelności kodu (dobrego stylu programowania) nigdy nie rozwiążemy poprzez zmianę procka ale już brak pamięci flash, ram czy eeprom spokojnie tak

Na zakończenie - oczywiście bardzo fajnie jest znać asembler i umieć sobie analizować kod niskiego poziomu bo choć rzadko - to jednak być może czasem ... czasem kiedyś tam może się to przydać przecież pisząc jakiś wysoce zaawansowany w czasowe zależności projekt

_________________
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: 22 lut 2015, o 21:24 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

mirekk36 wg. mnie chodzi o wyższość, bo dopóki nie zrozumiem dlaczego nie wolno dotykać piekarnika to będę szedł w stronę ciepła ;) Bez względu na to z jakiego powodu jakieś rozwiązanie jest "złe" czy też "gorsze" to musi za tym przemawiać jakaś korzyść dla drugiego rozwiązania. Dopóki ja nie zrozumiem tej korzyści to będę pisał tak jak mi wygodniej i myślę że nie tylko ja tak mam (korzyścią może być choćby to że będę pisał tak jak wszyscy inni dzięki czemu łatwiej jest współpracować - ale wszyscy inni pewnie nie piszą w taki sposób żeby dopasować się do wszystkich innych)
Zdaje sobie sprawę z różnych kryteriów optymalizacji.


mokrowski masz bardzo ciekawe podejście. Wydaje się ono całkiem słuszne, ale...
niestety jestem taką istoto która sama musi popełnić wszystkie możliwe błędy - jeśli ktoś mi powie o problemie a ja nie zrozumiem tego w pełni to pewnie nie uznam to za możliwe w moim specyficznym przypadku ;)

Faktycznie ciekawie wygląda plik *.lss z kodem C ale ma to raczej znaczenie przy większych projektach.
jeśli chodzi o zabawę w asemblera to chyba już starczy na dzisiaj bo na jutro nie zostawie sobie niczego do odkrywania ;)

ale jeśli chodzi o optymalizację tych funkcji o czym wspominałeś faktycznie udało się ;) przy optymalizacji -O2 chyba dopiero ale zawsze ;) no i niestety zaskoczenie było niewielkie bo wszystko było już zaspoilowane ;)

odnośnie call - tak jak pisałem w na koniec wynikało to z kompilowania dla atmegi16 a patrzenia w specyfikację atmegi8 i tak jak pisałem było to tak jak napisałem informacje znalazłem w specyfikacji atmegi8 (podejrzewam że dowolna młodsza niż z 2003 roku będzie miała tą informację) i tutaj masz bezpośredni link do strony atmela (strona 322)
http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf

odnośnie mojej wspaniałej optymalizacji... okazało się że nie ma problemu aby podzielić częstotliwość przerwania ... wielokrotnie - i tym optymistycznym akcentem ;)

edit. aaa Mirku! odnośnie asemblera - kazali mi się nauczyć to znam (a przynajmniej znam zasady), pisałem w tym wystarczająco długo żeby trzymać klawiaturę za oknem- czyli jakieś 100 linijek ;) swoją drogą bezprzewodowa klawiatura dla programisty to chyba ostatecznie zły wybór :P Ale czasem fajnie jest wiedzieć "co w trawie piszczy" choćby po to żeby przeanalizować jak działa przedrostek volatile jak to pokazujesz na blogu co miałem przyjemność dzisiaj czytać :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2015, o 22:04 
Offline
Moderator
Avatar użytkownika

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

rekon napisał(a):
bo dopóki nie zrozumiem dlaczego nie wolno dotykać piekarnika to będę szedł w stronę ciepła

Nie zrozum mnie - źle ... ja to doskonale rozumiem. Wspomniałem o pewnych ogólnych zasadach ... a to nie oznacza, że KAŻDY musi działać tak samo .... a już całkowicie zrozumiałe dla mnie jest gdy ktoś musi przede wszystkim coś zrozumieć "po swojemu" .... toż to normalne .... i absolutnie nie chodzi przecież o to aby tu ktoś komuś narzucał jakieś zdanie ;) ... przede wszystkim programowanie - to fajna zabawa ;) a tym bardziej jeśli można się dzielić tyloma ciekawymi opiniami, poradami ... i podyskutować na spokojnie.

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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