tag:blogger.com,1999:blog-6085382734211687437.post5064208578877165518..comments2024-03-21T08:13:48.283+01:00Comments on Mikrokontrolery Jak zacząć - zbiór najczęściej udzielanych porad: Problemy C - Ustawianie i zerowanie bitówUnknownnoreply@blogger.comBlogger16125tag:blogger.com,1999:blog-6085382734211687437.post-51479197972572317312015-01-26T21:13:27.055+01:002015-01-26T21:13:27.055+01:00Faktycznie, źle to przemyślałem, rozpisanie na kar...Faktycznie, źle to przemyślałem, rozpisanie na kartce pomogło również :)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-59627883880115700402015-01-26T20:42:54.897+01:002015-01-26T20:42:54.897+01:00Nie, to zaneguje tylko bit PC0, gdyż negację wywoł...Nie, to zaneguje tylko bit PC0, gdyż negację wywołuje tylko argument XOR 1, operacja argument XOR 0=argument. Przy okazji warto zauważyć, że tego typu operacje w mikrokontrolerach XMEGA i ARM wywołuje się ustawiając odpowiedni bit rejestrów toggle (dla XMEGA PORTC.OUTRGL=1<<Pin0_bm. Warto pamiętać, że operacja wykonana przy pomocy operatorów logicznych języka C zazwyczaj nie jest wykonywana atomowo.tmfnoreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-89681961952010552112015-01-26T20:37:18.398+01:002015-01-26T20:37:18.398+01:00Witam, mam takie pytanie. Czy można zanegować tylk...Witam, mam takie pytanie. Czy można zanegować tylko jeden bit, bez ruszania pozostałych? Myślałem nad <b>PORTC ^= (1<<PC0);</b>, ale to raczej zaneguje też inne bity, których wartość jest równa 0.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-66929742374169512872014-07-21T18:07:49.150+02:002014-07-21T18:07:49.150+02:00Na wiele pytań nie ma jednoznacznej odpowiedzi i k...Na wiele pytań nie ma jednoznacznej odpowiedzi i każdy preferuje coś innego. Dondu woli << co ma zalety o których pisze, niemniej makro _BV jest bardziej odporne na błedy, szczególnie błąd polegający na zastąpieniu << pojedynczym < co tworzy poprawną semantycznie konstrukcję, lecz dającą wynik daleki od oczekiwanego. Także dostałeś argumenty za i przeciw, musisz sam zdecydować co bardziej ci odpowiada.tmfnoreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-70411312328346669962014-07-19T09:42:26.167+02:002014-07-19T09:42:26.167+02:00"1.2 _BV(x) czy (1<<x) ?"
Pan Toma..."1.2 _BV(x) czy (1<<x) ?"<br />Pan Tomasz Francuz w książce"Język C do mikrokontrolerów..." Odpowiada na to pytanie odwrotnie niż jest w artykule, i kogo teraz słuchać?? Oto jest pytanie....Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-62149037717904518382014-02-27T23:18:20.138+01:002014-02-27T23:18:20.138+01:00Dzięki za zwrócenie uwagi - poprawiłem,
Wiadomość ...Dzięki za zwrócenie uwagi - poprawiłem,<br />Wiadomość nie ulegnie samozniszczeniu - bardzo cenimy sobie wszelkie uwagi :DDonduhttps://www.blogger.com/profile/00935153382439363150noreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-3577740938982477762014-02-27T18:41:33.817+01:002014-02-27T18:41:33.817+01:00"2. BŁĄD: Nie uwzględnianie WARTOŚCIach począ..."2. BŁĄD: Nie uwzględnianie WARTOŚCIach początkowych rejestrów i portów"<br />Ta wiadomość ulegnie samozniszczeniu za 5, 4, 3,... ;)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-58438635986621647532013-08-27T22:59:37.883+02:002013-08-27T22:59:37.883+02:00A teraz:
unsigned char DDRD; //symulujemy rejestr...A teraz:<br /><br />unsigned char DDRD; //symulujemy rejestr DDRD<br /><br />/* PORTD */<br />#define PD7 7<br />#define PD6 6<br />#define PD5 5<br />#define PD4 4<br />#define PD3 3<br />#define PD2 2<br />#define PD1 1<br />#define PD0 0<br /><br />//funkcja konwersji liczby na ciąg znaków reprezentacji binarnej<br />const char *byte_to_binary(int x){<br />//wykorzystuje nagłówek string.h<br />int z; static char b[9]; b[0] = '\0'; for (z = 128; z > 0; z >>= 1){strcat(b, ((x & z) == z) ? "1" : "0");}; return b;<br />}<br /><br />int main(void) {<br /><br />DDRD = 0x0F;<br />DDRD = DDRD | (1<<PD6) & ~(1<<PD2);;<br />printf("%s\n", byte_to_binary(DDRD)); //pokaż DDRD<br /><br />DDRD = 0x0F;<br />DDRD = (DDRD & ~(1<<PD2)) | (1<<PD6);<br />printf("%s\n", byte_to_binary(DDRD)); //pokaż DDRD<br /><br /> <br />DDRD = 0x0F;<br />DDRD = DDRD & ~(1<<PD2) | (1<<PD6);<br />printf("%s\n", byte_to_binary(DDRD)); //pokaż DDRD<br /> <br />return 0; <br />}<br /><br />Powinieneś poćwiczyć priorytety operatorów: http://pl.wikibooks.org/wiki/C/OperatoryDonduhttps://www.blogger.com/profile/00935153382439363150noreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-30477829703450826082013-08-27T14:04:34.886+02:002013-08-27T14:04:34.886+02:00O dzisiaj działa. Dziwne, wczoraj nie działało. A ...<i>O</i> <b>dzisiaj</b> <a href="mikrokontrolery.blogspot.com" rel="nofollow">działa</a>. Dziwne, wczoraj nie działało. A kod (jak widzę) nie wykonuje swojej powinności. Zrobienie tego w osobnych liniach zabiera 2B więcej w porównaniu do jednej linii. To dużo, jeżeli ma się 1kB flash'a.Anonymoushttps://www.blogger.com/profile/07088353068124632014noreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-31364617981309326132013-08-27T13:28:59.741+02:002013-08-27T13:28:59.741+02:00W programie powyżej jest komentarz, który należy u...W programie powyżej jest komentarz, który należy usunąć, bo jest z poprzedniego przykładu: "//ustaw w DDRD bit PD0"Donduhttps://www.blogger.com/profile/00935153382439363150noreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-65725967968142110922013-08-27T13:07:47.040+02:002013-08-27T13:07:47.040+02:00Zacznę od końca:
Źle odebrałeś moje słowa w nasze...Zacznę od końca:<br /><br />Źle odebrałeś moje słowa w naszej dyskusji <a href="http://www.blogger.com/profile/00935153382439363150" rel="nofollow">tutaj</a>. Naprawdę podziwiam Ciebie i przypominam sobie czasy, gdy w Twoim wieku mój tato przywiózł mi komplet elektronicznego hobbysty z ZSRR, w którym były tranzystory germanowe i trochę krzemowych. Do dzisiaj mam jeszcze ich resztki :-)<br /><br />Co do HTML, to nie mam na to wpływu, Google ogranicza tylko do tagów: a, <i>i</i>, <b>b</b>.<br /><br />Oto program z Twoim fragmentem, ale dla PORT<b>D</b>, który możesz przetestować i modyfikować w <a href="http://mikrokontrolery.blogspot.com/p/cmaniak-kompilator-jezyka-c-online.html" rel="nofollow">CManiaku</a>:<br /><br />unsigned char DDRD; //symulujemy rejestr DDRD<br /><br />/* PORTD */<br />#define PD7 7<br />#define PD6 6<br />#define PD5 5<br />#define PD4 4<br />#define PD3 3<br />#define PD2 2<br />#define PD1 1<br />#define PD0 0<br /><br />//funkcja konwersji liczby na ciąg znaków reprezentacji binarnej<br />const char *byte_to_binary(int x){<br />//wykorzystuje nagłówek string.h<br />int z; static char b[9]; b[0] = '\0'; for (z = 128; z > 0; z >>= 1){strcat(b, ((x & z) == z) ? "1" : "0");}; return b;<br />}<br /><br />int main(void) {<br /><br />//ustaw w DDRD bit PD0<br />DDRD = DDRD | (1<<PD3) & ~(1<<PD4);;<br />printf("%s\n", byte_to_binary(DDRD)); //pokaż DDRD<br /><br />return 0;Donduhttps://www.blogger.com/profile/00935153382439363150noreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-63375475676252586222013-08-27T02:24:36.866+02:002013-08-27T02:24:36.866+02:00A czy można jednocześnie ustawić i wyzerować bity ...A czy można jednocześnie ustawić i wyzerować bity w rejestrze w ten sposób:<br />DDRB = DDRB | (1<<PB3) & ~(1<<PB4);<br />Na mój wysoce matematyczny umysł (13-latka, których tak deprymowałeś, z powodu nieogarniania logiki), powinno to działać (kod się kompiluje).<br /><br />I (standardowo) uwaga do bloga: nie da się wstawić HTML w komentarzu. Nigdy. Żadnego. W ogóle.Anonymoushttps://www.blogger.com/profile/07088353068124632014noreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-5173111447092732842012-05-18T12:28:28.318+02:002012-05-18T12:28:28.318+02:00Witaj,
Opis dotyczył pinu więc oczywiście masz rac...Witaj,<br />Opis dotyczył pinu więc oczywiście masz rację powinno być PIN, a nie PORT. Poprawione, dziękuję za zwrócenie uwagi!Donduhttps://www.blogger.com/profile/00935153382439363150noreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-40429260267372925432012-04-22T17:18:30.254+02:002012-04-22T17:18:30.254+02:00Witam
w punkcie 1.4 jest napisane:
// dobr...Witam<br /><br />w punkcie 1.4 jest napisane: <br /> // dobrze <br /> if(PORTA & (1<<PA0)){ <br /> //tak jest jedynka <br /> } <br /><br />nie powinno być przypadkiem:<br /> // dobrze <br /> if(PINA & (1<<PA0)){ <br /> //tak jest jedynka <br /> }Wellbyhttps://www.blogger.com/profile/04023324805886051181noreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-58887538330795164272011-10-19T20:53:38.236+02:002011-10-19T20:53:38.236+02:00Używanie zdefiniowanych nazw, daje KOLOSALNĄ zalet...Używanie zdefiniowanych nazw, daje <b>KOLOSALNĄ zaletę</b>, że gdy po paru dniach, tygodniach, czy miesiącach siądziesz ponownie do tak napisanego programu, od razu będziesz wiedział o co chodzi, bez sięgania do dokumentacji mikrokontrolera, by sprawdzić, co oznacza dla rejestru zawartość na przykład 0xf9.<br /><br />Poza tym, przenosząc program na inny mikrokontroler tej samej rodziny, będziesz miał <b>KOLOSALNIE mniej pracy</b> z jego adaptacją.<br /><br />Tak, pomagający na forum są przyzwyczajeni do zdefiniowanych nazw i nie muszą sięgać do datasheet by sprawdzić Twój program.<br /><br />Zawsze możesz jeszcze zdefioniować własne np.:<br />#define LED_zielony PD2<br />albo wręcz<br />#define LED_on PORTD |= (1<<PD2)<br />#define LED_off PORTD &= ~(1<<PD2)Donduhttps://www.blogger.com/profile/00935153382439363150noreply@blogger.comtag:blogger.com,1999:blog-6085382734211687437.post-58464552098950201382011-10-19T20:41:52.405+02:002011-10-19T20:41:52.405+02:00Witam!
Czy ustawianie bitów na portach w postaci
P...Witam!<br />Czy ustawianie bitów na portach w postaci<br />PORTB = (1<<PD2) lub<br />PORTD = (7<<5);<br />jest czytelniejsze od wpisywania wartości szesnatkowo?<br />Łatwiej jest mi ustawiać porty hexadecymalnie, ale w celu <br />sprawdzenia poprawności kodu na forum łatwiej innym będzie sprawdzać kod z bitami zapisanymi hex czy 1-szym sposobem?<br /><br />Pozdrawiam<br />Modecom601Anonymousnoreply@blogger.com