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



Teraz jest 2 gru 2024, o 14:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 27 lis 2012, o 17:25 
Offline
Użytkownik

Dołączył(a): 27 lis 2012
Posty: 291
Pomógł: 6

niniejsza funkcja wysyła szeregowo bajt np z MASTER do SLAVE

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
}


1. Zastanawiam się co zwraca ta funkcja. Niby bajt (u08), ale przecież wysyłanych jest 9 bitów (dane8 bitów + 1bit ACK). Poza tym przyzwyczajony jestem do tego, że funkcja zwraca wartość natychmiastowo. np x =234. czy można tak sobie uogólnić na liczbę 234 ale przesłaną szeregowo?

2. Co robi return (b == 0)? Przecież gdy b jest równe 0 to powinno zwrócić TRUE czyli dowolną liczbę różną od 0. Czy nie powstaje tu jakiś totolotek?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2012, o 20:37 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Funkcja nie zwraca tego co wysyła. Te 9 bitów nie ma nic do rzeczy, bo zwracana jest tylko ACK=true lub NACK=false - co jest odpowiedzią układu na przesłany bajt. Rezultat takiej funkcji należy testować w warunku np.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Nie ma też totolotka tylko true to 1, a false to 0.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2012, o 22:25 
Offline
Użytkownik

Dołączył(a): 27 lis 2012
Posty: 291
Pomógł: 6

Dzięki Krauser
Chyba wyprowadziłeś mnie na prostą. Właściwie powinienem postawić Ci piwo "Leżajsk"
Czy mógłbyś potwierdzić czy prawidłowo widzę co się dzieje na liniach SDA i CSL przy wywołaniu np. i2cPutbyte(0xff)?
Czyli powinny polecieć same jedynki.

W poniższym kawałku na linia SDA będzie cały czas +5V, a SCL wyśle 8 impulsów zegarowych
Kod:
  do {
      if ( b & i ) I2C_SDL_HI;
      else I2C_SDL_LO;
      I2C_SCL_TOGGLE;
   } while ( i >>= 1 ); 
// wysyłanie bajtu

A w tym kawałku MASTER sprawdzi czy SLAVE odebrał w/w 8 bitów (liczbę 0xff). Co ciekawe źródlem 9 bitu jest SLAVE a nie MASTER!

Kod:
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;


Tu natomiast funkcja "wie" czy SLAVE odebrał 8 bitów danych. Inna rzecz że program nie musi tej wiedzy wykorzystywać! Np funkcje I2C_write_buf_(...) i I2C_read_buf_(...) (str 286 i 287 "...C Podstawy Programowania" nie wykorzystują wiedzy na temat stanu ACK/NACK chociaż znają te stany.
Kod:
 return (b == 0);   //zwrócenie ACK jako rezultatu funkcji
.
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2012, o 22:46 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Nie wykorzystują ;) ale mogą - tzn ty możesz i dzięki temu będziesz w stanie lepiej zareagować na jakieś tam błędy magistrali jeśli się pojawią a ty zechcesz je przewidzieć i obsłużyć w swoim kodzie. Ja w książce opisałem najprostsze przypadki.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO