wychodzi na to, że Atmega 16 z jakiegoś powodu przekręca nadawany adres Jak się nie czyta dokumentacji tylko przegląda po łebkach - to tak to jest. Jak wysyłasz adres to bit 0 w TWDR jest bitem kierunku a bity 1-7 to adres. Twój adres EEPROM jest już 8 bitowy :) bo tak to producent w DSie zrobił (uwzględnił to że bit 0 jest kierunkiem) https://obrazki.elektroda.pl/1310316600_...
Napisz z jakiego kompilatora korzystasz i na jakim poziomie optymalizacji kodu wynikowego. Jeśli chodzi o standardy C to ISO99 mówi o ujemnym przesunięciu bitowym " the behavior is undefined" i właśnie dlatego lepiej unikać takich operacji. Jeśli koniecznie musisz być przygotowany na ujemne przesunięcia może utwórz własną funkcję: [syntax=c] uint8_t...
http://obrazki.elektroda.pl/7329866000_1... Miernik częstotliwości o całkiem niezłych parametrach, bo potrafiący mierzyć częstotliwości od 1Hz do 10MHz (9,999,999Hz) z rozdzielczością 1Hz w całym zakresie. Idealny do generatorów funkcyjnych lub jako zwykły miernik. Do tego tani i prosty w wykonaniu, z ogólnodostępnych części, a małe wymiary...
Jedyną "trudnością" jaką musisz pokonać to to, że przesuwać tak da się tylko w prawo :)
Dodaj do jedynki ul i powinno działać: 1ul<<i Domyślny rozmiar zmiennych to zapewne 16-bitów i do tego jeszcze standard mówi o zmiennych ze znakiem, więc twoja liczba (1<<cokolwiek) nie może być większa niż 32767. Jedynka na ostatniej pozycji oznacza liczbę ujemną, więc kompilator dokonuje dopasowania 16-bitowej liczby ujemnej do 32-bitowej...
A to jeszcze lepiej - wzór na zastąpienie prawostronnej jedynki zerem: x = x & (x - 1); co można też zapisać tak: x &= x - 1;
Da się robić różne cuda, ale po co? Autora nie chciałbym spotkać na drodze (pisze lewo, przesuwa w prawo ;-) ) Wedłu standardu C działanie takie o które pyta jest "implementation-defined" A że się tak zapytam czy przypadkiem nie chodzi o dzielenie przez 2^n? Jeśli tak, to czemu po prostu nie dzielisz przez 2 do odpowiedniej potęgi? Albert
Cześć Adres może i dobry, ale jest to adres 7 bitowy - bez uwzględnienia najmłodszego bitu zapisu. Trzeba tą wartość przesunąć w lewo o 1 bit i do tego ustawić lub nie bit zapisu: #define i2c_rw_bit 1 // transmit slave addres I2C1->DR = ( saddr << 1) | i2c_rw_bit ; No i przydałoby się dodać jakieś timeouty w tych pustych pętlach czekających...
Na pewno będzie szybciej 3 razy mnożyć niż 4 A jeszcze szybciej dwa razy mnożyć i wykonać przesunięcie bitowe w prawo, bez jakiegokolwiek dzielenia.
1. Kod można skrócić o połowę. 2. Stosuj sobie przesuniecie bitowe zamiast liczb szesnastkowych bo można się pogubić. 3. To nie C++ tylko C.
w pierszym przypadku dla rozwinięcia i czytelności - przesunięcie bitowe w lewo - shl - powinno się znaleźć ;)
Przesuwa sie w prawo bo na ostatnim miejscu nic już sie nie zmieni i dodaje sie wprost wartość jak sie okręci rejestrem określona ilość razy to i tak wyjdzie dokładnie to co ma wyjść może to troszkę bez logiki ale działa jak powinno. A wynika to z tego że rejestr z wynikiem jest 16 bitowy składa sie z 2 rejestrów. Jak kolega by chciał przesunąć liczbę...
Tak jak napisałem 25MHz x 5 i użycie IDDR2 = 250MHz. Z taką częstotliwościa przychodą dane. Wewnatrz są zamieniane na 8 bitów + dodaje 2 bity kodowania nadmiarowego. To wszystko przesówa sygnał o około 20ns. Reset jest z danymi jako określony ciąg 8 bitowy który trzeba wyłapać. Musze przesunąć zegar 25MHz o około 20ns.
Witaj c4r0 ! jeden napęd jest na pewno taki sam ...hehe twoja jest trochę bardziej trójwymiarowa:) Nie zastanawiałem się specjalnie nad położeniem prowadnic ale nie jest źle...kilogram utrzymuje bez problemu :) . platforma nie działa z prawdziwymi programami CNC. Każdy z silników wykorzystuje 4 bity z 8 bitowego portu LPT. gdy chcę przesunąć silnik...
Ze zmianą DATA chodzi mi o to żeby na wejście DATA wysłać 8 bitowy kod na dane wyjście. Następnie na CLK posłać impuls i przesunąć bit rejestru i posłać znowu 8 bitów na następny (kolejny) rejestr przesuwany. To chyba najprostszy sposób. Może trochę wolne ale bardzo proste w konstrukcji. Wykorzystanie demultiplekserów było by fajne gdyby nie to że zmieniają...
Dzielenie zmiennej int16 na dwie mniejsze możesz zrobić tak:[syntax=c]int 16_t zmienna, zmienna1; int8_t mala_zmienna, mala_zmienna1; mala_zmienna = zmienna >> 8; //przesuniecie bitowe skopiuje 8 bitów starszych mala_zmienna1 = zmienna; // skopiuje tylko 8 bitów najmłodszych zmienna1 = (mala_zmienna << 8) + mala_zmienna1; [/syntax]
Witam! Widzę, że tok poszedł w inną stronę. Rozwijając swój wywód postaram się dalej go rozwinąć. Co prawda liczby mają być 16 bitowe, lecz ja postaram się to ograniczyć do 4 bitów, gdyż zachowanie się bitów z przedziału powiedzmy od 3-go do 14-go jest podobne. Tak więc powiedzmy że mamy 4-ro bitowy argument. Kolejną czynnością będzie doprowadzenie...
Nie stykało coś na płytce. Wróciłem do przesyłania danych 32bitowych teraz to jakoś wygląda i ma sens jeśli chodzi o przebiegi. Pierwszy i drugi przebieg przy napięciu ref 5V. Górny mierzone napięcie 2,5V dolny 0V. Teraz tylko muszę otrzymany 32 bitowy wynik przesunąć przemnożyć przez: wynik = wynik & 0x3FFFFFF; i mam 25 bitów danych przesuwam bity...
Witaj [syntax=c]#include <avr/io.h> // jak tego nie dodam to wywala błąd, tak powinno być ? [/syntax] Dołącza plik nagłówkowy do sterowania wyjściami/ wejściami dla mikrokontrolera AVR. [syntax=c]for(i=0x80;i;i>>=1){ //tej pętli nie rozumiem, jak to może działać ? : )[/syntax] Pętla działa dopóki i jest prawdą, czyli jest różne od zera....
Witam ! Przyklad dla zmiennej 8 bit unsigned char dana=0; //deklaracja zmiennej 8bit unsigned char a,b; //wartosci odczytane z przetwornikow signed char x; //roznica dana=dana<<1; //przesuniecie bitowe w lewo if( (a-b)>x) //sprawdzenie warunku dana=dana|1; //wpisz "1" Mysle ,ze o to chodzilo. Pozdarwiam ogr
Witam. Skoro tak to zastosuj układ CD40194. Pozdrawiam.
Dokumentacja mikrokontrolera EM78P153S znajduje się [url=http://www.emc.com.tw/eng/database/... Problem niby trywialny. Mam taki kod, realizowany w przerwaniu od timera: [syntax=asm]rlc W1_POM rlc W1 rlc W2_POM rlc W2 rlc W3_POM rlc W3 rlc W4_POM rlc W4 rlc W5_POM rlc W5 rlc W6_POM rlc W6 [/syntax] W1...W6 i W1_POM...W6_POM...
Odnowię wątek po paru latach :). Prawda jest taka: praw fizyki pan nie zmienisz. Aby obliczyć ilość danych możliwych do zapisania, trzeba znać pasmo przenoszenia magnetofonu, oraz zastosować jedną z technik modulacji zapisywanych danych. Najprostsza to MFM (piszę z pamięci, odsyłam do googla), polega na nadawaniu nośnej o określonej częstotliwości....
Czy takie całkowanie "trapezowe" ma sens w przypadku równomiernego próbkowania? Jest dokladniejsze, rownomierne probkowanie nie ma tu nic do rzeczy. Co do samego sposobu calkowania to wystarczy sobie wyprowadzic wzor na pole obszaru pod funkcja liniowa. Sklada sie to pole z sumy pola trojkata prostokatnego i prostokata czyli wzor podany powyzej. programowo...
Rejestry GPIOx->BSRRH i GPIOx->BSRRL to "połówki" rejestru BSRR opisanego w manualu, a więc wpisywanie tam wartości większych niż 16-to bitowe nie odniesie żadnego skutku. Zobacz czy w nagłówkach nie ma albo dostępnego rejestru GPIOx->BSRR (bez ...L albo ...H) albo odpowiednich makr GPIO_BSRRx_Bx_xx (z ...L... lub ...H...). W ostateczności w liniach...
Witam. Mam problem z przesunięciem bitowym. Mam taki kod: long int wire_temp(void) { long int zmienna_w; int temp1, temp2; temp1 = 0xCBCF; temp2 = 0xEBAA; zmienna_w = ((temp2 << 16) | temp1); return zmienna_w; } i wynik działania jest błędny. zamiast 0xEBAACBCF jest 0xFFFFCBCF. Widać, że dwa najstarsze bajty się...
Mnożysz lewą cyfrę przedstawiającą wartości dziesiątek x10 i dostajesz 10100 binarnie mnożenie warto zrealizować jako odpowienie przesunięcie bitowe, gdy mnożysz x10 to tak jakbyś mnożył x8 i mnożył x2 27x10 = 27x(8+2)= 27x8 + 27x2 = 27x2^3 + 27x2^1 czyli wynik mnożenia dowolnej liczby x10 jest rowny sumie jej przesuniecia w lewa o 3 bity i przesuniecia...
a czemu dwa razy na bcd?
Widzę tam trochę dziwne założenia: W definicjach masz podane, że wykorzystujesz piny D3-D6, co prawda kolejno, ale nie na granicy nibble, natomiast w kodzie: [syntax=c] // Funkcja wysyłająca 4 bity danych do wyświetlacza LCD void Send4BitsLCD(uint8_t data) { PORTD &= 0xF0; // Wyczyszczenie starszych 4 bitów PORTD |= (data & 0x0F); // Ustawienie...
Przede wszystim, jesli oczekujesz pomocy, musisz podac na jaki procek ten assembler. Po komendach widze ze nie jest to x86, czyli PCet. Byc moze chodzi o jakis mikrokontroler. Nie wiem czy wiesz, ale assembler nie ejst przenoscym jezykiem i nie ma jakies jego standardu - w przeciwienstwie do Ansi C czy pascala. Dalej nie wiem czy wiesz, ze nawet jesli...
Napisałem zanim się domyśliłem - dlatego wykasowałem pytanie o optymalizację :) Takie rzeczy ćwicz w Cmaniaku, bo kod kompilatora dla AVR może robić różne uproszczenia.
Nie znam składni pascalowej, więc napiszę w pseudokodzie: a = 10000011; b = 10000000; for (i=0;i<8;i++) { if ((a and b) == 0) then tablica[i] = false; else tablica[i] = true; przesuń "b" bitowo w prawo; }
Czy mógłbyś napisać dlaczego 0x38 i 0x39 ? Bo adres musisz bitowo przesunąć o jeden w lewo (czyli przemnożyć x2) ze względu na bit R/W, który znajduje się na końcu transmisji.
for - pętla, tak jak napisałeś bit= (buf>>j)&1; Operacje bitowe: ">>" przesuniecie w prawo,"&" operacja AND-owania. Poczytaj o operatorach w c i będziesz wiedzial
Jak piszesz: if (PINB7!=0) to tak jakbyś napisał: if (0x80!=0) Wynika to z faktu że PB7 to makro odwołujące się do nogi procesora a dokładnie do bitu rejestru który trzyma stan tej nogi. Dlatego nie działa. Następne co cię trapi: 1<<PB7 Tak to przesunięcie bitowe. Więc jeśli piszesz: if (PORTB & (1<<PB7))...
Tu masz troszkę prościej, z użyciem operacji przesunięcia bitowego (krótszy kod, łatwiejsza zmiana prędkości linijki led) Dim Led As Byte Dim Kier As Bit Config Portb = Output 'wszystkie porty b jako wyjścia' Portb = &B00000000 'wszystkie porty b w stanie niskim Config Portd = Output 'wszystkie porty d jako wyjscia Portd = &B0000000 'wszystkie porty...
Dzielenie zrobiłem jako przesunięcie bitowe , więc teraz chyba na pewno nie będzie problemów z atomowością. Dziekuje za pomoc wszystkim.
Możesz użyć przesunięć bitowych shl i shr. Poczytaj: http://pl.wikipedia.org/wiki/Przesuni%C4... i tutaj: http://doctor.programuj.com/operatory-bi... Nie napisałeś nawet w czym kodujesz! Pozdrawiam!
operacje mnozenia i dzielenia dumnie opisane jako przesuniecie bitowe lepiej zrealizowac jako przesuniecie bitowe ;) polecenie Shift, szczegóły w helpie... inne propozycje jak bede mial wiecej czasu ;) Pozdrawiam
Przesuń w prawo o 2 bity.
Jedyne, co mi przychodziło do głowy, to przesunięcie bitowe w prawo i tak właśnie napisałem, jednak albo moja odpowiedź była zbyt ogólnikowa, albo nie o to chodzi wykładowcy. To jest ośmiokrotne przesunięcie bitowe w prawo. Ten sam efekt uzyskamy, odrzucając cały młodszy bajt. Jeżeli zaokrąglenie ma być zgodne z zasadami arytmetyki, to gdy młodszy...
Ale projektuję nową wersję swojego urządzenia i nie wiem czy lepiej będzie stłumić sygnał dzielnikiem hardware-owo czy software-owo. Zwykle lepiej jesty wykorzystywać pełną rozdzielczość ADC, a potem ew. robić przeliczenia softwarowo. Czyli tak jak ci kolega doradzał - przesunięcie bitowe i tyle. Jeśli z 24 bitów robisz 16 to nie ma siły - jakoś te...
nieprawda przesunięcie bitowe "zwróci" liczbę 16 bitową
To po twojej stronie masz problem, zmienne pewnie są 32bitowe a ty czytasz 16bitowe rejestry tak ustawiłeś w Logo. Zmień na Dword i zrób przesunięcie bitowe. Większość liczników odczytuje się jako Real 32 bit lub wodomierze 64 bit
Chciałbym zwrócić uwagę na odczyt wyniku konwersji: [syntax=c] ... uint16_t ConversionResults[ADC_CHANNELS]; // zmienna 16bitowa ... ADMUX = 0x60; // AVCC with external capacitor at AREF pin, left adjust result; // left adjusted, czyli przesunięty o 6 bitów w lewo !!! ... static const uint8_tChannelMUX[ADC_CHANNELS] = {0x61, 0x62, 0x63}; // włączony...
<< - przesunięcie bitowe w lewo (na polski - pomnożenie razy 2) >> - przesunięcie bitowe w prawo (na polski - podzielenie przez dwa do części całkowitej) ~ - negacja logiczna (NOT) & - iloczyn logiczny (AND) *x - wskaźnik na element (podczas definiowania; podczas użycia - jest to wartość elementu wskazana przez wskaźnik)
To jest przesunięcie bitów w prawo. Czyli bitowo 0b00010000 >> 1 da 0b00001000 . Często użyte jako optymalizacja w kodzie zamiast dzielenia (chociaż nowoczesne kompilatory powinny to robić same) gdzie >>10 będzie równoznaczne z /1024. Gdybyś policzył 5115000/4995 to byś to zauważył.
Poniżej przedstawiam działającą procedurkę jaką sobie napisałem do obliczania CRC16 w komunikacji po ModBusie z falownikami. Nie wiem tylko pojęcia czy algorytm obliczania dla ModBus jest jednakowy np z tym dla czujników dallasa z 1-wire ale CRC to CRC :) ;crcl, crch - zmienne zdefiniowane w wewnętrznej RAM ;-----obliczanie CRC16----r0, r1, acc----...
To co chcesz osiągnąć robi się poprzez tzw przesunięcie bitowe i na twoim przykładzie wygląda to tak: [syntax=csharp] short wynik = (short)((147 << 8) | 7) [/syntax]
Jesteś pewien, że działa prawidłowo? Domyślnie kompilator wpisuje wartości stałe do jak najmniejszego możliwego typu, czyli stała "1" będzie uint8_t (dla procesorów 8-bitowych). Przesunięcie w lewo "ośmiobitowej jedynki" o wartość większą niż 7 w wyniku da 0. Najlepiej będzie tak jak napisał kol. BlueDraco, tylko, żeby bezpośrednio zamienić to co masz...
Racja - ale myslałem ze tam stała moze byc 16 bitowa. To nie chodzi o to ilu jest bitowa, tylko jaka ma "szerokość". Stały operand w takich instrukcjach może być 8-bitową stałą przesuniętą o dowolną ilość bitów. Tak wiec 0xff000000 też może być zawarte w takiej instrukcji, ale już 0x80000001 - nie. Dodatkowo ten 8-bitowy operand może być też w formie...
Dzieki wielkie, ustawilem przesunięcie bitowe tak jak powiedziales i zadziałało :)
Witam wszystkich ;) Uczę się samodzielnie javy z książki pt. " Praktyczny kurs JAVA". Mój problem polaga na tym, że zatrzymałem się na zadaniu którego treść brzmi " Zdeklaruj zmienną typu int o dowolnej nazwie. Przypisz jej wartość 256. Wykonaj trzy działania : przesunięcie bitowe w prawo o dwa miejsca, przesunięcie bitowe w lewo o dwa miejsca oraz...
Bo zmienna BOOL jest 8-bitowa. W pierwszej kolejności konwersja na WORD a następnie przesunięcie.
Nie pomyślałeś ;-( Sprawdź: 1. co daje przesunięcie bitowe liczby 0 o 5 pozycji 2. jak działa operator bitowy | lub |= Albert
TCCR0 = _BV(x<<CS00); Źle użyłeś makra _BV. _BV(x) jest równoznaczne z ( 1 << x ), czyli w Twoim przypadku próbujesz wykonać podwójnie przesunięcie bitowe. Jeżeli x = 3 (CS00=0): _BV(3<<CS00) = _BV(3) = (1<<3) = 0b00001000 czyli TCCR0 będzie równe 0b00001000 . Innymi słowy, próbujesz ustawić bit tylko do odczytu, zamiast...
Dzięki za pomoc BlueDraco, podziałało 1ul << x : ) , nie przyszło mi na myśl że przesuniecie bitowe działa tylko dla 16 bitów, ciągle człowiek się czegoś uczy. Jeszcze raz dzięki i pozdrawiam!.
wlasciwie te dwa sposoby to identyczne sa :D... tylko oczywiscie, jesli chodzi o iplementacje, to lepiej stosowac przesuniecie bitowe (pomnozyc przez 2^n to to samo co przesunac liczbe o n miejsc w lewo... dzielenie w prawo :)), gdyz procesor szybciej to liczy :)...
Dzięki za sugestie. Znalazłem błąd. Błędna była ustawiona kolejność portów. W moim przypadku największym utrudnieniem w programowaniu jestem na tym etapie sam ja. Przesunięcie bitowe, które wskazał Freddie Chopin również było błednie przeze mnie ustawione, zmieniłem i wszystko funkcjonuje jak powinno.
Witam Mam następujący kod: [syntax=c] int main() { DDRD = 0xff; PORTD = 0x00; DDRB = 0x00; PORTB = 0xff; while(1) { if(!(PINB & 0x02)) { PORTD <<= 1; PORTD |= 1; _delay_ms(100); } if(!(PINB & 0x04)) { PORTD >>= 1; _delay_ms(100); } } } [/syntax] Oczywiście na początku są includy do io.h i delay.h - mam podlaczone diody pod port D...
Nie, ale komunikacja jest bardzo prosta. https://obrazki.elektroda.pl/7419975100_... To samo z SM2185: https://obrazki.elektroda.pl/2023822600_... Porównaj obrazki, wygląda na to, że się zgadza. (at)lesnyziutek może jest jakieś ewidentne niedopatrzenie lub popełniony błąd, np. czy podczas testów masz uruchomiony sterownik...
To przesunięcie bitowe nie działa jak powinno ... Tz wychodzi jak by przechodziło tylko od T11 do T15 i w T15 się zatrzymuję... Jak to zrobić w pętli ? Tz T1,T2,T3,T4,T5,T1,T2 ...itd ?
Kłopot w tym, że ja wcale nie rozumiem tego fragmentu kodu: [syntax=c] if ((przechowuje = ((przechowuje << 1) & 0x0F) | ostatnia) == 1) { keypin_pressed = 1; } [/syntax] operator "&" - bitowa koniunkcja (AND), << przesunięcie bitowe. Wartość zapisana w przechowuje musi być możliwa do zapisania w formie zero jedynkowej, aby można...
Witam. Mam pewien problem. Mam wykonać (na papierze - prowizorycznie) przesunięcia cyklicznego w prawo i w lewo (jak dotąd rozumiem, umiem) z uwzględnieniem bitu C. No i tu zaczynają się schody. Wymęczyłam wujka google i nic nigdzie nie znalazłam.. :( Zadanie to mam wykonać na kartce, dla 8 bitowego kodu binarnego. I przesuwać kolejno o 1, 2, 4, 5 bitów....
Może mało eleganckie rozwiązanie, ale: 1. Skopiować zmienną Kontrola_produktu do zmiennej tymczasowej. 2. Użyć rozkazu przesunięcia bitowego w prawo na zmiennej tymczasowej. Przesunięcie o N bitów, gdzie N to zmienna Miejsce_kontroli. Wynik zapisać do zmiennej tymczasowej 3. Użyć rozkazu iloczynu bitowego z 2 zmiennych: zmiennej tymczasowej i liczby...
Przesunięcie bitowe jedynki w lewo o PD1 miejsc. A PD1 = 1 czyli : 0 0 0 0 0 0 0 1 << 1 = 0 0 0 0 0 0 1 0
Ale mi zależy na bardzo uśrednionym wyniku. Mierzę temperaturę średnią w odcinku 5 minut. Nie zależy mi na szybko zmiennych odczytach. Od siebie tylko dodam, że w tej Xmedze ADC posiada funkcję uśredniania wyników. Wystarczy wybrać liczbę pomiarów i przesunięcie bitowe wyniku.
uwaga techniczna - przy dzieleniu przez potęgę dwójki, lepiej jest robić przesunięcia bitowe, gdyż zajmują wiele wiele mniej operacji. http://www.atmel.com/dyn/resources/prod_... tutaj możesz zobaczyć na pierwszej stronie ile co zajmuje operacji. Przesunięcie bitowe to jedna instrukcja... :)
mozesz mi tylko wytlumaczyc jak dziala ta petla while a raczej to w niej bo jakos nie moge tego rozszyfrowac :] Moze w ten sposob bedzie bardziej czytelne: while(rozmiar >= (1 << i)){++i;} (1 << i) to po prostu przesuniecie bitowe (przesuniecie "1" o i bitow w prawo). Aby wiedziec, ile bitow wystarczy do zapisania...
Prawie tak, jak myślisz, z tym że nie masz co zamienić liczby na binarną, bo już taką masz w komputerze. ;) Wyznacz resztę z dzielenia przez 2, dodaj ją do sumy, wykonaj przesunięcie bitowe w prawo o jeden. I tak 32 razy. Teraz zapisz to sobie w kodzie.
Nie wiem też po co to dzielenie przez 16 w kodzie, przecież wystarczy przesunąć zmienną o 4 bity w prawo, a kod zmaleje w oczach :) Jeśli chodzi o C to przesunięcie bitowe liczby ujemnej jest niezdefiniowane w standardzie. Albert
Tez mi sie wydaje dziwne ze nie mozna tak zrobic ale niestety tak jest.Zrozumielem dokladnie o co ci chodzilo jako ze kiedys sam lamalem sobie glowe nad asmem ale w razie jakby chciec to zrobic w ten sposob lepiej jest dac przesuniecie bitowe bo bedzie ono efektywniejsze.
Bitowe OR czyli ustawi najmłodszy bit na 1 czyli będzie nieparzyste np. 2 binarnie to 10 3 binarnie to 11 Dodano po 2 same parzyste liczby k=( (rand()%118) -9) &(~1); ~ oznacza negacje bitową.
Witam ponownie, Już praktycznie panuję nad tym programem, robię na nim różne eksperymenty "naukowe" :). Ale jednej rzeczy nie rozumiem i nie znalazłem nigdzie wytłumaczenia. Chodzi o ustawianie bitów przez przesunięcie bitowe w lewo. Tu fragment, który mnie niepokoi: [syntax=c]#define DHT11_INPUTPIN PC4 . . . . . DHT11_DDR |= (1<<DHT11_INPUTPIN);...
U mnie nie działa... Sam nie wiem, podobno można to w łatwy sposób rozwiązać sprzętowo. No nic, będę dalej próbował. Co rejestrów to jakoś tak się nauczyłem, a jak mam większą liczbę to z pomocą przychodzi mi kalkulator:) Chociaż pewnie przesunięcie bitowe jest łatwiejszą operacją. Dzięki z pomoc. Pzdr
No ale to już chyba taki szczegół...przesunięcie bitowe, a raczej rotacja bitów zamiast ustawiania sbi na "chama". To już jest taki zabieg kosmetyczny chyba, narazie wolałbym pogłówkować się nad przerwaniami, jak wdrożyć je w kod. Chyba, że czegoś nie zrozumiałem :) Ale i tak dzięki za podpowiedź, bo na pewno skróci to mój kod.
Sorki błąd PWM jest 8 bitowy czyli max OCR0 = 255 Czyli nie wiem czy ja w tej chwili dobrze kombinuje jeżeli nie to mnie popraw wypelnienie>>4 ma być zamiast 4 wpisane 2 jako przesunięcie bitowe w prawo
Tak na wszelki wypadek mozesz poczekac wiecej niz 250 ms (sugeruje poczekac 750 ms tyle co dla DS18S20).Moja uwaga co do samego programu: nie znam sie na bascomie ale nie ma tam przypadkiem czegos takiego jak przesuniecie bitowe >> i << ? Przeciez zarzynasz ten biedny procek dzieleniem i mnozeniem arytmetycznym !
Czy błędnie obliczona wartość wilgotności może mieć związek z tym, że w pewnym momencie przesunięcia bitowe prowadzone są na liczbie ujemnej -38 ? Jeśli przesunięcie bitowe byłoby robione w C/C++ to nie spodziewałby się problemów ale w Lua to ciężko stwierdzić. Chyba najprościej będzie Ci sprawdzi na piechotę na jakimś przykładzie np. zadeklaruj wartość...
Dzieki za pomoc udalo mi sie zrobic dzialaja przyciski, uP reaguje na nie, ale mam pytanie o ta instrukcje: if((PINB&(1<<PB0))==0) PINB oznacza pine portu B ale nie pisze jaka tylko ogolnie? &-wskaznik czyli w tym momencie jak dziala? 1<<PB0 -przesuniecie bitowe o 1 bit w lewo to wiem, ale dlaczego przesuwamy?Po co to przesuniecie?...
Cześć, mam przykładową tablicę znaków: [syntax=c] char tab[6] = {'1', '2', '3', '4', '5', '6'}; std::cout << tab[0] << std::endl; // wyswietla 1 [/syntax] czy można na takiej tablicy zastosować operacje przesunięcia bitowego? Jeśli tak, to w jaki sposób to zrobić? Chciałbym, żeby pierwszym elementem tablicy po zastosowaniu przesunięcia bitowego...
<<1 to przesunięcie bitowe w lewo, czyli pomnożenie przez 2. Używa się go w w/w przypadku, bo adres w pamięci programu dotyczy danych 16bit, a odczyt zawartości poprzez adresowanie rejestrem Z i instrukcją lpm jest 8bit. A zadałem takie pytanie, bo mozliwe, że w tym makro jest to już uwzględnione.
komunikat jest jasny - nie można przesuwać bitu o niecałkowitą liczbę. To tak jakby w sali było 37.4 osoby ;d (ADCH<<2*2.56) poczytaj o priorytetach operatorów w C. Mnożenie ma większy priorytet niż przesunięcie bitowe więc chcesz przesuwać o 5,12 bita w lewo
poziom:=cisnienie* 10.19716; (*wartosc rzeczywista - przeskalowanie ciśnienia na wysokosc slupa wody*) poziomCentymetry:=TRUNC(poziom*1... (*poziom w centymetrach+ odcięcie czesci po przecinku*) 1. czyli poziomCm = cisnienie * 1019.716, spodziewasz się wartości od 0 do 1000 cm, więc cisnienie < 1.0 bar 2. ciśnienia...
Witam, zaczynam zabawę z programowanie mikrokontrolerów.Wszystko mi ładnie działa, tylko nie rozumiem niektórych elementów kodu, który wklepuje. np. #define LED_PIN (1<<PC7) nie chodzi mi tutaj o samo użycie funkcji tylko o to jak za pomocą tego kodu definiowany jest pin PC7? Jaką daje wartość to przesunięcie bitowe? Nie wiem, skąd wziąć wartość...
Działanie suma = suma << 1 to mnożenie przez 2. Dzielenie realizuje się przesuwając w prawo a nie w lewo. Dodatkowo można w ten sposób dzielić tylko przez kolejne potęgi liczby 2, a ponieważ 10 nie jest potęgą 2, więc nie da się dzielić przez 10 poprzez przesunięcie bitowe. Porponuję zrobić dzielenie przez 8 lub przez 16 (przesunięcie o 3 lub...
Sekundę, ale gdzie jest ta potęga? Ja tu widzę ciąg 2 * 2 = 4; 4%10 = 4 4 * 2 = 8; 8%10 = 8 8 * 2 = 16; 16%10 = 6 6 * 2 = 12... A na marginesie, potęgowanie liczby 2 to nic innego jak przesunięcie bitowe o 1 w lewo, które jest 20 razy szybsze od mnożenia.
Mam pytanie, a jeżeli robimy to przesunięcie bitowe GPIOA->BSRR = 1 << 5; a potem GPIOA->BSRR = 1 << 21; czy to jest równoznaczne z wpisaniem: GPIOA->BSRR = 0x20; GPIOA->BSRR = 0x200000; 1<<5 == 10 0000b == 0x20 1<<20 == 1 0000 0000 0000 0000 0000b == 0x100000 1<<22 == 10 0000 0000 0000 0000 0000b == 0x200000
2. Uzyj funkcji map https://www.arduino.cc/en/Reference/Map aby przeskalować z wartości 10 bitowej do 8 bitowej przyń bitowo o 2 miejsca w prawo. Nie potrzebna jest do tego biblioteka. Tak masz rację, do takiej prostej konwersji wystarczy przesunięcie.
Zaczynasz wprowadzanie znaków od najstarszych pozycji, nie? Jeśli zaczniesz od 0, to będziesz miał (na starcie) liczba = 0 liczba = 0*2 + '0' - '0' // kody ascii objaśnił Łuk_F czyli liczba się nie zmieni, ciągle będzie wartość 0. Gdy trafisz na pierwszą jedynkę dostaniesz liczba = 0*2 + '1' - '0' czyli w liczbie pojawi się 1. Kolejna jedynka liczba...
PORTB=0xFF; czyli PORTB= 1111 1111 PINB = 0001 0000 Używając & przycisk PB4 powinien otrzymać wartość 1, czyli, że jest wciśnięty. Dobrze będę stosować przesunięcie bitowe. Niestety, ale kompiluje na razie w Programmer's Notepad, ale fusebity ustawiłem w twoim programie na 12 Mhz i taki oscylator mam wpięty do nóżek XTAL1 i XTAL2 (czyli 1 nóżka kwarcu...
... poprzez odpowiednie przesunięcie bitowe. Myślałem o tym ale tak się składa że potrzebuje 40 i 80mA. W ogóle to się zastanawiam czy nie postawić tego wszystkiego na PIC18f23k20- cena nawet będzie niższa, 16MIPSów ma, ale muszę zbadać empirycznie czy to się w C sensownie wyrobi w czasie (20 porównań z prędkością 25kHz, UART 250k i jakaś drobnica w...
Jak teraz patrzę to źle napisałem wartości w ADCH :) Ale mnie więcej o to mi chodziło. Tak czy siak, zależy od ustawienia ADLAR. Jeśli ADLAR ustawiasz na "0" to wynik masz przesunięty do prawej dwóch 8-bitowych rejestrów. A więc jeśli interesuje cię wynik 8 bitowy to nie możesz wziąć ADCH, bo będziesz miał tylko 2 MSB a co z resztą? Jeśli ustawisz ADLAR...
#define KHZ2MS(x) (1/(x))*1000 1<<KHZ2MS(27) liczy się jak 1<<(1/(27))*1000 czyli daje w wyniku 1. Ja sobiście nie wiem gdzie w tym przykładzie była by jakaś zachycka bo akurat przesunięcie bitowe jest w kolejności wykonywania za mnożeniem i dzieleniem
Ja zrobiłem bezsensownego ora tylko w przykładzie, funkcja CMSIS robi za to bezsensownego anda i o jedno bezsensowne przesunięcie bitowe więcej Biorąc pod uwagę fakt, że 99,666% przypadków użycia tej funkcji to stały parametr, myślę że optymalizator sobie z tymi przesunięciami poradzi. Teraz sprawa się nieco komplikuje, ale to nie problem. Komplikacja...
Da się zrobić tylko układ będzie trochę bardziej skomplikowany. Można odsunąć akcelerometry (żyro pomiędzy) od siebie i mierzyć przyspieszenia liniowe i odśrodkowe i na tej podstawie np. przy dodatkowym użyciu FK liczyć obrót. W segway masz kilka żyroskopów ustawionych pod różnym kątem do siebie. Temat jest bardzo ciekawy. Od rozwiązań prostych do bardzo...
ok, już wyjaśniam - operacje bitowe wykonują się dużo szybciej niż dzielenie, przykładzik: liczba AND 255 - zerujemy wszystkie bity oprócz ostatnich ośmiu które pozostają bez zmian. Jest to odpowiednik reszty z dzielenia przez 256. przesunięcie bitowe w prawo jest odpowiednikiem części całkowitej z dzielenia przez jakąś potęgę dwójki - przesunięcie...
Podaj typ procesora. I nie pisz takich potworków: "TCCR0|=0b01011001; //licznik T0 tryb pWM , prescaler " Bo to wymaga sięgania do dokumentacji danego procesora i studiowania co autor zrobił. Zastosuj makro _BV albo przesunięcie bitowe. Każdy bit w takich rejestrach ma swoją nazwę. Poza tym flaga w TIFR sama się wykasuje tylko wtedy gdy jest obsłużone...
1 << XXX ( gdzie XXX = np 5) ( 000000001 << XXX ) to jest to samo co 0000100000 Czyli zwykłe przesunięcie bitowe, w tym przypadku w lewą, a wszystkie pozostałe miejsca które "ciągną się za 1 są zerami. no wlasnie tak myslalem... ale nie ropzumiem w takim razie co ma robic instrukcja np... DDRB |= 1<<PORTB2; jak ona zadziala??
Operatory postaci: zmiennaA += zmiennaB; zmiennaA |= zmiennaB; zmiennaA &= zmiennaB; //itp... są równoważne zapisowi: zmiennaA = zmiennaA + zmiennaB; zmiennaA = zmiennaA | zmiennaB; zmiennaA = zmiennaA & zmiennaB;//itp... Co do samych operatorów: "|" to bitowe OR "&" to bitowe AND "~" to bitowa negacja. Zapis (1 << 3) to przesunięcie...
przesunąć bitowy atmega8 operacja bitowy przesunąć przesunąć bitowy reszta
mediabox cisco lutować rurka miedzianych łożysko ślizgowy zelmer
odkurzacz electrolux wyłącza odkurzacz electrolux wyłącza
Fiat Panda II 1.1 2004 – pod który bezpiecznik podłączyć kamerę samochodową zasilaną po zapłonie? Audi A6 C6 2.4 BDW – zaśniedziałe kable a kontrolka EPC, typowe usterki wiązki