logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

operacje bitowe, zamiana bitów miejscami

Joahim_Skywalker 18 Cze 2010 18:59 2658 6
REKLAMA
  • #1 8204006
    Joahim_Skywalker
    Poziom 12  
    Witam. Mam następujący problem.
    Po każdym naciśnięciu przycisku wartość licznika zwiększa się o 1 i jest ograniczona do 255. Ale mi jest potrzebny wynik, że jeśli kliknę trzy razy gdzie 3=0x00000011 to chcę mieć te dwa bity na samym początku czyli wynik=0x11000000. Bardzo proszę o pomoc oraz poradę.
    Łukasz.
  • REKLAMA
  • REKLAMA
  • #3 8204268
    Joahim_Skywalker
    Poziom 12  
    Piszę w C program do atmegi. Zliczam przerwaniami liczbę wciśnięć przycisku, a następnie wyświetlam zawartość licznika na diodach led, ale chcę aby ta kolejność była odwrotna. Poniżej zamieszczam kawałek kodu, którym realizuję zliczanie w zakresie od 0-255.

    if bit_is_clear(PIND,PD0)//w tym ifie odbywa sie regulacja napiecia wy przetwornika c/a
    
      {                         //licznik jest zwiekszany i ograniczony na 255 bo przetwornik jest 8 bitowy, a 2^8=256
      		
    		licznik++;
    		if (licznik>254) //jesli przekroczy 254
    		{
    			licznik=255;//to ustaw na 255
    		}
    			
    		}
    
    	
    	 else 
    	if bit_is_clear(PIND,PD1)//dekrementuj licznik, napiecie na c/a jest zmniejszane
    	{
    		licznik--;
    		if (licznik<1) //jesli przekroczy wartosc 0
    		{
    			licznik=0;//ustaw licznik na 0
    		}
  • REKLAMA
  • Pomocny post
    #4 8204797
    Dr.Vee
    VIP Zasłużony dla elektroda
    Może tutaj znajdziesz coś dla siebie :)
    http://graphics.stanford.edu/~seander/bithacks.html

    Poza tym Twój kod ma błędy. Licznik nie jest zatrzymywany na wartościach 0 i 255 - zastanów się dlaczego.

    Pozdrawiam,
    Dr.Vee
  • #5 8207022
    Joahim_Skywalker
    Poziom 12  
    Próbowałem przesunięć bitowych, ale to nie jest to co chciałem uzyskać, jeśli chodzi o błędy w kodzie to faktycznie jest błąd i długo siedziałem żeby właśnie ograniczyć licznik, ale nie mogłem tego opanować, zmieniłem jedynie zmienną z unsigned char na integer i uzyskałem pożądany efekt mimo nie rozwiązania problemu.
  • REKLAMA
  • Pomocny post
    #6 8207045
    sulfur
    Poziom 24  
    Wyszukiwarka: https://www.elektroda.pl/rtvforum/topic1675568.html#8112233

    Co do ograniczenia, jak masz w zmiennej 255, zmienna jest typu char, i zrobisz zmienna++ to efektem tego jest 0. Wtedy sprawdzasz warunek, i okazuje się, że się na niego nie łapiesz. Wygodniej w mojej ocenie byłoby zwiększać licznik tylko w przypadku, gdy jest mniejszy od maksymalnej wartości, a zatem
    if (licznik < 255) licznik++;
    Analogicznie dla zera
    if (licznik > 0) licznik--;
  • #7 8207061
    Joahim_Skywalker
    Poziom 12  
    No to wszystko już rozumiem. Dziękuję za zainteresowanie tematem, oraz zwięzłe i jasne wytłumaczenie mojego błędu.
REKLAMA