tag:blogger.com,1999:blog-3960927205450249158.post4503837382095500004..comments2024-03-28T09:15:15.977+01:00Comments on mikrokontrolery avr język c, poradniki, kursy video - eagle: Maskowanie bajtów - z przymrużeniem oka ;)mirekk36http://www.blogger.com/profile/11690797724225993397noreply@blogger.comBlogger23125tag:blogger.com,1999:blog-3960927205450249158.post-34966143948798998842015-12-11T12:50:04.801+01:002015-12-11T12:50:04.801+01:00I wszystko gra. Znalazlem to na stronie 94...(mam ...I wszystko gra. Znalazlem to na stronie 94...(mam oczywiscie obydwie ksiazki). Teraz to rozumiem w pelnej krasie. Dziekuje i do nastepnego ;)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-10052372273563311792015-12-11T12:28:18.869+01:002015-12-11T12:28:18.869+01:00Widzisz, jak sam piszesz nie rozumiesz, i wydaje c...Widzisz, jak sam piszesz nie rozumiesz, i wydaje ci się to tajemnicze bo prawdopodobnie nie masz książki:<br /><br />http://atnel.pl/mikrokontrolery-avr-jezyk-c.html<br /><br />w której to opisałem DOKŁADNIE wszystkie takie podstawowe operacje zarówno logiczne jak i bitowe, ale także operatory jedno- i dwu-członowe - jakie występują w języku C. Pokazuję też w programach w książce jak się nimi posługiwać a także DOKŁADNIE i to z fajnymi grafikami przedstawiam jak to działa tak rozpatrując bit po bicie ....<br /><br />zapis panie kochany<br /><br />!=<br /><br />to dwuczłonowy operator logiczny - a nie tak jak ty próbujesz wysnuć jakieś przedziwne wnioski, że wykrzyknik odnosi się do jakiegoś nawiasu wcześniej czy coś<br /><br />ten zapis oznacza nic innego jak<br /><br />"różne od"<br /><br />w innych językach zapisywane tak<br /><br /><><br /><br />To co w pierwszym nawiasie to jest WYRAŻENIE warunkowe w języku C ... nic innego i nic prostszego - ale jeśli no właśnie nie zna się podstaw to później się to rozpatruje jako jakieś nawiasy<br /><br />tymczasem wyrażenie po lewej stronie przyjmuje wartość w zależności od podanej maski oraz wciśniętych klawiszy<br /><br /><br />i sprawdzamy czy wartość tego wyrażenia jest różna od wartości 0x1F<br /><br />to aż tyle i tylko tyle<br /><br />Mówię - szczerze polecam zacząć od książki - bo moje praktycznie wszystkie poradniki są tworzone właśnie z myślą - jako uzupełnienie do książek .... i ciężko tylko na ich podstawie się nauczyć programowania ..... A jak sam widzisz nie byłbym w stanie w kilku poradnikach przekazać dość sporej ilości wiedzy jaką przekazałem w książcemirekk36https://www.blogger.com/profile/11690797724225993397noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-91272204724179755832015-12-11T11:46:12.930+01:002015-12-11T11:46:12.930+01:00Witam
Oczywiscie Twoje rozwiazanie dziala (za ktor...Witam<br />Oczywiscie Twoje rozwiazanie dziala (za ktore dziekuje) tylko ze go nie kumam... W pierwszym nawiasie sprawdzam maska stan wszystkich 5 pinow portu D, i jezeli na ma tam 1 to maska daje falsz ale ten kolejny zapis to magia. Operator != oznacza ze pierwszy nawias jest rozny od 0x1F ...Czy mam to rozumiec tak: jezeli pierwszy nawias jest rozny do wyrazenia po != to if jest spelniony?<br />Takiej kombinacji w poradniku nie ma a jest bardzo interesujaca ( to taki troche OR). <br />Serdecznie pozdrawiam<br />StefanAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-24976608824291492542015-12-09T17:11:37.913+01:002015-12-09T17:11:37.913+01:00Ale dobrze podchodzisz do tematu, bo nie ma co tyl...Ale dobrze podchodzisz do tematu, bo nie ma co tylu bitów wpisywać oddzielnie, tylko użyć maski w postaci jednej liczby albo HEX albo BIN. Ty dobrze zamieniłeś badane bity na maskę 0x1F<br /><br />Jeśli więc coś ci nie działa jak piszesz to pewnie robisz błąd w całkiem innym miejscu kodu - a tymczasem próbujesz szukać go w masce. A maskę zrobiłeś dobrze ;)<br />if( ! ( PIND & 0x1F ) ) .....<br /><br />tyle tylko że źle rozumiesz działanie tego IF'a ... bo tu zadziała to tak - że jeśli na KAŻDYM z tych pinów wystąpi ZERO to wtedy warunek zostanie spełniony - rozumiesz ?<br /><br />Jeśli chcesz reagować na to czy na którymkolwiek wystąpi zero to trzeba sprawdzać konkretną wartość maski panie kochany ... czyli np<br /><br />if( ( PIND & 0x1F ) != 0x1F ) ....<br /><br />tu badamy dopiero czy na którymś bicie wystąpiło zero, bo jeśli nie wystąpiło to zawsze wartość PIND zamaskowana 0x1F będzie równa 0x1F - teraz jaśniej ? ;)mirekk36https://www.blogger.com/profile/11690797724225993397noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-76514914358550357412015-12-09T16:55:42.026+01:002015-12-09T16:55:42.026+01:00Witam
Na wstepie pozdrawiam autora za jego trud......Witam<br />Na wstepie pozdrawiam autora za jego trud...<br />Mam pytanie. Probuje badac stan portu:<br />if(!((PIND & 1<<PD4)&&(PIND & 1<<PD3)&&(PIND & 1<<PD2)&&(PIND & 1<<PD1)&&(PIND & 1<<PD0))) PORTB |=(1<<PB7);<br />czyli jezeli na ktoryms pinie wystapi stan 0 to zapalam PB7,<br />ale ten if to taka dluga zmija i probowalem to zapisac:<br />if(!(PIND & 0x1F)) tak zeby czytac od razu calosc ale ten zapis mi nie dziala. Prosze o pomoc jak maskowac caly bajt.<br />Pozdrawiam<br />StefanAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-34188768131448719812015-07-26T14:25:16.284+02:002015-07-26T14:25:16.284+02:00Nie ma za co ;) ... fajnie że udało się pomócNie ma za co ;) ... fajnie że udało się pomócmirekk36https://www.blogger.com/profile/11690797724225993397noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-31138420774866874542015-07-26T14:20:05.787+02:002015-07-26T14:20:05.787+02:00Dziękuję Ci Mirku. Wreszcie zrozumiałem.Dziękuję Ci Mirku. Wreszcie zrozumiałem.Anonymoushttps://www.blogger.com/profile/01346865361424836151noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-36283751485256424542014-03-15T18:58:34.240+01:002014-03-15T18:58:34.240+01:00Ale horror przerywnik bąbaAle horror przerywnik bąbaAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-15914963501286749432014-03-14T22:32:17.897+01:002014-03-14T22:32:17.897+01:00Bardzo dobrze to zrozumiałeś ;) w 8051 mamy pola b...Bardzo dobrze to zrozumiałeś ;) w 8051 mamy pola bitowe realizowane sprzętowo, a w AVR nie. Można sobie wprawdzie zrobić programowo pola bitowe za pomocą struktu<br /><br />struct {<br /><br /> uint8_t flaga1:1;<br /> uint8_t flaga2:4;<br /><br />} TFLAGI;<br /><br />opisuję to w swojej książce poniekąd. Jak widać pole bitowe nie musi wtedy mieć rozmiaru jednego bitu a więcej, ale i tak nawet jeśli zrobimy taką strukturę z jedną flagą to w RAM zejdzie nam na to 1 bajt ;) Więc nie zawsze jest to opłacalnemirekk36https://www.blogger.com/profile/11690797724225993397noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-75937826158393185162014-03-14T22:24:40.284+01:002014-03-14T22:24:40.284+01:00Możliwe ,że to moja wina i coś wyłączyłem ,bo bawi...Możliwe ,że to moja wina i coś wyłączyłem ,bo bawiłem się w opcjach edytora. Wrzucę świeżą kopię ,albo dam ustawienia na Defultowe i sprawdzę.<br /><br />Tak tylko czy dobrzę rozumię, w mikrokontrolerach 8-bitowych ,najmniejsza zmienna w C to uin8_t ,więc odpada flaga bitowa "0" ,"1"<br /><br />Jeśli dokonujemy zapisu to ,przesunięcia bitowe, np. dla trybu Timera1 bit CS02.<br /><br />TCCR0B |= (1<<CS02)<br /><br />,ale chcąc np. odczytać wartość tego rejestru ,nie mogę dać (zmienna i):<br /><br />i=CS02; (czy wartość 0 lub 1)<br /><br />tylko szczytać to z rejestru <br /><br />i=TCCR1B; (i 8bitowa uin8_t ) ,potem maskowanie i widzę warość ustawioną CS02.<br /><br />Podobnie w rejestrach PINx ,zawsze otrzymujemy 8-bitową daną ,nie można iść na skróty i sprawdzać wiewiórcze pojedyńcze Bity (0-7) ,na wartość 0 i 1. <br /><br />Dobrze zrozumiałem?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-28888332641240423462014-03-14T22:03:32.682+01:002014-03-14T22:03:32.682+01:00Musiał protestować - chyba że nie używasz Eclipsa ...Musiał protestować - chyba że nie używasz Eclipsa tylko np kocie Atmel Studio z wyłączonym ostrzeganiem albo z czegoś jeszcze bardziej egzotycznego. Albo może nie zauważyłeś ;)<br /><br />nie ma mocnych ;) PINC7 to twór przypominający rodem robaczka np z Bascoma, więc końpilator C musi dostać co najmniej torsji na widok czegoś takiego ;)mirekk36https://www.blogger.com/profile/11690797724225993397noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-34521442579002657602014-03-14T21:58:26.325+01:002014-03-14T21:58:26.325+01:00A no tak teraz to ma sens jeśli nie można bezpośre...A no tak teraz to ma sens jeśli nie można bezpośrednio PINC7 ,tylko odczytujemy zawartość całego PINC ,to faktycznie cza maskować. Dziwne ,że kompilator nie protestował?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-61618270805235639412014-03-14T21:49:41.004+01:002014-03-14T21:49:41.004+01:00No zobacz upierasz się a nie chce ci się przeanali...No zobacz upierasz się a nie chce ci się przeanalizować prostego przykładu<br /><br />załóż że rejestr PINC ma wartość <br /><br />0b11111111<br /><br />no i teraz że ty wciskasz sobie PC7 do GND<br /><br />czyli twój niby warunek<br /><br />if( PINC7 == 0 )<br /><br />łał - matko dopiero teraz zobaczyłem coś ty tam wyżej napisał<br /><br />a co to jest panie kochanieńki <br /><br />PINC7 ????? hmmm<br /><br />nie ma czegoś takiego - rozumiesz ??? <br /><br />-----------------------------<br /><br />_BV() to BitValue() .... czyli DOKŁADNIE to samo co (1<<PC7)<br /><br />a gdy ja widzę, że ktoś unika jak ognia zapisu<br /><br />(1<<PC7)<br /><br />to z daleka mi pachnie że ma GIGANTYCZNE KŁOPOTY ze zrozumieniem przesunięć bitowych i tak naprawdę co chwilę ma kłopoty z programowaniem w C<br /><br />ja ZDECYDOWANIE polecam i piszę to przez całą swoją niebieską książkę - polecam używać zapisów z przesunięciami bitowymi bo kod staje się bardziej przejrzysty niż z tymi kocimi makrami _BV() i już ;)mirekk36https://www.blogger.com/profile/11690797724225993397noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-53534890896678120522014-03-14T21:10:25.545+01:002014-03-14T21:10:25.545+01:00No tak ,ale podciąganie ,załatwia sprawę i mamy &q...No tak ,ale podciąganie ,załatwia sprawę i mamy "1" dopuki nie nacisnę klawisza.<br />Interesuje mnie tylko PINC7 w tym przypadku ,więc nawet jeśli pozostałe stany są dowolne to i tak powinno zadziałać, kiedyś też spotkałem się z takim zapisem:<br /><br />if (((PINC & _BV(PC7))==0){<br /><br />//instrukcje<br /><br />}<br /><br />,stara książka ,chyba jedna z pierwszych na mikrokontrolery AVR w C, ale jakoś nie podeszły mi te zapisy _BV ,odkąd mam BB używam przesunięć bitowych i jest OK.<br /><br />Zapytałem z ciekawości ,bo pomimo innego zapisu okazuje się ,że też działa (no chyba ,że ma ukryte wady )Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-65742414060368605462014-03-14T21:00:39.042+01:002014-03-14T21:00:39.042+01:00Myślę że sam odpowiedziałbyś sobie na to pytanie m...Myślę że sam odpowiedziałbyś sobie na to pytanie mając książkę Bluebooka a nawet zdaje się w tym poradniku o tym wspominałem - ale ok - pewnie ci umknęło więc przypomnę.<br /><br />Po pierwsze to maskowanie bitu dla PINC na PC7 nie jest żadnym utrudnianiem ;) ty sobie nie zadałeś trudu sprawdzenia co by było gdyby w całym rejestrze PINC były np same jedynki z jakichś powodów (nie ważne jakich - np inne klawisze) ... <br /><br />no to teraz po wciśnięciu klawisza na PC7 jaką wartość będziesz miał w PINC ????<br /><br />0b0111111<br /><br />rozumiesz ??<br /><br />a nie<br /><br />0b00000000<br /><br />bo gdyby przypadkiem były zera to przypadkiem wychodzi twoje myślenie i się zgadza ;) ale czy tak robisz że na jeden cały port dajesz tylko jeden klawisz a innych pinów nie używasz ?<br /><br />Ba! gorzej - nawet gdybyś ich nie używał to na tych pinach byłby stan wysokiej impedancji i za każdym odczytem ZAKŁADAJĄC np że klawisz na PC7 wciśnięty mógłbyś odczytywać takie np wartości z PINC<br /><br />0b01011101<br /><br />albo<br /><br />0b0010100<br /><br />albo <br /><br />0b01110111<br /><br />itp itd<br /><br />i co wtedy panie kochany ? ;)<br /><br />no MUSIMY zamaskować te inne bity<br /><br />0b01101010 - zawartość PINC<br />0b10000000 - maska (1<<PC7) i operacja AND<br />----------------------<br />0b00000000 - rezultat w IF - teraz jeszcze tylko negacja ! i jest TRUE<br /><br />a ty sam sprawdź co się stanie bez maskowania i nie mów że to utrudnianie sobie życia - bo NIEMOŻLIWA jest operacja sprawdzenia bez maskowania po prostu - ok ?mirekk36https://www.blogger.com/profile/11690797724225993397noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-32211001416466989902014-03-14T20:51:39.061+01:002014-03-14T20:51:39.061+01:00W 20 min. w wyrażeniu IF ,brakuje końcowego nawias...W 20 min. w wyrażeniu IF ,brakuje końcowego nawiasu. Ale spoko.<br /><br />Rozumiem maskowanie bitów ,ale muszę zapytać ,nawet jeśli to głupio zabrzmi ,dlaczego nie mogę po prostu odczytywać "0" po wciśnieńciu klawisza z rejestru PINx<br /><br />,w taki oto sposób:<br /><br />if (PINC7==0) {<br /><br /> PORTD ^=LED //zmień stan diody<br /><br /> }<br /><br />działa podobnie po skompilowaniu ,więc dlaczego utrudniać sobie maskowaniem ?<br /><br />pomijam w przykładzie delaye i drgania styków ( chodzi tylko o formę warunkową).Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-37906142785043985602014-03-14T09:26:35.483+01:002014-03-14T09:26:35.483+01:00EXTRA! to mi się podoba podejście do zagadnienia j...EXTRA! to mi się podoba podejście do zagadnienia jak DOCTOR!Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-53019385700598081242014-03-13T23:42:09.003+01:002014-03-13T23:42:09.003+01:00Super poradnik . Hirurgicznie wyjaśnione:D Pozdra...Super poradnik . Hirurgicznie wyjaśnione:D Pozdrawiam. Anonymoushttps://www.blogger.com/profile/05582890807330974759noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-91638037104626470022014-03-13T21:04:41.595+01:002014-03-13T21:04:41.595+01:00Wiem, że na FX kariery nie zrobię ;) nie o to chod...Wiem, że na FX kariery nie zrobię ;) nie o to chodzimirekk36https://www.blogger.com/profile/11690797724225993397noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-54164563843177666342014-03-13T19:27:12.085+01:002014-03-13T19:27:12.085+01:00Fajny poradnik , ale moim zdaniem porównywanie mas...Fajny poradnik , ale moim zdaniem porównywanie masek jest bardziej zrozumiałe kiedy na operacjach logicznych porównujemy liczby binarne , a nie dziesiętne czy heksadecymalne. Coś mi się wydaje że na F/X kariery nie zrobisz , ale próbuj . Pozdrowienia.Anonymoushttps://www.blogger.com/profile/03820945854240835583noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-34452326027820648762014-03-13T18:28:35.373+01:002014-03-13T18:28:35.373+01:00Świetny poradnik, przydałby się też taki poświęcon...Świetny poradnik, przydałby się też taki poświęcony funkcjom. Są co prawda opisane w BB ,ale jednak oglądanie i słuchanie poradników ,to coś więcej niż suchy tekst.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-68205846637207126192014-03-13T14:45:01.449+01:002014-03-13T14:45:01.449+01:00Również pozdrawiam ;) ... i jak zwykle podziwiam u...Również pozdrawiam ;) ... i jak zwykle podziwiam upór szanownego kolegi do naszego ulubionego języka C ;) .... ale ja i tak wierzę, że kiedyś ... że przyjdzie taki czas, że kolega się zmieni i zostanie zaczarowany przez C.mirekk36https://www.blogger.com/profile/11690797724225993397noreply@blogger.comtag:blogger.com,1999:blog-3960927205450249158.post-33846152617321459392014-03-13T14:39:33.560+01:002014-03-13T14:39:33.560+01:00Ja to zagadnienie rozumiem, ale nie popieram. &quo...Ja to zagadnienie rozumiem, ale nie popieram. "C" jest prawie tak samo wredny jak jedna moja sąsiadka, która wdziewa różne maski aby powiedzieć coś nie wprost.<br />Pozdrawiam kolegę Mirka i jak zwykle życzę szczęścia, zdrowia, pomyślności :)<br />ZenowiAnonymousnoreply@blogger.com