AVR i C operatory

Apr 05, 2006 11 Replies

Witam



Zaiste temat wa³kowany czêsto ale sam nie spotka³em dobrze opisanego wyja¶nienia operatorów. Szczególnie jesli zacznie siê je ³±czyæ. Chodzi mi o to:



zmienna<<=1



Rozumiem ¿e najpierw przesuniêcie zawarto¶ci zmiennej w lewo o jedn± pozycjê a potem zapisanie do niej warto¶ci 1. Po co w takim razie przesuwaæ jak i tak od razu zmienna traci poprzedni± warto¶æ na korzy¶æ jedynki wpisanej zaraz potem? Wydaje siê nielogiczne wiêc chyba ¼le rozumiem. Ponadto zapis taki:



#define A 6



#define B DDRD &=~(1<<A) (w operatorze jest & = ~ )



doprowadza mnie do sza³u. Kiedy¶ jak startowa³em z atmelami naczyta³em siê ¿e lepiej C bo to i tamto. BASCOM by³ jasniejszy ale skorzysta³em z rady na grupie i wystartowa³em w C ku obecnemu znacznemu wkurzeniu. Ratujta bo mnie co¶ trafi.



Rafa³



Kacper napisał(a):

A ja to rozumiem jako zmienna = zmienna <<1; Czyli zmienna przesunięta o 1 w lewo i potem nadpisana nową wartością

Każda następna spotkana literka "A" będzie zamieniona "6" (jeszcze przed kompilacją)

Jeśli chcesz sie związać z C, a bardziej z C++ to polecam symfonię C++ Grębosza. Tom I zawiera podstawy C. To jest bardzo dobra!! książka.

Krzysztof Szmurło

W takim razie mo¿na u¿yæ takiej formu³y:

DDR&=0b11011111

To chyba te¿ zeruje bit a pozosta³± czê¶c portu zostawia bez zmian. Chyba ¿e kto¶ wielokrotnie u¿ywa warto¶ci 6 wiêc j± sobie zast±pi³ nazw± A. To jedyne wyt³umaczenie.

A teraz je¶li mogê prosiæ o wyja¶nienie jeszcze jednego (analizujê przyk³ady przez to siê uczê) takie dwie linie jedna po drugiej w programie:

PORTD=0xFF PORTD&=~(1<<3)

Po kiego grzyba bawiæ siê w chiñszczyznê (linia druga) kiedy wszystkie warto¶ci s± jawne i znane i nie przypisaæ od razu warto¶ci do PORTD? Tu chyba kto¶ przegi±³ z operatorami.

Rafa³

PS. Dziêki za radê, ksi±¿ki poszukam.

U¿ytkownik "Krzysztof Szmur³o" snipped-for-privacy@interia.kropka.pl> napisa³ w wiadomo¶ci news:e106ak$b8p$ snipped-for-privacy@atlantis.news.tpi.pl...

Mam nadzieje ze znasz cos takiego: a+=1; to znaczy to samo co a = a+1;

tu bedzie podobnie: a<<=1; znaczy tyle co a= a<<1; samo a << 1 nie zmieni zawartosci a.

Mo¿na, ale po przyzwyczajeniu siê widaæ od razu, ¿e zerujemy 3 bit, a reszta jest ustawiona. Najprawdopodobniej kompilator i tak wykona to w jednej instrukcji. Ja u¿ywam do zerowania, ustawiania bitów poleceñ cbi i sbi. Jest to kwestia tylko i wy³¹cznie przyzwyczajenia.

To ja sie podepne pod temat...

A co znacza dokladnie nastepujace instrukcje?:

PINSEL0 &= ~(3<<4) PINSEL0 |= (2<<4)

Tu juz nie jest 1, a 2 i 3 - czy znaczy ze 2 = 10b, a 3 = 11b , umieszczone od pozycji 4 w gore? (pomijam tu sprawe ~, & i |, bo te sa oczywiste)

Do poznania i pisania w C na tego typu mikrokontrolery polecam lekturę książki: "Język C" - W. Kernighan, M. Ritchie Bo wydaje mi się że zaczęłeś od razu od pisania w C bazując na jakichś przykładach nie rozumiejąc konstrukcji języka które się w nich znajdują

Pozdrawiam Mariusz

Jest to kwestia czytelnosci

Spinacz biurowy, Kacper <elkacperUSU? snipped-for-privacy@gazeta.pl!

"a operator= b" jest równoważne "a = a operator b". W tym przypadku zmienna = zmienna << 1.

Najpierw przesunięcie zawartości w lewo o jedną pozycję a potem zapisanie tej przesuniętej wartości do zmiennej.

DDRD = DDRD & ~(1 << A), czyli wpisujemy do DDRD wartość DDRD pomnożoną logicznie (AND) przez zanegowaną wartość wyrażenia 1<<A (które swoją drogą powinno być zapisane jako _BV(A). 1<<A to liczba, która ma ustawiony bit na pozycji A.

U¿ytkownik "MariuszC" snipped-for-privacy@.op.toskasuj.pl> napisa³ w wiadomo¶ci news:e118lf$du6$ snipped-for-privacy@news.onet.pl...

tzw. legendarna... ale nie wiem dlaczego - slaba!~~

pozdr.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required