logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Różnice w komunikacji I2C między PCF8574AP a PCF8574P z Atmega

romantv 09 Paź 2005 19:04 2282 4
REKLAMA
  • #1 1885525
    romantv
    Poziom 17  
    Posty: 328
    Pomógł: 11
    Ocena: 8
    Witajcie. Mam układ PCF8574P powinien być PCF8574AP uC Atmega nie widzi go po magistrali I2C czy moze być problem z komunikacją ??

    Program jest napisany w Bascomie.





    $crystal = 8000000 ' Kwarc zewnętrzny8MHz



    '******** KONFIGURACJA WYŚWIETLACZA LCD *********************************************************************

    Config Lcd = 16 * 2 ' Deklaracja wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Initlcd ' Inicjalizacja wyświetlacza LCD
    Cls ' Czyszczenie
    Cursor Off
    Cursor Noblink


    '******** KONFIGURACJA MAGISTRALI I2C ***********************************************************************
    ' Scl
    Config Scl = Portb.4
    Config Sda = Portb.5 ' Sda


    '******** KONFIGURACJA PORTÓW MIKROKONTROLERA ***************************************************************

    Config Pind.6 = Input 'S1
    Config Pind.7 = Input 'S2


    '******** USTAWIENIA POCZĄTKOWE *****************************************************************************

    Portd.6 = 1 'S1
    Portd.7 = 1 'S2


    'Wyzerowanie wyjść expanderów
    I2csend 112 , 0


    '******** DEKLARACJE ZMIENNYCH ******************************************************************************

    Dim Stan1 As Byte
    Dim Stan2 As Byte
    Dim Licznik1 As Byte
    Dim Licznik2 As Byte
    Dim Koniec1 As Byte
    Dim Koniec2 As Byte
    Dim Adres As Byte


    '******** DEKLARACJE PROCEDUR *******************************************************************************

    Declare Sub Wyszukaj




    '******** PROGRAM GŁÓWNY ************************************************************************************

    Cls
    Lcd "Ok..."
    Wait 2
    Cls

    Call Wyszukaj



    '******** PROCEDURY ****************************************************************************************


    Sub Wyszukaj
    For Adres = 100 To 200 Step 2
    I2cstart
    I2cwbyte Adres
    I2cstop
    If Err = 0 Then
    Cls
    Locate 1 , 1
    Lcd "Pod adresem: " ; Adres
    Stop

    Else
    Cls
    Locate 1 , 1
    Lcd "Brak ukladu: " ; Adres
    End If
    Wait 1
    Next Adres
    Lcd "Koniec"
    End Sub


    Program jest napisany do wykrycie układów w magistrali

    Dziękiiii
  • REKLAMA
  • #2 1885592
    PietrekDer
    Poziom 13  
    Posty: 134
    Pomógł: 1
    Ocena: 5
    Po pierwsze, to zawsze przed użyciem magistrali I2C musisz użyć polecenia I2Cinit i wtedy mozna wysłać adres np coś takiego:

    I2cinit
    I2cstart
    I2cwbyte 112 'adres jednego z PCF'ów
    I2cwbyte Dane 'bajt danych
    I2cstop

    pozatym ATmegi mają chyba domyslnie włączony wewnętrzny oscylator, więc crystal musiałbyć ustawić na 1000000, napisz programik gdzie dioda mrugałaby co sekundę i użyj crystala 8MHz, powinna migać szybciej (albo wolniej, nie pamiętam), (ja tak miałem), jesli tak będzie wtedy możesz odłączyć oscylator i wpisać $crystal=1000000
    Adres 112 miałem w PCF'ie gdy A0,A1,A2 podłączyłem do masy, ale nie pamiętam czy to A, czy AP. Pobierz aplikacje.
    Też się raz zaciąłem przez to polecenia I2cinit. Aha, linie SDA i SCL powinny też być podpięte do plusa zasilania przez rezystory 4.7k, a ja też podpiąłem każde wyjście PCF'a do plusa przez rezystor 10k, bo normalnie wydajność pradowa na diodę ledwo styknie, lepiej jest dać rezystory.
    BTW są expandery PCF8575, które są 16-bitowe (mają 16 lini we/wy).

    Powinno pomóc.
  • REKLAMA
  • #3 1885740
    romantv
    Poziom 17  
    Posty: 328
    Pomógł: 11
    Ocena: 8
    ok dzieki za pomoc.

    Mam podłączony oscylator zew. 8MHz uC działa tylko nie widze układu PCF8574P na magistrali I2C szyka i nic buuuu :(

    sprawdzam teraz to co mi napisałes z tymi instrukcjami papa

    Dodano po 5 [minuty]:




    $crystal = 8000000 ' Kwarc zewnętrzny8MHz



    '******** KONFIGURACJA WYŚWIETLACZA LCD *********************************************************************

    Config Lcd = 16 * 2 ' Deklaracja wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Initlcd ' Inicjalizacja wyświetlacza LCD
    Cls ' Czyszczenie
    Cursor Off
    Cursor Noblink


    '******** KONFIGURACJA MAGISTRALI I2C ***********************************************************************
    ' Scl
    Config Scl = Portb.4
    Config Sda = Portb.5 ' Sda


    '******** KONFIGURACJA PORTÓW MIKROKONTROLERA ***************************************************************

    Config Pind.6 = Input 'S1
    Config Pind.7 = Input 'S2


    '******** USTAWIENIA POCZĄTKOWE *****************************************************************************

    Portd.6 = 1 'S1
    Portd.7 = 1 'S2


    'Wyzerowanie wyjść expanderów
    I2csend 112 , 0

    I2cinit
    I2cstart
    I2cwbyte 112 'adres jednego z PCF'ów
    Rem I2cwbyte Dane 'bajt danych
    I2cstop

    '******** DEKLARACJE ZMIENNYCH ******************************************************************************

    Dim Stan1 As Byte
    Dim Stan2 As Byte
    Dim Licznik1 As Byte
    Dim Licznik2 As Byte
    Dim Koniec1 As Byte
    Dim Koniec2 As Byte
    Dim Adres As Byte


    '******** DEKLARACJE PROCEDUR *******************************************************************************

    Declare Sub Wyszukaj




    '******** PROGRAM GŁÓWNY ************************************************************************************

    Cls
    Lcd "Ok..."
    Wait 2
    Cls

    Call Wyszukaj



    '******** PROCEDURY ****************************************************************************************


    Sub Wyszukaj
    For Adres = 100 To 200 Step 2
    I2cstart
    I2cwbyte Adres
    I2cstop
    If Err = 0 Then
    Cls
    Locate 1 , 1
    Lcd "Pod adresem: " ; Adres
    Else
    Cls
    Locate 1 , 1
    Lcd "Brak ukladu: " ; Adres
    End If
    Wait 1
    Next Adres
    Lcd "Koniec"
    End Sub





    poprawiłem program
    tylko w jednym miejscu wywalił błąd


    Rem I2cwbyte Dane 'bajt danych

    i go zremowałem

    układ nadal nie widzi PCF-a

    Dodano po 16 [minuty]:

    Układ działa poprawnie UWAGA

    PCF 8574 A ma przedział adresowy od 100 do 200
    a
    PCF 8574 ma przedział sdresowy od 0 do 100


    można podłączyć 16 układów PCF :)


    Układ działa poprawnie.
  • REKLAMA
  • #4 1886114
    PietrekDer
    Poziom 13  
    Posty: 134
    Pomógł: 1
    Ocena: 5
    Adresy układów PCF mozna łatwo ustalić:
    układ 8574 ma taką strukturę adresu:
    MSB LSB
    L H L L A2 A1 A0 R/W
    gdzie R/W to stan wysoki dla R (read) i stan niski dla W (write), natomiast A2-A0 to nóżki na układzie, czyli można połączyć 8 układów jednego rodzaju. A w układzie ze znaczkiem A zmienia się poczatkowy człon z LHLL na LHHH a reszta jest tak samo.

    Pozdrawiam.
  • #5 1888171
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Wersja A ma inny adres.
REKLAMA