(c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005 napisał: Przeznaczenie:
Konfiguruje pracę programowego interfejsu I2C jako urządzenia podrzędnego (Slave).
Ta instrukcja korzysta z biblioteki I2CSLAVE.LIB, która jest rozprowadzana oddzielnie przez MCS Electronics.
Składnia:
CONFIG I2CSLAVE = adres [ , INT = przerwanie ]
gdzie:
adres adres urządzenia. Musi być liczbą parzystą!
przerwanie nazwa symboliczna wykorzystywanego przerwania. Standardowo musi to być INT0.
Opis:
Pomimo iż nazwa wykorzystywanego przerwania może być dodatkowo podana, aby skorzystać z innego przerwania – przykładowo INT1 - należy przekonstruować treść biblioteki.
Przykład:
'--------------------------------------------------------------------------
' I2C SLAVE LIBRARY DEMO
' PCF8574 emulator
' (c) 2002 MCS Electronics
'--------------------------------------------------------------------------
'Program ten demonstruje jak za pomocą biblioteki I2CSLAVE można zaemulować układ PCF8574
'PCF8574 to prosty port posiadający 8 niezależnych końcówek we/wy
'Końcówki mogą być ustawiane lub zerowane poprzez przesłanie adresu
'układu i bajtu ze stanem końcówek
'By odczytywać stany wejściowe końcówek musisz je wpierw ustawić.
'Program ten używa AT90S2313, PORTB pracuje jako 8-bitowy port emulowanego układu PCF8574
'Biblioteka wymaga dostępności końcówek INT0 oraz TIMER0.
' SCL to PORTD.4 (T0)
' SDA to PORTD.2 (INT0)
'Użyj rezystorów podciągających 10k na obu liniach: SCL i SDA
'Biblioteka działa tylko w kontrolerach, w których T0 oraz INT0
'znajdują się w ramach tego samego portu.
'Układy takie to : 2313,2323, 2333,2343,4433,Tiny22,Tiny12,Tiny15,M8
'Inne układy posiadają wbudowaną sprzętową magistralę I2C (TWI) pracującą jako Slave.
'określamy czestotliwość kwarcu
$crystal = 3684000
'teraz definiujemy jakiego układu używamy
$regfile = "2313def.dat"
'Teraz określamy adres urządzenia na magistrali. Dla PCF8574 będzie to &H40
'Musisz zawsze podać adres używany do operacji zapisu!
'Instrukcja Config I2cslave automatycznie włącza globalny system przerwań!
Config I2cslave = &B01000000 'czyli &H40 w notacji szesnastkowej
'Bajt _i2c_slave_address_received jest generowana automatycznie przez kompilator.
'Przechowuje on odebrany adres.
'To samo dotyczy bajtu _i2c_slave_address
'W bajcie tym przechowywany jest ustawiony przez ciebie adres
'Zostają także zdefiniowane poniższe stałe używane przez kod w bibliotece:
' _i2c_pinmask = &H14
' _i2c_slave_port = PortD
' _i2c_slave_pin = Pind
' _i2c_slave_ddr = DdrD
' _i2c_slave_scl = 4
' _i2c_slave_sda = 2
'Stałe te są ustawiane automatycznie w zależności od użytego mikrokontrolera.
'Nie musisz się nimi martwić, podaję to tylko w celach informacyjnych
'Standardowo układ PCF8574 jest ustawiony jako wejście
Config PortB = Input
PortB = 255 'wszystkie końcówki w stan 1
'zdefiniujemy dodatkowy bajt, który nie jest w zasadzie potrzebny
'lecz pokazuje co znajduje się w rejestrze danych I2C
Dim Bfake As Byte
'pusta pętla
Do
'tutaj możesz wstawić inne operacje
'Pamiętaj by nie używać END, gdyż wyłączy on przerwania!
Loop
'Tutaj także możesz wstawić inne operacje, jednak nie zapominaj
'by nie umieszczać instrukcji END. Jeśli trzeba to wstaw STOP.
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
' Poniższe etykiety są wywoływane przez kod z biblioteki
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
'Jeśli układ MASTER żąda odczytania bajtu wtedy kod skacze pod poniższą etykietę.
'Wysyłane dane musisz umieścić w zmiennej _a1 (inaczej w rejestrze R16)
I2c_master_needs_data:
'jeśli kod jest dość krótki musisz umieścić instrukcję WAITMS
'Pamiętaj, że podczas działania tego fragmentu programu generowany jest stan WAIT i układ master będzie czekał.
'po powrocie stan WAIT zostanie zakończony
Config PortB = Input 'port jako wejścia
_a1 = PinB 'odczytaj port i przekaż jego stan
Return
'Jeśli układ MASTER przesyła dane wtedy kod skacze pod poniższą etykietę
'Twoim zadaniem jest pobrać przesłaną wartość ze zmiennej _A1 i wykonać potrzebne operacje
'_A1 to rejestr R16 który może być zniszczony/zmieniony przez instrukcje języka BASCOM Basic
'Dlatego też ważne jest by zapamiętać jego zawartość
I2c_master_has_data:
'jeśli kod jest dość krótki musisz umieścić instrukcję WAITMS
'Pamiętaj, że podczas działania tego fragmentu programu generowany jest stan WAIT i układ master będzie czekał.
'po powrocie stan WAIT zostanie zakończony
Bfake = _a1 'nie jest potrzebne ale pokazuje co znajduje się w _A1
'Po zapamiętaniu bajtu (tutaj w bFake) możesz zmieniać R16
Config PortB = Output 'teraz port będzie wyjściem
PortB = _a1 'wpiszemy odebrany bajt w _A1 (R16)
Return
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
'Możesz także w prosty sposób rozszerzyć ten przykład, używając 3
'dodatkowych linii z portu PD by zaimplementować funkcję wyboru adresu
'Do tego celu można przykładowo użyć: PortD.1 , Portd.2 oraz PortD.3.
'Po instrukcji CONFIG I2CSLAVE = &H40, można umieścić taki oto kod:
'Dim switches As Byte 'zdefiniuj zmienną
'switches = PIND 'odczytaj stan mikroprzełączików
'switches = switches And &H1110 'pozbywamy się niepotrzebnych bitów
'_i2c_slave_address = &H40 + switches 'teraz ustawiamy właściwy adres
Dodano po 3 [minuty]: jak widzisz ustalasz adres kazdego ukladu. Nastepnie master wysyla adres mowi z ktorym ukladem chce sie komunikowac