Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom AVR problem z połączeniem kilku mikrokontrolerów I2C

DarcoDarini 18 Wrz 2009 19:45 2447 2
  • #1 18 Wrz 2009 19:45
    DarcoDarini
    Poziom 11  

    Witam. Ostatnio zainteresowałem się I2C w bascom. Trochę poczytałem i nawet wykonałem kod do transmisji między dwoma mikrokontrolerami. Tylko teraz zastanawiam się jak napisać kod jeśli chciałbym wykonać połączenie między 3-4 mikrokontrolerami? Czytałem że trzeba ustalić adres. Robi się to za pomocą polecenia "I2Creceive"? Jak to by wyglądało w masterze i slaverach ?
    Dzięki za odpowiedzi

    0 2
  • #2 18 Wrz 2009 19:53
    wader_669
    Poziom 28  

    (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

    0
  • #3 20 Wrz 2009 11:43
    DarcoDarini
    Poziom 11  

    Dzięki za odpowiedź. I tu moje pytanie: czy muszę używać tej biblioteki? czy istnieje inny sposób na kod w slaverze ? I czy kod poniżej w masterze prawidłowo będzie wybierać slavery?
    Legenda :-) :
    Adres1 przypisany jest atmedze 8 i wynosi 202
    Adres2 przypisany jest atmedze 16 i wynosi 210
    Kod:

    Code:
    $regfile = "m16def.dat"
    
    $crystal = 8000000
    Config Sda = Portc.1
    Config Scl = Portc.0
    config portb=input                          'port b  jako wejścia
           Portb = &B00000000
    Dim Adres1 As Byte
    Dim Adres2 As Byte
    Adres1 = 208
    Adres2 = 210
    Do
    If Pinb.0 = 1 Then Gosub Wyslij_1
    If pinb.1 = 1 Then Gosub Wyslij_2
    Loop
    End
    Wyslij_1:
    I2cstart
    I2cwbyte Adres1
    I2cwbyte 166
    I2cstop
    Return

    Wyslij_2:
    I2cstart
    I2cwbyte Adres2
    I2cwbyte 170
    I2cstop
    Return

    0