Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 20 sty 2025, o 15:37


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 11 kwi 2014, o 12:51 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 02 mar 2014
Posty: 12
Pomógł: 0

Witam,
czy mógłby mi ktoś wytłumaczyć działanie poniższego kodu w tytułowej funkcji bo nie rozumiem, kiedy ten if daje 1 a kiedy 0 bo moim zdaniem to powinno działać tak że gdy robimy iloczyn logiczny naszego bajtu z 0xF0 to wtedy gdy napotykamy jedynke to jest i2c_sdl_high a gdy zero jest i2c_sdl_low, a z tego jak tu sobie rozpisuje na kartce to sie nie pokrywa z tym jak wygląda ten bajt, a wiec pytanie brzmi kiedy ten if zwraca 1 a kiedy 0, bo według mnie zwraca 0 gdy tylko gdy cały bajt z iloczynu logicznego jest rowny zero a w kazdym innym przypadku jest 1, wyglada na to ze musze sie mylić, no wiec jak to działa?

Kod:
   do
   {
      if(byte & i) i2c_sda_high;
      else i2c_sda_low;
      i2c_scl_toggle;
   } while (i>>=1);


(edit) sdl tam powinno być oczywiście, w sumie to zadna roznica, ale zeby sie pokrywalo z tym co napisalem

------------------------ [ Dodano po: 18 minutach ]

Z tego co sobie tutaj rozpisałem to wynika że brany jest pod uwage po przesuwaniu bitowym w prawo tylko pierwsza jedynka od lewej z tego bajtu oznaczonego jak 'i' i porownana jest z tą samą pozycją w bajcie byte i na podstawie tego steruje sie ifem, to prawda?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2014, o 19:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Jakie mają wartości i do czego są używane zmienne "byte" oraz "i" przed pętlą "do ... while"

Po tym fragmencie kodu mogę tylko przypuszczać że chodzi
o maskowanie w celu użycia odpowiedniej funkcji do przesyłu
młodszej i starsze połówki bajtu , ale pewności nie mam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2014, o 21:52 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 02 mar 2014
Posty: 12
Pomógł: 0

To jest funkcja do wysyłania bajtu przez I2C, wstawiam całą.

Kod:
u08 i2cPutbyte(u08 b) {
   u08 i=0x80;

   do {
      if ( b & i ) I2C_SDL_HI;
      else I2C_SDL_LO;

      I2C_SCL_TOGGLE;
   } while ( i >>= 1 );      // wysyłanie bajtu

   I2C_SDL_HI;         // pozostawienie SDA w stanie wysokim

   DDR(SDAPORT) &= ~(1<<SDA);
   HDEL;
   I2C_SCL_HI;
   b = PIN(SDAPORT) & (1<<SDA);   // sprawdzenie bitu ACK

   HDEL;
   I2C_SCL_LO;
   DDR(SDAPORT) |= (1<<SDA);
   HDEL;
   return (b == 0);   //zwrócenie ACK jako rezultatu funkcji
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 kwi 2014, o 17:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

To jest funkcja do wysyłania przez I2C ale nie sprzętowo tylko programowo

Tak w if-ie jest maskowany bit danej do wysyłki i tak
w pierwszym przebiegu pętli "do...while" maska ma wartość 0x80 czyli binarnie 0b10000000
i porównywany jest "(b & i)" najstarszy bit danej "b"
i jeśli jeśli jest jeden (czyli prawda) to wysyła (ustawia pin uC w stan wysoki)
a jeśli zero to w stan niski (makro I2C_SDL_HI i I2C_SDL_LO)
następnie kiedy dojdzie do "while" jest przesunięcie w lewo o 1 i "i" ma wartość 0b01000000

W następnym przebiegu pętli już porównywany jest bit nr. 6 (bity od 7..0)
i tak aż nie wyjdzie jedynka z bajtu "i" czyli osiem przebiegów.

mam nadzieję że nic nie poplątałem i napisałem zrozumiale :)

------------------------ [ Dodano po: 1 minucie ]

A i jeszcze jedna uwaga wstawiaj kod w znacznikach [syntax=c]


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 kwi 2014, o 14:50 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 02 mar 2014
Posty: 12
Pomógł: 0

Dziękuje! Cały mój błąd polegał na tym, że myślałem ze 0x80 to 0b01111111;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 kwi 2014, o 16:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Zajrzyj sobie na blog Mirka do poradnika o liczbach

http://www.mirekk36.blogspot.com/2014/03/liczby-szesnastkowe-hexadecymalne.html

bardzo pomocny sposób na różnego rodzaju przeliczanie systemów liczbowych



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO