Pytanie o kurs

Sep 25, 2008 21 Replies

Zaczynam programowanie AVR w C



Posiadam spore do¶wiadczenie w programowaniu dla Windows i Linuksa zarówno Pascal jak i C/C++ Basic-a nie znam i nie lubiê



Uczê siê z kursu w Elektronika dla Wszystkich od 05/2005


Moje Pytanie jest nastêpuj±ce.



Czy przesuniêcia bitowe s± a¿ tak wa¿ne w przypadku mikrokontrolerów aby stosowaæ je od razu na drugiej lekcji kursu, dla PC prawie w ogóle siê ich nie u¿ywa.


Autor kursu wylicza za pomoc± przesuniêæ bitowych warto¶æ do wpisania do rejestru i od razu t³umaczy ¿e kompilator i tak wyliczy warto¶æ i wpisze j± do rejestru, wiêc po co to robiæ przecie¿ to gmatwa zapis zw³aszcza dla pocz±tkuj±cych.


Cyt.



...



#define LEDDDR DDRB



#define COMMDDR DDRD



...



#define COM1 6



#define COM2 5



#define COM3 4



#define COM4 3



...



// inicjalizacja



LEDDDR = 0xff;



COMDDR = 1<< COM1 | 1<<COM2 | 1<<COM3 | 1<<COM4;



//koniec inicjalizacji


Poza tym czy nadawanie nazwy LEDDR dla DDRB jest a¿ tak wygodne?



To tak jakby korzystaæ z dwóch portów com i nadawaæ im inne nazwy np. wy¶wietlacz i maszyna aby siê nie pomyliæ.


Czy te udogodnienia a¿ tak du¿o daj±.


begin 666 Karol Szymañski.vcf M0D5'24XZ5D-!4D0-"E9%4E-)3TXZ,BXQ#0I..E-Z>6UA\7-K:3M+87)O; T* M1DXZ2V%R;VP@4WIY;6'Q<VMI#0I%34%)3#M04D5&.TE.5$523D54.FMO;G-U L;#0Q0'=P+G!L#0I2158Z,C P.# Y,C54,3 R,S(U6@T*14Y$.E9#05)$#0H` ` end


snipped-for-privacy@wp.pl pisze: (...)

W uC bardzo często trzeba ustawić jakiś pojedynczy bit bądź kilka bitów w rejestrze, aby to zrobić w sposób czytelny musisz używać przesunięć.

(...)

W tym przypadku to średnio, ale autorowi chodziło o samą zasadę - w dużym projekcie byś się pogubił jakbyś nie nadawał własnych nazw.

Tutaj bardziej chodzi o nadanie nazwy którą programista będzie pamiętał.

Proponuje abyś w jakimś programie wszystkie zmienne po nazywał sobie w następujący sposób: a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 itp.

Tak

W tym wypadku, który opisa³em nie prostrza(bardziej zrozumia³a) by³a instrukcja PORTB=0x78; // lub bardziej przej¿y¶cie PORTB=0b01111000; // autor pu¼niej wyja¶nia i¿ takie bity wpisane bêd± do rejestru

Ewentualnie inny przyk³ad

strona

formatting link
char znaki[17] = {192,249,164,176,153,146,130,248,128,144,136,131,198,161,134,142,0}; ...

i kurs EdW s.46 Lipiec 2005

78 Operacji przesuniêcia bitowego oraz kilkana¶cie | (OR) I wszystko po to zaby osi±gn±æ ten sam wynik.

W³a¶nie to próbuje zrozumieæ czy one s± takie wa¿ne czy autor chwali siê umiejêtno¶ci± programowania;

snipped-for-privacy@wp.pl wrote: ...

Napiszesz sobie dobrze dzialajacy, sprawdzony program w ktorym LEDy sa podlaczone do PORTB. Potem sie okaze ze w Twoim urzadzeniu przydalby sie komparator analogowy ktory jest na jednym z pinow PORTB, nie ma problemu bo LEDy mozesz podlaczyc do PORTD ktory nie jest uzywany. No i teraz sie zastanow czy lepiej zmienic kilka #define (z DDRB na DDRD itd), czy zmieniac caly (sprawdzony i dobrze dzialajacy) program?

Tomek

Co do u¿ywania #define to siê zgadzam i nie kwestionuje, poniewa¿ to jest s³uszne i wygodne chocia¿ nie w tak prostych programach.

Bardziej w moich pytaniach chcia³em siê zapytaæ o przesuniêcia bitowe.

Mimo wszystko dziêkujê za odpowied¼.

U¿ytkownik snipped-for-privacy@wp.pl napisa³ w wiadomo¶ci news:gbfqrv$2d0$ snipped-for-privacy@atlantis.news.neostrada.pl...

Ale kod ma byæ w miarê przeno¶ny i o ile dla tego konkretnego procka to wszystko jedno to pomy¶³, ¿e np zmieniasz na ciut wiêkszy bo... I teraz musisz wszystkie te sta³e na nowo dla nowego procka liczyæ czy s± ok, a tak robotê odwala kompilator.

Pozdrawiam FJ

I jak się programuje inny rejestr z różnymi bitami (bo ten tutaj to rzeczywiście nienajlepszy przykład), to jest to IMO bardziej przejrzyste do analizy - jak się później debuguje program, to od razu widać na jaki stan został dany bit ustawiony, zamiast pieczołowicie liczyć na której pozycji jest jedynka a na której zero.

U¿ytkownik "Filip J" snipped-for-privacy@op.pl napisa³ w wiadomo¶ci news:gbft7i$q4d$ snipped-for-privacy@news.onet.pl...

S³uszne argumenty.

Jednak nie do nauki na konkretnym procesorze. To tak jakby¶ przesiad³ siê z PC 32bity na 64bity.

Podsumowuj±c: Do nauki pomin±æ w d³u¿szej perspektywie aby mieæ mniej roboty - stosowaæ.

Dziêkujê za odpowiedzi.

Oczywi¶cie siê bardzo czêsto u¿ywa w³a¶nie ze wzglêdu na fakt, ¿e czêsto siê operuje na bitach. Banalny i klarowny sposób ustawiania poszczególnych bitów w rejestrach:

UCSRB = 1<<RXEN | 1<<TXEN | 1<<RXCIE; //Enable Receiver and Transmitter and RX interrupt UCSRA = 1<<U2X; //Double speed UCSRC = 1<<URSEL | 3<<UCSZ0; //Set frame format: 8data, 1 stop bit

czy jakie¶ sterowanie LEDami:

#define LED1R_OFF LED_PORT &= ~(1<<LED1R) #define LED1Y_OFF LED_PORT &= ~(1<<LED1Y) #define LED1R_ON LED_PORT |= (1<<LED1R) #define LED1Y_ON LED_PORT |= (1<<LED1Y) #define LED1R_FL LED_PORT ^= (1<<LED1R) #define LED1Y_FL LED_PORT ^= (1<<LED1Y)

void led1(char red, char yellow) { if (red != 0) {LED_PORT |= (1<<LED1R);} else {LED_PORT &= ~(1<<LED1R);} if (yellow != 0) {LED_PORT |= (1<<LED1Y);} else {LED_PORT &= ~(1<<LED1Y);} }

void led2(char red, char yellow) { if (red != 0) {LED_PORT |= (1<<LED2R);} else {LED_PORT &= ~(1<<LED2R);} if (yellow != 0) {LED_PORT |= (1<<LED2Y);} else {LED_PORT &= ~(1<<LED2Y);} }

snipped-for-privacy@wp.pl pisze:

No ale jeśli np. miałeś diody na pinach B0..B3, a teraz masz na B0 i B1, oraz B4 i B5 - to niezła masakra program pozmieniać ;)... np 0x03 zostanie, ale 0x05 zmienisz na 0x11 itp ;P... A jak zdefiniujesz #define LED1 0 #define LED2 1 #define LED3 2 #define LED4 3

i bedziesz używał (1 << LED1) itp...

To zmiana programu po "przełączniu" LEDów gdzieś indziej będzie się ogranizcała do zmiany kilku wartości w DEFINE :)... i koniec :)...

Przydatne - bo jeśli kiedyś będziesz pisał program, który będzie działał podobnie, ale na innym porcie i innych pinach - kopiujesz, zmieniasz "DEFINY" i masz :)....

Pozdrawiam Konop

U¿ytkownik snipped-for-privacy@wp.pl napisa³ w wiadomo¶ci news:gbfv22$o5t$ snipped-for-privacy@nemesis.news.neostrada.pl...

W³±¶nie na odwrót, zacz±æ naukê od dobrych praktyk, a w praktyce mo¿na sobie czasem upro¶ciæ ;)

Pozdrawiam FJ

In the darkest hour on Thu, 25 Sep 2008 12:56:31 +0200, snipped-for-privacy@wp.pl snipped-for-privacy@wp.pl screamed:

Nie jest prostsza. Co jest podłączone do portu B? Nie widać bez schematu. Opis LEDcośtam jest dużo bardziej czytelny.

ps. ustaw MIME -

formatting link

U¿ytkownik snipped-for-privacy@wp.pl napisa³ w wiadomo¶ci news:gbfsnr$kcd$ snipped-for-privacy@nemesis.news.neostrada.pl...

Odpowiadaj±c na Twoje w±tpliwo¶ci: pewnie, ¿e da siê ¿yæ bez przesuniêæ bitowych, których nie lubisz i nie u¿ywasz. Po co np. wprowadzaæ w dwubajtowy bufor bity za pomoc± kodu t³umaczonego na 2 czy 3 instrukcje asm, skoro mo¿na to samo wykonaæ du¿o bardziej czytelnym i efektywnym 16-bitowym dzieleniem przez 2.

A potem P4 3G nie wystarcza...

e.

entroper pisze:

podsumowując kolegów - im szybciej przyzwyczaisz się i zaczniesz korzystać z przesunięć bitowych tym lepiej dla Ciebie. W uC operacje bitowe to podstawa. W szczególności w prostych uC.

pozdrawiam yes

podsumowuj±c kolegów - im szybciej przyzwyczaisz siê i zaczniesz korzystaæ z przesuniêæ bitowych tym lepiej dla Ciebie. W uC operacje bitowe to podstawa. W szczególno¶ci w prostych uC.

Ja nie jestem przeciwnikiem przesuniêæ bitowych. Jak co¶ jest wa¿ne to jest wa¿ne i z tym nie dyskutujê.

Ca³y czas chodzi³o mi o wagê przesuniêæ bitowych a nie ich zasadno¶æ. Dziêkujê za odpowied¼.

In the darkest hour on Thu, 25 Sep 2008 13:22:12 +0200, snipped-for-privacy@wp.pl snipped-for-privacy@wp.pl screamed:

Nie będzie żadnych przesunięć w kodzie tylko wyliczona już wartość. Przypuszczam, że może Ci jeszcze chodzić o to, że można było zamiast:

#define X 5 ... int x = 1 << X

dać:

#define X 0x20

int x = X

Ot co zrobilo Windows i C++. Dawniej sie uzywalo gesto.

Zapis gmatwa, ale potem ulatwia zmiany .. szczegolnie jak tych miejsc do obslugiwania jest wiecej i chcialbys np potem skorzystac z innego portu, a tu trzeba zmienic np 10 stalych w programie ..

A jeszcze zostaje kwestia ze nie znasz nr portu w czasie kompilacji - bedzie wybrany przez uzytkownika - choc z tym potrafi byc znacznie wiecej zachodu i ograniczen ze strony sprzetu ..

Dopoki pamietasz do czego jest uzywany DDRB to nie, ale potem musisz program zmienic, albo co gorsza po kims poprawic, i sie zastanawiasz co autor tu chcial powiedziec jak napisal DDRB=8

J.

Przesunięcia bitowe enkapsuluje się w makrodefinicje. _BV(5) oznacza maskę z ustawionym 5 bitem (1 << (5)).

Dla przejrzystości.

A z kolei używanie tutaj makrodefinicji to temat na osobny wykład...

Jest.

Może skonfiguruj sprawdzanie pisowni...

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required