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
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.
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...
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...
nieprawda przesunięcie bitowe "zwróci" liczbę 16 bitową
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...
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...
przesunąć bitowy atmega8 operacja bitowy przesunąć przesunąć bitowy reszta
oporność głośnik vestel 17ips72 wyświetlacz sterownika pieca defro
płyta indukcyjna przestaje działać płyta indukcyjna przestaje działać
Luzy zaworowe Honda Forza 125: wartości i regulacja Zmiana głośności alarmu w piekarniku Amica: czy to możliwe?