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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 9 lip 2025, o 15:24


    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

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