Pytanie-zagadka o TWI w Atmega8[bascom]

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Szukampomocy
-
Posty: 10
Rejestracja: 14 sie 2008, 12:28
Lokalizacja: Londyn

Pytanie-zagadka o TWI w Atmega8[bascom]

Post autor: Szukampomocy » 14 sie 2008, 12:37

Witam kolegów :)
Otóż napotkałam na problem- Buduję pewien systemik mikroprocesorowy oparty na ATMEDZE8 i potrzebuję bardzo szybko pobierać dane z pamięci at24c512. Otóż kiedy realizuje pobieranie danych przez I2c programowo (crbyte,cwbyte) nawet kiedy ic2delai jest ustawiony na 1 to nie mogę osiągnąć wymaganej prędkości odczytu. I tu jest moje pytanie. Wyczytałam, ze atmega8 ma wbudowany sprzętowy interfejs TWI. Czy za jego pomocą mogę szybciej odbierać te dane? Czy jest tam jakiś bufor? Jak w ogóle szybciej odbierać dane z I2c niż to i2cdelai=1 (z tego co wyczytałam w notce pamięci jej częstotliwośc taktowania powinna pozwolic na szybszy odczyt niz wynikajacy z najmniejszego opóźnienia i2cdelai=1).

Skrzydlaty
Użytkownik
Posty: 126
Rejestracja: 23 wrz 2007, 21:08
Lokalizacja: Krak

Re: Pytanie-zagadka o TWI w Atmega8[bascom]

Post autor: Skrzydlaty » 14 sie 2008, 16:33

Tak, sprzętowy TWI pozwala na szybszą prace - komunikacje ponieważ procek może w tym czasie wykonywać inne zadania zamiast "tracić" czas na czasochłonną transmisje, a także inne zadania (np. przerwania) nie przerywają transmisji (co przedłurza czas transmisji). Przynajmniej tak mi sie zdaje...w uproszczeniu... :mrgreen:
Szukampomocy pisze: ...nie mogę osiągnąć wymaganej prędkości odczytu.(...)
A jaka jest ta Twoja "wymagana" prędkość odczytu?

P.S. Koleżanka elektroniczka z zamiłowania czy trzeba zrobić projekt na studia? :mrgreen:

Szukampomocy
-
Posty: 10
Rejestracja: 14 sie 2008, 12:28
Lokalizacja: Londyn

Post autor: Szukampomocy » 14 sie 2008, 18:01

Właśnie o to mi chodzi- żeby procek nie musiał się ciągle tylko transmisją zajmować. Jak oprogramowac to w Bascom? A prędkość powinna być największa jaka jest tylko możliwa bez gubienia danych i przekłamań.
Elektronika to moje hobby- nie wiąze się z tym kierunek w jakim idzie moje wykształcenie, ani mojej pracy zawodowej.

Awatar użytkownika
grysek67
Użytkownik
Posty: 315
Rejestracja: 27 cze 2007, 6:34
Lokalizacja: Limanowa
Kontakt:

Post autor: grysek67 » 14 sie 2008, 18:22

Wszystko można znalezc w datasheet (strona 169 - 180)

Wystarczy wpisac odpowiednie bajty do odpowiedznich rejestrów i juz.. Tam jest opisane wszystko i chyba nawet przykłady są :wink:

Rejestr TWDR służy do odczytywania/ zapisywania danych
TWAR - do adresowania urządzenia
TWCR - rejestr kontrolny, tam ustawiasz przerwania i czy odebrany bajt jest ostatni itp
Ostatnio zmieniony 14 sie 2008, 18:28 przez grysek67, łącznie zmieniany 1 raz.

Szukampomocy
-
Posty: 10
Rejestracja: 14 sie 2008, 12:28
Lokalizacja: Londyn

Post autor: Szukampomocy » 14 sie 2008, 18:27

yyyyy... odpowiednie bajty do rejestrów? Pisałam do tej pory w bascomie i nie bardzo orientuje się o co chodzi. W datasheecie są przykłady do asemblera i c więc nic z tego nie wiem.... Byłabym wdzięczna za wytłumaczenie krok po kroku jesli ktoś miałby czasi chęć mi pomóc.

Awatar użytkownika
grysek67
Użytkownik
Posty: 315
Rejestracja: 27 cze 2007, 6:34
Lokalizacja: Limanowa
Kontakt:

Post autor: grysek67 » 14 sie 2008, 18:59

Do Bascoma mozesz dac wstawki asemblerowe :smile:
A tam są gotowe przykłady i tam z boku pisze co do czego słuzy krok po kroku :wink:

Szukampomocy
-
Posty: 10
Rejestracja: 14 sie 2008, 12:28
Lokalizacja: Londyn

Post autor: Szukampomocy » 14 sie 2008, 19:07

Aż się boję, brzmi strasznie... Widzę te wstawki w tabeli na stronie 169, ale za nic nie mam pomysłu jak to wykorzystać... Muszę przeprosić za swoją ignorancję- mówiąc prosto "nie wiem jak to ugryść" :/

Skrzydlaty
Użytkownik
Posty: 126
Rejestracja: 23 wrz 2007, 21:08
Lokalizacja: Krak

Post autor: Skrzydlaty » 14 sie 2008, 19:15

Rejestry można też przecież ustawiać w bascomie bez pomocy wstawek asemblerowskich...
Grysek67, w datasheets natknołem sie na linijke o tresci:

Kod: Zaznacz cały

Up to 400 kHz Data Transfer Speed
Czy to jest maksymalna prędkość TWI? jesli 400kHz to ile bitów (bajtów?) mozna przesłać na sec.?
btw. jesli to jest max prędkość i w tych samych jednostkach co dla at24c512 to wszystko wyjaśnia dlaczego prędkość nie jest taka jakbyś "wymagala" Grysek, specjalisto - ile ten sprzetowy TWI wyciagnie?
btw. 2. może operujcie wiecej na liczbach.

Awatar użytkownika
grysek67
Użytkownik
Posty: 315
Rejestracja: 27 cze 2007, 6:34
Lokalizacja: Limanowa
Kontakt:

Post autor: grysek67 » 14 sie 2008, 19:28

Skrzydlaty pisze:Rejestry można też przecież ustawiać w bascomie bez pomocy wstawek asemblerowskich...
Grysek67, w datasheets natknołem sie na linijke o tresci:

Kod: Zaznacz cały

Up to 400 kHz Data Transfer Speed
Czy to jest maksymalna prędkość TWI? jesli 400kHz to ile bitów (bajtów?) mozna przesłać na sec.?
btw. jesli to jest max prędkość i w tych samych jednostkach co dla at24c512 to wszystko wyjaśnia dlaczego prędkość nie jest taka jakbyś "wymagala" Grysek, specjalisto - ile ten sprzetowy TWI wyciagnie?
btw. 2. może operujcie wiecej na liczbach.
Niewiem ile wyciągnie.. ale 400khz to pewnie 400baud czyli bajtów 400 / 8..
Nigdy tego nie uzywałem i staram się pomóc tak jakbym ja to zrobił.. Nie ma innego dostępu to tego z BASCOMa oprócz rejestrów, nie ma takich polecen.. Więc zapewne trzeba ustawic odpowiednie bity w tych trzech rejestrach które podłem wyzej :???:

Szukampomocy
-
Posty: 10
Rejestracja: 14 sie 2008, 12:28
Lokalizacja: Londyn

Post autor: Szukampomocy » 14 sie 2008, 19:49

Mi chodzi o mozliwośc odczytu 10 tysięcy próbek na sekundę. 400/8=50 KHz więc i tak pięć razy szybciej niż potrzebowałabym.

Awatar użytkownika
Brzozza93
Użytkownik
Posty: 474
Rejestracja: 26 cze 2006, 17:35
Lokalizacja: Gdynia
Kontakt:

Post autor: Brzozza93 » 14 sie 2008, 19:54

grysek67 pisze:400khz to pewnie 400baud czyli bajtów 400 / 8..
Chyba kbaud, 400000/8 :P daje 50 000 bajtów/sek czyli 48,828125 KB/s

Skrzydlaty
Użytkownik
Posty: 126
Rejestracja: 23 wrz 2007, 21:08
Lokalizacja: Krak

Post autor: Skrzydlaty » 14 sie 2008, 22:40

No wiec tak:
datasheets ATMega8 (s.163):

Kod: Zaznacz cały

Up to 400 kHz Data Transfer Speed
datasheets AT24C512 (s.1):

Kod: Zaznacz cały

1 MHz (5V), 400 kHz (2.7V) and 100 kHz (1.8V) Compatibility
Jak napisał grysek w Bascomie można zmieniać zawartość rejestrów poprzez bezpośrednie wpisywanie bezpośrednio do nich zer i jedynek i to w zupełności powinno wystarczyć. Pozatym Bascom jest tak skonstruowany że to co wpisujemy w konfiguracji jest "przeliczane" do wartości preferowanych przez uC a dokładniej do tego co "przyjmą" rejestry. Jeśli te wartości zacytowane bezpośrednio z datashets są w tych samych jednostkach (kiepsko u mnie z angielskim) a zakładana prędkość jest i tak za mala to może przyczyny należy szukać gdzie indziej? Jeśli chodzi o wpisywanie do rejestrów to polski plik pomocy do Bascoma (c by Zbigniew Gibek) powinien wystarczyć, a jeśli nie to metoda kilku prób i błędów. Jeśli to nie pomoże to może przyczyny należy szukać zupełnie gdzie indziej? Np. nowy procek, niby w układzie z kwarcem 16MHz, w bascomie taka prędkość zdefiniowana ale fusebitow nie przeprogramowałaś i wszystko chodzi 16 razy wolniej? Nowe procki z fabrycznie ustawionymi fusami chodza z prędkością 1MHz. Może TWI korzysta z jakichś przerwań które nie są ustawione? Może jeszcze cos?
Btw. Ja jednak jestem nadal ciekawy czy to jakaś praca zaliczeniowa na studia, praca "zawodowa" czy moze hobby? :wink:

Szukampomocy
-
Posty: 10
Rejestracja: 14 sie 2008, 12:28
Lokalizacja: Londyn

Post autor: Szukampomocy » 15 sie 2008, 5:53

Nie jestem, aż tak zielona. Atmega jest u mnie ustawiona na wewnętrzny oscylator 8MHz.
BTW: Pisałam już, że to nie jest żadna praca zaliczeniowa a jedynie mój własny projekcik realizowany dla własnej satysfakcji.

ZbeeGin

Post autor: ZbeeGin » 15 sie 2008, 8:33

1. Stosowanie sprzętowego TWI w BASCOM w sumie nie wymaga stosowania wstawek. Dołącza się bibliotekę $lib "i2c_twi.lbx", używa się CONFIG TWI = częstotliwość_pracy (wartość podaje się w Hz), i ustala przez CONFIG SDA/SCL nazwy końcówek sprzętowego TWI, które to polecenie I2CINIT ustawi w odpowiedni stan i kierunek. Wtedy wszystkie polecenia BASCOM Basic-a związane z I2C przekierowywane są do sprzętowego TWI. Ale dalej program będzie czekał aż transmisja się zakończy. Chyba, że obróbka danych będzie w przerwaniach.
Przykładzik oczywiście w helpie angielskim (to w miarę nowa instrukcja) w temacie CONFIG TWI.

2. Przy I2C nie dzieli się przez 8 tylko przez 10 a nawet 11 dla bezpieczeństwa. Zapominacie o tym, że protokół wymaga jeszcze bitów startu, stopu, potwierdzenia ACK. A i przesyłanie, i ustawianie rejestrów się do tego też zalicza.

3. To 400kHz pochodzi od układów podrzędnych high-speed, które mogą z taką częstotliwościa poprawnie pracować - tak gwarantuje producent. Preskaler w TWI można ustawić by generował nawet wyższy fSCL, ale wymaga to odpowiedniego takowania procesora. W ATmega8 @ 8MHz najszybszy fSCL jaki można uzyskać to 222,222kHz. Czyli teoretyczny transfer to 20kB/s w trybie odczytu ciągu danych. Jeśli przy kolejnych próbkach musisz non stop adresować układ to prędkość drastycznie spadnie.


Przykładowy kod w asm z komentarzami komunikacji z pamięcią 24c512 znajdziecie tutaj: https://forum.elportal.pl/viewtopic.php?t=6977

Szukampomocy
-
Posty: 10
Rejestracja: 14 sie 2008, 12:28
Lokalizacja: Londyn

Post autor: Szukampomocy » 15 sie 2008, 9:07

Mi potrzeba transmisji z prędkością około 10KHz max do 15KHz, ale za to przyosobnym adresowaniu za każdym razem. Jeśli pobieranie tych danych ustawię w przerwaniu to jak myslicie- uda się?

[ Dodano: 2008-08-15, 10:14 ]
Chodzi mi o to, żeby w przerwaniu było procedurze odcytu z eepromu dane tylko tyle czasu, żeby pewnie odczytało dane i nastepne przerwanie z kolejnym odczytem było wywołane wczesniej niż wynikałoby to z opóźnienia i2cdelai=1

ODPOWIEDZ