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ść.