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



Teraz jest 30 sty 2025, o 13:59


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 1 ] 
Autor Wiadomość
PostNapisane: 29 sty 2014, o 22:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 sty 2013
Posty: 169
Lokalizacja: Silesia - P-ce
Pomógł: 10

Witam.

Krótki wstęp dlaczego wykonałem komunikację między uC wykorzystując magistralę TWI.

Na potrzeby swojej pracy dyplomowej potrzebowałem wykonać komunikację między mikrokontrolerami AVR po TWI (UART już miałem zajęty do komunikacji z komputerem). Jeden uC odpowiedzialny był za obsługę RFM12B oraz komunikację z komputerem. Natomiast drugi stanowił interfejs użytkownika z klawiaturą oraz wyświetlaczem LED.
Dlaczego użyłem pojęć "JEDEN" oraz "DRUGI" zamiast MASTER i SLAVE - ponieważ podczas pracy programu zmieniałem konfigurację danego uC w zależności od potrzeby.
Pracę dyplomową obroniłem już jakiś czas temu, ale dopiero teraz udało mi się znaleźć trochę czasu, żeby poprawić biblioteki. Udostępniam je z tego względu, gdyż w sieci nie znalazłem w naszym języku prostych bibliotek - na czas kiedy pisałem pracę dyplomową, w chwili obecnej mogło się to zmienić.

Pisząc biblioteki wzorowałem się w pewnym stopniu na bibliotekach zawartych na stronie http://www.ermicro.com/blog/?p=1239, oraz książkach Mirka (za które bardzo dziękuję).

Na początku umieszczę pliki biblioteki, a następnie krótko opiszę najważniejsze fragmenty kodu. Całość jest do pobrania w załączniku wraz z przykładowym programem do testowania.

ds_twi.c

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



ds_twi.h

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


Bibliotekę starałem wykonać się tak, aby była ona uniwersalna. Dlatego też, ramkę danych wykonałem na podstawie not katalogowych urządzeń komunikujących się za pomocą I2C.

Ramka danych ma następujący format:
- dla zapisu w urządzeniu Slave

Obrazek

- dla odczytu z urządzenia Slave

Obrazek

Podczas odczytu danych z urządzenia SLAVE, nie jest konieczne wysyłanie do SLAVE rejestru. Można od razu rozpocząć odbiór danych.
W przypadku wysłania rejestru, należy ustawić czas opóźnienia T wysłania ponownego startu. Czas T powinien być na tyle długi, aby program zdążył przygotować dane.



Konfiguracja.

Konfiguracji dokonujemy w pliku ds_twi.h do komentarza "nie zmieniać".

Adres jaki nasze urządzenie SLAVE będzie posiadało. Ja wykorzystywałem litery jako adres z tą uwagą, aby najmłodszy bit miał wartość 0. Na najmłodszym bicie przesyłana jest informacja czy następuje odczyt czy zapis do SLAVE.
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Podczas odczytu z urządzenia SLAVE może występować opóźnienie w celu przygotowania danych do odesłania (np. w celu wykonania pomiarów, bądź odczytu danych z innych urządzeń) - czas podawany jest w ms.
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Układ może również reagować na ogólne wywołanie za pomocą adresu 0x00 (General Call)
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Dane odbierane przez układ Master mogą mieć różną długość - w takim przypadku w pierwszych 2 bajtach przesyłana jest liczba w kodzie ASCII informująca o ilości danych. Gdy ilość danych jest stała, TWI_SLAVE_SEND_LENGTH należy ustawić na 0, w przeciwnym razie 1.
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcje, dla użytkownika:

Inicjalizacja TWI. Gdy układ ma pracować jako MASTER, argument przesyłany do funkcji powinien mieć wartość 0. Natomiast gdy urządzenie ma pracować jako SLAVE, argumentem jest adres tego urządzenia.
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcje do wykorzystania w przypadku, gdy ramka danych zdefiniowana w następnych funkcjach nie pokrywa się z ramką danych obsługiwanego urządzenia.
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wysyłanie danych z MASTER do SLAVE. Pod wskazany adres (address) urządzenia wysyłany jest ciąg znaków (send_data) do podanego rejestru (registry).
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Odczyt danych z SLAVE przez MASTER. Z podanego adresu urządzenia (address), oraz rejestru (registry) odczytywana jest odpowiednia ilość danych (nr_data) i zapisywana do bufora read_data. W przypadku gdy ilość odczytywanych danych jest zmienna argument nr_data musi mieć wartość 0.
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcje umożliwiające odczytanie statusu magistrali TWI oraz obsługi TWI dla SLAVE
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Obsługa zdarzeń TWI, oraz rejestracja odpowiednich funkcji do obsługi tego zdarzenia.
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dane które mają zostać przygotowane do wysyłania są przesyłane jako argument funkcji:
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Odebrany rejestr przechowywany jest w pierwszych komórkach bufora odbioru. Przygotowanie danych do wysłania można wykonać po odebraniu rejestru w zdarzeniu do obsługi TWI, bądź gdziekolwiek w programie gdy jest taka potrzeba.

Przykładowe zastosowanie zdarzenia TWI dla układu SLAVE:

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


Poszczególne fragmenty kodu opatrzone są komentarzami.
W przypadku jakichkolwiek pytań, należy pytać!

Jeżeli w jakimś miejscu pojawiły się jakieś błędy - też pisać. Każdy może się pomylić.

W przyszłości mam zamiar wykonać timeout w celu zabezpieczenia programu tam gdzie zostały zastosowane pętle while(), oraz wykonać szerszą obsługę magistrali TWI w układzie SLAVE (np. w przypadku nie odebrania danych, bądź powtórne wysłania danych).

Proszę o wyrozumiałość;)

P.S.

Przykład zastosowania obejmuje dwa mikrokontrolera pierwszy MASTER - ATmega 8 połączona z komputerem przez uart. Wysyłając wartość "1" przez terminal (19200 bps) wysyłane jest polecenie odbioru danych. Natomiast wpisanie dowolnego krótkiego tekstu (około 8 znaków) do terminala i wciśnięcie enter zapisuje dane w SLAVE. Układ taktowany wewnętrznym kwarcem 4MHz.
Układ Slave to Atmega32 taktowana zewnętrznym kwarcem 4MHz. Podłączony jest do niej wyświetlacz lcd 2 wierszowy. Odebrane dane z Master są wyświetlane na LCD.

Rezystory podciągające magistralę o wartości 4,7k znajdują się przy Master.

Jeżeli ktoś mógłby przetestować działanie tych bibliotek na innych AVR byłbym wdzięczny.

P.S. 2

Jeżeli znajdę trochę więcej czasu to postaram się dokładniej opisać sposób komunikacji oraz działania tych bibliotek i umieścić w jakimś pdf - w bliżej nieokreślonym czasie.

Pozdrawiam


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.

_________________
Niewiele trzeba by być szczęślwym.Wystarczy chcieć



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO