ATMEGA8535 z wewnętrznym TWI

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!
ODPOWIEDZ
Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

ATMEGA8535 z wewnętrznym TWI

Post autor: Tranzystor » 09 cze 2008, 13:19

Witam,
chciałbym uruchomić wewnętrzny układ TWI w ATMEGA8535 do sterowania układem PCF8583. Program piszę w BASCOMie. Szukałem w helpie, jednak porównując program z użyciem TWI i bez zauważyłem, że jest takich samych rozmiarów. Według mnie program powinien być mniejszy, no i powinien trochę szybciej działać.

W HELPie pisze, że należy konfigurować tak:

Kod: Zaznacz cały

$lib"i2c_twi.lbx"

Config SCL = Portc.5
Config SDA = Portc.4

I2cinit

Config TWI = 100000
Nie rozumiem po co konfigurowane są linie SCL i SDA, skoro domyślnie są to nóżki układu TWI. Cała reszta jest w sumie logiczna...

Pozdrawiam ;)

ZbeeGin

Post autor: ZbeeGin » 09 cze 2008, 23:35

Tranzystor pisze:Nie rozumiem po co konfigurowane są linie SCL i SDA, skoro domyślnie są to nóżki układu TWI. Cała reszta jest w sumie logiczna...
Wszystko wyjaśni ta procedura:

Kod: Zaznacz cały

_i2c_init:
  ; set i2c pins to right state , open collector , pull up activated
  sbi _sdaPORT,_sda                   ; activate pull up
  sbi _sclPORT,_scl                   ; activate pull up
  Cbi _sdaDDR,_sda                    ; init SDA
  Cbi _sclDDR,_scl                    ; init SCL
  Ret
Właśnie tym stałym zostaną przypisane właściwe wartości podczas kompilacji, a zostaną one pobrane z poleceń CONFIG SDA/SCL. Jest to pełne rozwinięcie polecenia I2CINIT, które jak widać nie robi nic innego jak ustawia stany w rejestrach portów. Nie ma tu inicjalizacji modułu TWI gdyż jest ona wykonywana podczas CONFIG TWI.
Tranzystor pisze:Według mnie program powinien być mniejszy, no i powinien trochę szybciej działać.
Niekoniecznie. Jak wiesz polecenia w BASCOM są wykonywane prostoliniowo (w założeniu). Zatem program podczas wykonywania polecenia I2CSTART (via TWI) nie zrobi nic innego jak ustawi flagę TWSTA i poczeka aż zgłosi się flagą TWINT układ TWI! Tak samo z innymi procedurami. One zawsze muszą poczekać na gotowość TWI by móc przekazać następne polecenie do wykonania. BASCOM nie ma wbuowanej wielowątkowości :)

Gdybyś program pisał sam w asemblerze to z pewnością wykorzystałbyś fakt, że zamiast czekać na przesłanie bajtu przez TWI możesz w tym czasie zrobić coś innego. W tym celu całą transmisję wrzuciłbyś do kolejkowanego przerwania i zajął procesor innymi zadaniami.
Jak popatrzysz na fragment kodu w temacie "Nawijarka godzin" tam właśnie skorzystałem z czasu jaki potrzebuje TWI by w tym czasie przygotować adres próbki. Co prawda nie ma tam przerwań TWI, ale te paręnaście mikrosekund nie jest tracone na czekanie - skoro była taka możliwość to dlaczego nie skorzystać?

A program pewnie jest mniejszy o parę bajtów, ale znając BASCOM pewnie parę rzeczy wrzucił na zapas i stąd pozorna taka sama objętość.

Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Post autor: Tranzystor » 10 cze 2008, 6:11

Dzięki za odpowiedź ;)
Myślałem, że lepszym pomysłem będzie wykorzystanie TWI do transmisji pomiędzy procesorem, a układem zegara RTC. Jak widać w BASCOMie obojętnie co się użyje będzie działać podobnie :P W takim razie zostanę przy zwykłej transmisji I²C.

Pozdrawiam ;)

ODPOWIEDZ