ATNEL tech-forum
https://forum.atnel.pl/

Programowy I2C - pytanie do przykładu z BB
https://forum.atnel.pl/topic20976.html
Strona 1 z 1

Autor:  Scynk [ 10 lip 2018, o 19:43 ]
Tytuł:  Programowy I2C - pytanie do przykładu z BB

Witajcie!
Przerabiam sobię po kolei niebieską książeczkę i dzisiaj po raz pierwszy przyszło mi na obsługę I2C - RTC + EEPROM (rozdział 4.10). Ze sprzętowym nie było większych problemów, bo tam wszystko działało „od razu”. A z programowym męczyłem się dosyć długo, ale koniec końców zadziałało. Nie wiem tylko dlaczego...
A to wszystko przez to, że na bazie kodów z książki/płyty potem zawsze jakoś staram się wymyślić coś swojego i je poprzerabiać trochę. I tu pojawił się tzw. zonk :) Funkcja i2cPutbyte na końcu zwraca 0 lub 1 w zależności od flagi ACK. Jednocześnie nigdzie w kodzie nie mogę znaleźć miejsca gdzie jakakolwiek inna funkcja korzystałaby z tego. Wszystkie wywołania tej funkcji są w stylu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Żadnych przypisań, warunków, czy innych. Tylko, że jak to skasuję i zmienię na void i2cPutbyte to oczywiście przestaje działać :D Więc standardowe pytanie: co tu jest nie tak? Przy okazji analogiczna funkcja TWI_write również zwraca void.

I jeszcze mała poboczna sprawa: Na zestawie ATB 1.05a jest kondensator 0,22F do podtrzymania RTC. Ponoć to może starczyć nawet na kilka dni, a po około godzinie bez zasilania zegarek był wyzerowany. Trzeba mu wysłać jakąś specjalną komendę żeby „poszedł spać”, czy przyczyna leży gdzieś indziej?
Pozdrawiam wszystkich ;)

Autor:  mirekk36 [ 10 lip 2018, o 21:59 ]
Tytuł:  Re: Programowy I2C - pytanie do przykładu z BB

Scynk napisał(a):
Żadnych przypisań, warunków, czy innych. Tylko, że jak to skasuję i zmienię na void i2cPutbyte to oczywiście przestaje działać Więc standardowe pytanie: co tu jest nie tak? Przy okazji analogiczna funkcja TWI_write również zwraca void.


Wybacz, że tak troszkę żartobliwie odpowiem ;)

ale to tak jakby młody lekarz na I-szym roku studiów uczył się na zasadzie obserwacji a nie anatomii człowieka, no i po chwili pobieżnej obserwacji stwierdziłby, gdy rozkroję pacjenta to w środku są dwie nerki, gdy wytnę jedną z nich, to pacjent jeszcze działa, a gdy wytnę dwie to przestaje działać. Dodam że raz rozkroiłem pacjenta który analogicznie miał tylko jedną nerkę i wciąż działał ;)

dobra koniec żartów ;) ... Panie kochany to, że jakaś funkcja zwraca jakiś wynik to nie oznacza, że ZAWSZE i w każdym wypadku w kodzie trzeba z niego korzystać. Słyszałeś gdzieś o takiej zasadzie hmmm WYMOGU ? bo ja nie ...

W przypadku putbyte czasem choć rzeczywiście rzadko do typowego wysyłania danych może się przydać informacja o tym czy układ do którego coś wysyłasz w ogóle zareagował (odpowiedział ) - żeby mieć pewność, że w ogóle wysłałeś dane. Toż na tej podstawie można w ogóle sprawdzić czy docelowy układ w ogóle odpowiada - nie przyszło ci to na myśl ?

To że przy sprzętowym TWI tego nie pokazałem nie oznacza, że nie można odczytać statusu - tyle że tam odczytu dokonuje się z jednego z rejestrów modułu TWI ... Statusów zwrotnych informacji przy sprzętowym TWI masz (można byłoby powiedzieć "bez liku") wystarczy zajrzeć do PDF'a i poczytać w tabelce w rozdziale o TWI ... Czy jest sens WSZYSTKO to opowiadać i opisywać w książce dla początkującego, który chce zrozumieć w jak najszybszy sposób jak coś wysłać przez TWI i nie przebijać się przez dziesiątki stron PDF'a albo książki ? No właśnie podstawowe informacje masz w Bluebooku - udało ci się odpalić - więc jeśli to masz za sobą - to zawsze mi się wydaje, że dalej już czytelnikowi będzie dużo łatwiej dochodzić tego co dalej robić, jak przechodzić w coraz bardziej zaawansowane metody obsługi I2C/TWI. Przecież w Bluebooku nie opisałem np jak odbierać czy wysyłać dane I2C/TWI za pomocą przerwań tak jak to miało miejsce w przypadku RS232(UART) - i czy to oznacza wg ciebie, że nie da się na przerwaniach tego zrobić ? W książce nie opisałem jeszcze wielu rzeczy o i2C/TWI jak np komunikacji z punktu widzenia układu SLAVE - i co ? myślisz że się nie da bo nie opisałem ? ;) I samym I2C/TWI jeśli chodzi o wszystkie możliwości a szczególnie przykłady np komunikacji MULTI MASTER - to można by spokojnie całą książkę napisać ;) Tylko, że jakbyś do niej zajrzał to by cię jako całkowicie początkującego pewnie odrzuciło - bo nie wiedziałbyś w co ręce włożyć, żeby kurczę na jej podstawie zrobić TAK PROSTĄ rzecz jak przesłanie czy odebranie kilku bajtów po I2C/TWI. Temat jest bardzo rozległy - mówię ci ;) a tak w rzeczywistości w 99% przypadków aplikacji z użyciem I2C/TWI i tak każdy korzysta właśnie z trybu master i w taki mega uproszczony sposób - żeby np "pogadać" sobie z układami peryferyjnymi jak RTC, EEPROM czy jakieś inne układy np zewnętrzne ADC itp

No i kolejna sprawa - bierzesz sobie programową implementację I2C i próbujesz "wyciąć z kodu tę nieszczęsną nerkę" ;) czyli zwracanie tego rezultatu z ACK - pisząc, że po wycięciu ci nie działa - i nie zadajesz sobie nawet minimum trudu aby analizując ten kod na podstawie opisu w książce chociażby - próbować dojść dlaczego tak się dzieje? Od samego wycięcia ? .... toż gdy ty piszesz że wycinasz samo zwracanie ACK - prawdopodobnie przy okazji nerki usuwasz jeszcze niechcący pacjentowi dodatkowo płuco i połowę jelit ;) i dziwisz się że umiera ? ;) ... a przekładając to na język C - to pewnie usuwasz część istotnych opóźnień dla programowej obsługi I2C które są typ płucem i połową jelit ;) a może i coś więcej - ale to tylko można się domyślać na podstawie tak lakonicznego opisu operacji nad pacjentem ;)

----------------------------------

odnośnie ATB 1.05a i kondensatora żelowego - to może nie wystarczy aż na kilka dni - bo kilka to dość szerokie pojęcie no ale tą dobę do powinien wytrzymać ;) co najmniej ... Na pewno nie godzinę albo dwie czy trzy.

Kwestia tylko czy testujesz to dobrym kodem czy tym z wycinankami ? ;) Spróbuj kodem z Bluebooka z lekcji o TWI gdzie jest odczyt zegarka i daj znać. Jeśli nadal będzie po godzinie się zerował to może coś być nie tak albo z kondkiem albo nie wiem - ale wtedy możesz oczywiście podesłać do nas zestaw do sprawdzenia i ew naprawy ... Tylko wtedy pisz już na maila do mnie.

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

przy okazji polecam ci dwa webinary 4-ty i 6-ty ;)

https://mirekk36.blogspot.com/2018/07/a ... .html#more

z tej tematyki

Autor:  Scynk [ 11 lip 2018, o 11:45 ]
Tytuł:  Re: Programowy I2C - pytanie do przykładu z BB

mirekk36 napisał(a):
Panie kochany to, że jakaś funkcja zwraca jakiś wynik to nie oznacza, że ZAWSZE i w każdym wypadku w kodzie trzeba z niego korzystać. Słyszałeś gdzieś o takiej zasadzie hmmm WYMOGU ? bo ja nie ...

No wiadomo, że nie trzeba. Tylko jak nic nie korzysta to "młody chirurg" uznał to za zbędne i wyciął. Nie sprawdzałem, ale wydaje mi się, że inaczej to już kompilator powinien się zbuntować, prawda?
mirekk36 napisał(a):
Czy jest sens WSZYSTKO to opowiadać i opisywać w książce dla początkującego, który chce zrozumieć w jak najszybszy sposób jak coś wysłać przez TWI

Oczywiście, że nie - myślałem raczej w drugą stronę - "Skoro na sprzętowym TWI nie ma, to może tutaj też nie musi być" ;)
mirekk36 napisał(a):
a przekładając to na język C - to pewnie usuwasz część istotnych opóźnień dla programowej obsługi I2C które są typ płucem i połową jelit ;)

Zrobiłem jeszcze raz od początku: Kod żywcem skopiowany z płyty - oczywiście działa. Jedyna zmiana jaką zrobiłem to u08 i2cPutbyte na void i2cPutbyte i wyciąłem jedną linijkę return (b==0). Efekt: nie działa. Ale wystarczy że w miejsce tego returna dam HDEL; i wszystko nagle ożywa ;) Po prostu w życiu bym się nie spodziewał, że taki zwykły return może mieć aż takie znaczenie na czas! A skoro jego głównym działaniem jest zwrot rezultatu z funkcji (który mi nie był tutaj do niczego potrzebny) to najzwyczajniej w świecie z tamtąd wyleciał :D

Także dzięki za odpowiedź :) A to wszystko przez to, że zacząłem mieszać w kodzie, gdy wpadłem na pomysł, żeby połączyć te dwie biblioteki w jedną i przełącznikiem w stylu #define USE_TWI 1, warunkowo kompilować obsługę I2C na soft/TWI ;)

------------
A co do ATB - w książce była mowa o kilku dniach na 1F, więc na 0,22F powinien około dzień wytrzymać. Sprawdzę to jeszcze i dam znać.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/