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



Teraz jest 5 gru 2024, o 00:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 4 sie 2015, o 16:57 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Dzień Dobry

Chciałem poprosić o wyjaśnienie pewnego fragmentu kodu z niebieskiej książki a mianowicie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



A dokładniej
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Chodzi mi generalnie o tą pętlę a mianowicie o to co ona dokładnie robi ale także o ten dość ciekawy zapis:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Jeżeli mógłby ktoś mi to gruntowniej objaśnić to będę wdzięczny, ponieważ nie wszystko jest dla mnie jasne do końca...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2015, o 17:23 
Offline
Moderator
Avatar użytkownika

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

moscow18-1990 napisał(a):
Chodzi mi generalnie o tą pętlę a mianowicie o to co ona dokładnie robi ale także o ten dość ciekawy zapis:

Panie kochany wyjaśnienie to masz księdze tajemnic Hogwartu czyli Bluebooku - to się nazywa wyrażenie warunkowe

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w języku C :lol:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


teraz zajrzyj do przepisu w księdze i wszystko stanie się jasne ;)


Autor postu otrzymał pochwałę

_________________
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  
PostNapisane: 4 sie 2015, o 18:07 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Aaaaaahaa czyli to jest po prostu coś takiego

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


co daje po prostu zwykłą instrukcję warunkową

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Już drugi raz spotkałem się z takim zapisem i nie miałem zielonego pojęcia o co chodzi.... czyli tutaj w wyniku postdekrementacji warunek w pętli jest spełniony i tak samo w tym wyrażeniu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


warunek jest spełniony do momentu wyzerowania zmiennej "len"?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2015, o 18:27 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
warunek jest spełniony do momentu wyzerowania zmiennej "len"?

Dokładnie ;)

_________________
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  
PostNapisane: 5 sie 2015, o 19:02 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

To może zadam jeszcze pytanko odnośnie jednej funkcji a mianowicie:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Chciałem zapytać z czego ona wynika i czy jest jakieś miejsce w datasheet gdzie jest coś napisane na temat tego jak zaimplementować taką funkcję. Pytam, ponieważ dość wnikliwie analizuję kody zawarte w niebieskiej książce i zacząłem nanosić komentarze w datasheet dlatego jakaś wskazówka byłaby cenna...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2015, o 19:18 
Offline
Użytkownik

Dołączył(a): 20 mar 2012
Posty: 159
Pomógł: 6

Wszystko masz ładnie opisane w dataschecie w sekcji Two-wire Serial (Amtega32 str 175 na samym dole jest wzór)
Interface

SCL frequency =CPU Clock frequency/(16+ 2(TWBR) 4^TWPS)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2015, o 22:54 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

No sprawdziłem ten wzór i to co jest tam napisane i sprawdziłem też inny wątek http://forum.atnel.pl/topic1669.html
i jest takie założenie że TWPS = 0 a TWBR jest wyliczany z tych wzorów tylko to działa dla F_CPU 16MHz a jak sprawdzam u siebie jaka jest wartość F_CPU to wynosi ona tyle ile wynosi częstotliwość rezonatora kwarcowego czyli 11059200Hz i nie bardzo rozumiem jak działa ta funkcja i jak jest wyliczana wartość 100khz dla wartości innej niż te 16MHz. Mógłby ktoś pomóc w ostatecznym zrozumieniu tej funkcji i tego jak ustawia się tą częstotliwość...? Muszę to pojąć...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2015, o 23:17 
Offline
Moderator
Avatar użytkownika

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

coś słabo zaglądałeś - jeszcze raz na ten post zobacz

post21755.html#p21755

i zamiast 16 MHz podstaw sobie 11,0592 MHz i przelicz w dwie strony

_________________
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  
PostNapisane: 7 sie 2015, o 10:48 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

A no działa... Czyli ta funkcja można powiedzieć jest uniwersalna bo wylicza ona za każdym razem odpowiednią wartość która zostanie wpisana do rejestru TWBR?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2015, o 15:04 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Dalej nurtuje mnie ta linijka kodu.Chciałbym poprosić o wyjaśnienie tej linii kodu bo ze względu na pojawienie się wskaźnika nie do końca ją rozumiem:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Sprawdzałem jak ta transmisja przebiega wczoraj na analizatorze i wiem jak to wygląda ale chodzi o to jaką rolę tutaj wskaźnik odgrywa. Uczę się cały czas tych wskaźników jest to dość ciężki temat dla mnie dlatego zwracam się z prośbą o wyjaśnienie.
Wiem tylko tyle że pętla działa do momentu wyzerowania zmiennej len i wiem także że funkcja która jest wywołana w ten sposób:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


powoduje że mam pewne spostrzeżenia, chciałbym zapytać o ich słuszność:

1. argument len ma wartość 4 czyli tyle ile danych w buforze

2. zapis *buf++ wskazuje najpierw na pierwszy element tablicy bufor i przy kolejnych postdekrementacjach zmiennej len, postinkrementacji podlega wskaźnik i wskazuje na kolejny element tablicy? Po prostu jest tak że zmniejszam len, zwiększam indeks tablicy poprzez wskaźnik?

3. Zastanawia mnie jeszcze to co z zerowym elementem tego bufora się dzieje... Na analizatorze było widać przekazanie sekund,minut,godzin czyli tak jakby trzech elementów tablicy. Widzę że tam są setne części sekundy a tak w ogóle to w dokumentacji tego układu scalonego jest napisane odnośnie tej komórki pamięci że jest tam jakiś CONTROL/STATUS 2... też to mnie nurtuje... nie mógłbym zacząć od adresu 0x02 i zmniejszyć bufor do 3 elementów?

4. I na razie ostatnia sprawa też związana z tymi adresami w układzie scalonym a mianowicie pod 0x02 są 0x03 są minuty a pod 0x04 są godziny i zastanawia mnie jak ten adres się zmienia w tym programie, ponieważ w wywołaniu funkcji jest 0x01 i nie jest dla mnie do końca zrozumiałe to w jaki sposób odnoszę do kolejnych adresów.

Jeżeli ktoś mógłby mi wyjaśnić co nieco będę wdzięczny, ponieważ jestem bliski zrozumienia w pełni tego programu jak i samej transmisji I2C....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2015, o 15:38 
Offline
Moderator
Avatar użytkownika

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

1. no dobrze
2. zgadza się więc z czym masz problem ? ;)

3.
moscow18-1990 napisał(a):
nie mógłbym zacząć od adresu 0x02 i zmniejszyć bufor do 3 elementów?

Panie a kto ci zabroni ? możesz od czego chcesz ... ja podałem akurat taki przykład bo setne sekund mnie nie interesowały skoro odczytuję dane z zegarka co sekundę

a czytanie rejestru kontrolnego ? co za problem ?

uint8_t ctrl_reg;
TWI_read_buf( PCF8583_ADDR, 0x01, 1, &ctrl_reg );

i masz odczytany ten rejestr ;)

4. poczytaj dokumentację RTC - bo tam pisze wyraźnie, że podajesz adres pierwszej komórki która cię interesuje do odczytu a jak ją odczytasz to RTC sam sobie w środku zrobi inkrementację adresu na kolejną komórkę, więc wystarczy już tylko czytać z układu a on ciurkiem poda. Taka metoda jest stosowana w wielu układach I2C to nic dziwnego ;)


Autor postu otrzymał pochwałę

_________________
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  
PostNapisane: 10 sie 2015, o 16:18 
Offline
Użytkownik

Dołączył(a): 25 lut 2015
Posty: 252
Lokalizacja: Lublin
Pomógł: 23

W filmikach Mirka o dawcy czasu znajdziesz dużo informacji o konfiguracji PCF8583 i komunikacji z tym układem.

http://mirekk36.blogspot.com/2015/05/rt ... eczny.html

Nie musisz koniecznie oglądać wszystkiego od razu.
Już w pierwszej części jest sporo o PCF8583.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 sie 2015, o 11:03 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

To jeszcze pytanko odnośnie pamięci EEPROM, ponieważ znowu problemy są ze zrozumieniem pewnych niuansów a mianowicie:

1. Ta linijka kodu mnie nurtuje:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


a mianowiciet to "+1" , sizeof (tekst) odnosi się do zmiennej char i łańcucha:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
który docelowo jest zakończony znakiem NULL i w moim odczuciu sam sizeof(tekst) daję liczbę 6 i tworzy tablicę 6-ścio elementową ale po co to "+1" na końcu jeszcze do tego?


2. Nie rozumiem totalnie tego jak ta pamięć EEPROM 24C04 jest zorganizowana(patrzyłem do dokumentacji ale tam nie żadnego rysunku a nic w ten deseń) jest tylko napisane na stronie nr.9 jest napisane że układ 24C04A ma dwa bloki po 256 bajtów każdy. Przeczytałem w niebieskiej książce że jest też 9-bitowy adres który jest potrzebny do zaadresowania każdego bajtu z osobna co jest powiązane z kolejną linijką kodu której także nie rozumiem:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jest to dość skomplikowane mógłby mi ktoś wytłumaczyć tą linię tak trochę bardziej wnikliwie?

3.Chodzi o adres w pamięci:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


a mianowicie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


nie wiem jak to się dzieje że w wywołaniu funkcji podaję liczbę 64 jako subbAddr i odwołuję się tak jak jest to napisane w komentarzu do adresu 253.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 sie 2015, o 11:14 
Offline
Moderator
Avatar użytkownika

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

Panie w pamięciach EEPROM, gdy nie są zapisane - w każdej komórce jest wartość 0xFF a nie 0x00 - musisz to sobie zapamiętać ;)

Dlatego to +1 zrobiłem sobie tak sztucznie żeby się jeszcze znak NULL (zero) wkopiowało do EEPROM'a żeby później móc to odczytać metodą jak zwykły string ;) czyli szukając na końcu znaku NULL bo inaczej by się nie udało ... wciąż byłoby 0xFF, 0xFF ... ;)

_________________
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  
PostNapisane: 17 sie 2015, o 09:59 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

1.No ok... ale bez tego + 1 też normalnie się wyświetla napis na analizatorze sprawdziłem i NULL normalnie się zapisuje bez tego +1.


2.Chciałem jeszcze zapytać o tą linijkę kodu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Nie rozumiem tego zapisu i przez to nie rozumiem tego jak to działa. W dokumentacji przeczytałem że są rzeczywiście są dwa banki pamięci 000 - 0FF i 100 - 1FF i że za przełączanie odpowiada bit A0. Na analizatorze rzeczywiście widać widać że w momencie kiedy jestem w drugim banku pamięci bo podałem zamiast 64 np. 505 to adres slave się zmienia o 2, ponieważ A0 jest w stanie wysokim... no ale jak to się dzieje że ta linijka kodu to powoduje, jest to dość skomplikowany zapis byłbym wdzięczny za jakieś wyjaśnienie.

3. Czy ta tematyka związana z zewnętrzną pamięcią eeprom jest aż tak istotna? Może nie potrzebnie aż tak się w to zagłębiam? Z jednej strony chciałbym to dobrze pojąć a z drugiej nie wiem czy może przydać mi się to w praktyce? Atmega 32 posiada chyba wewnętrzną pamięć eeprom.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sie 2015, o 10:31 
Offline
Moderator
Avatar użytkownika

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

moscow18-1990 napisał(a):
Nie rozumiem tego zapisu i przez to nie rozumiem tego jak to działa.

Ja nie pamiętam szczegółów o co chodziło z adresowaniem akurat tych pamięci - ale pewnie, że warto to zrozumieć, bo stosując różne układy I2C będziesz się spotykał z różnymi sposobami zapisu do nich i odczytem. A jak nie zrozumiesz to później będziesz robił tak jak inni, że np ktoś wziął sobie obsługę I2C układu RTC PCF8583 z książki i wymyślił sam sobie że w ten sposób będzie rozmawiał później z przetwornikiem ADC podłączanym zewnętrznie przez I2C i nagle zdziwienie, że to mu nie działa. No nie działa - bo każdy układ I2C ma często własną specyfikę działania i jest ona opisana DOKŁADNIE ZAWSZE w nocie PDF. Nie mogłoby być inaczej

a tu z tego kodu widać co jest robione

TWI_write( jakiś_adres_urządzenia | ( (jakiś_adres_w_pamięci >> 8 ) << 1) );

ten jakiś_adres_w_pamięci przesuwamy w prawo o 8 bitów

a później przesuwamy go w lewo o jeden bit bo najmłodszy bit oznacza zapis lub odczyta

i dopiero teraz robimy operację OR z jakimś_adresem_urządzenia

więc tu poćwicz sobie ew działanie na operacjach bitowych i sam sobie raz rozrysuj na kartce co wyjdzie z wartości podanych na początku

_________________
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: 16 ] 

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