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



Teraz jest 26 kwi 2024, o 05:56


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 3 sie 2017, o 18:18 
Offline
Użytkownik

Dołączył(a): 03 sie 2017
Posty: 94
Pomógł: 0

Witam,
niedawno skończyłem czytać rozdział o programowej implementacji I2C(bluebook). Jest jedna część kodu której nie mogę zrozumieć, mianowicie:

// i2c opóźnienie ćwierć bitu
#define QDEL _delay_loop_1(1)
// i2c opóźnienie pół bitu
#define HDEL _delay_loop_1(2)

Oto moje pytania:
1. Jaki rozmiar ma ćwierć bit i pół bit, przy taktowaniu 8MHz?
2. Jak dział mechanizm funkcji _delay_loop_1(), bo czytałem artykuł odnośnie tej funkcji, ale mało rozumiem( http://www.nongnu.org/avr-libc/user-man ... basic.html ). Według mnie funkcja działa w ten sposób:

_delay_loop_1(2) przy 8MHz --> (1/8000000)×3×2 = 7,5×10^-7 sekundy

3. Czy można by było zamiast takich opóźnień zastosować prostą funkcję _delay_ms(), a jeżeli nie to dlaczego?

Pozdrawiam :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2017, o 18:42 
Offline
Użytkownik

Dołączył(a): 29 mar 2012
Posty: 595
Lokalizacja: Jaworzno
Pomógł: 39

Koledze się chyba działy forum pomyliły :-)

_________________
Pozdrawiam
PP



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2017, o 18:53 
Offline
Użytkownik

Dołączył(a): 03 sie 2017
Posty: 94
Pomógł: 0

Przepraszam jestem dopiero od dzisiaj na forum.
Dzięki :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2017, o 19:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1022
Lokalizacja: Trójmiasto
Pomógł: 189

przecież masz odpowiedź w przetoczonym linku:
Cytuj:
void _delay_loop_1 ( uint8_t __count)

Delay loop using an 8-bit counter __count, so up to 256 iterations are possible. (The value 256 would have to be passed as 0.) The loop executes three CPU cycles per iteration, not including the overhead the compiler needs to setup the counter register.

Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds can be achieved.

Czyli do generowania opóźnienia tworzony jest licznik 8 bitowy który zlicza w dół od wartości przekazanej do funkcji. A każde tyknięcie licznika zajmuje 3 takty zegara uC. Aby przeliczyć opóźnienie musisz policzyć ile trwa jeden takt zegara uC przy danym taktowaniu i pomnożyć przez 3. Przykład masz w ostatniej linijce cytatu tyle że dla 1Mhz i przy maksymalnej wartości przekazanej do funkcji, słowem mówiąc maksymalne możliwe opóźnienie które można wygenerować tą funkcją na danym taktowaniu, a że możliwych jest 256 iteracji to minimalny czas opóźnienia możliwy do wygenerowania to 768/256=3us - oczywiście przy 1Mhz


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2017, o 19:54 
Offline
Użytkownik

Dołączył(a): 03 sie 2017
Posty: 94
Pomógł: 0

Bardzo dziękuję już rozumiem dokładnie o co chodzi z tą funkcją _delay_loop_1(). Pozostaje tylko jedno pytanie, dlaczego te 2 opóźnienia muszą tyle wynosić, czy jest to związane z czasem wykonania się funkcji I2C_START (bluebook)?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2017, o 20:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1022
Lokalizacja: Trójmiasto
Pomógł: 189

opóźnienia wynikają ze standardu I2C/TWI. Specyfikacja mówi wyraźnie 100khz dla starszych standardów, do 400khz dla nowszych.
Opóźnienia są właśnie po to by magistrala taktowana była wolniej tak by urządzenia nadążyły, bez opóźnień transfer danych poleciał by z max prędkością jaką procek w danej chwili dysponuje i urządzenia slave by nie nadążyły


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2017, o 20:06 
Offline
Użytkownik

Dołączył(a): 03 sie 2017
Posty: 94
Pomógł: 0

Dziękuję, w końcu po tygodniowej męczarni ktoś mnie uświadomił.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2017, o 21:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1022
Lokalizacja: Trójmiasto
Pomógł: 189

Proszę bardzo ;)



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

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