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

ATMega32 i PCF8575: Odczyt tylko 8 bitów zamiast 16 w Bascomie, I2C

the_mian 28 Mar 2007 08:38 2505 13
REKLAMA
  • #1 3726398
    the_mian
    Poziom 11  
    Posty: 11
    Witam,

    Mam problem z pracą na PCF8575 podłączonym do ATMegi32 po I2C. Całość programuję Bascomem.

    W czym rzecz? Mianowicie mogę sczytać tylko 8 bitów. Bascom jakby nie widział pełnych 16 bitów PCF8575. Cały układ działa, ma poprawie ustalony adres.

    Czy ktoś kiedyś miał podobny problem? Albo ktoś może mi potwierdzić, że na 100% da się to odczytać programując BASComem?

    Z góry dziękuję za pomoc.

    Pozdrawiam,
    Damian.
  • REKLAMA
  • #2 3726435
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Pokażesz swoje procedury zapisu/odczytu , czy mamy zgadywać :?: :D

    Piotrek
  • #3 3726494
    the_mian
    Poziom 11  
    Posty: 11
    Jasne. Przepraszam,że nie zamieściłem wcześniej.

    Testuję pracę PCF8575 przy pomocy takiego krótkiego programu:

    -----------------------

    $regfile = "m32def.dat"
    $crystal = 8000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5

    Config Sda = Portc.1
    Config Scl = Portc.0

    Dim W As Byte
    Dim W2 As Byte
    Dim I As Integer

    I2cinit
    I = 1
    I2cstart


    Do

    I2creceive 68 , W
    I2creceive 69 , W2

    Cls

    Lcd I
    Lcd "Wartosc 1:"
    Lcd W
    Lowerline
    Lcd "Wartosc 2:"
    Lcd W2
    Waitms 50
    I = I + 1

    Loop

    -------------------

    Uzyskuje na LCD

    I (tu rosnąca wartość) Wartość 1: (zmienia się gdy daję sygnał na pierwsze 8 bitów, a stoi w miejscu jak ruszam drugą ósemkę)

    Wartość 2 : Tu wiadomo zawsze 255.

    Pozdrawiam,
    Damian.
  • #4 3726580
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    Czytasz z dwóch różnych adresów ;) 68 i 69 dlatego jeden odczyt działa a drugi nie. Jak masz podłączone A0, A1, A2?
  • REKLAMA
  • #5 3726609
    the_mian
    Poziom 11  
    Posty: 11
    A0 - , A1 + , A2 - ...

    Adres 68 na read, 69 na write.

    69 czytam w sumie bez sensu, ale cale 16 bitów powinno pokazać sie na na 68 adresie, a przeczytać mogę tylko 8 pierwszych bitów PCFka.

    Wiecie gdzie tkwi błąd?

    Może Bascom w ogóle nie potrafi tej 16tki odczytać?

    Pozdrawiam,
    Damian.
  • REKLAMA
  • Pomocny post
    #6 3726673
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    the_mian napisał:
    ...
    Może Bascom w ogóle nie potrafi tej 16tki odczytać?

    Pozdrawiam,
    Damian.

    Bascom potrafi , tylko Ty nie rozumiesz jak działa instrukcja I2creceive :(
    A działa tak:
    
    I2creceive 68 , W
      'i2cstart
       'i2cwbyte 68 OR 1 , czyli 69
       'i2crbyte W
       'i2cstop
    

    Z tego jasno wynika , że zawsze odczytasz tylko jeden bajt i zawsze będzie to pierwszy bajt z Twojego PCF-ka , bo I2cstart zeruje jego wewnętrzny licznik.Ja zrobił bym to tak:
    
      i2cstart
       i2cwbyte 69
       i2crbyte W , Ack
       i2crbyte W2 , Nack
       i2cstop
    

    lub drugi sposób
    
    Dim slowo as word
    I2creceive 68 , Slowo , 0 , 2 
    'lub
    Dim slowo(2) as byte
    I2creceive 68 , Slowo(1) , 0 , 2 
    

    Drugiego sposobu nie jestem pewien , ale powinien działać;)

    Piotrek
  • #7 3726685
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    I2creceive 69 , W2
    to polecenie odbiera jeden bajt z urządzenia Slave o adresie 69. Jeśli chcesz pobrać od razu dwa bajty spróbuj albo:

    I2creceive 69, temp(1) , 0 , 2
    wtedy w temp(1) powinna być wartość 1 bajtu a w temp(2) drugiego (oczywiście wcześniej musisz zadeklarować tablicę temp())

    innym wyjściem jest

    I2cstart
    I2cwbyte 69
    I2crbyte W, ack
    I2crbyte W2, nack
    I2cstop

    (pisane z pamięci więc wymaga weryfikacji



    Dodane po 10 sekundach
    Widzę żę spóźniłem się kilka sekund ;)
  • REKLAMA
  • #8 3726690
    the_mian
    Poziom 11  
    Posty: 11
    Dzięki za pomoc...

    Teraz jestem w pracy i nie mam płytki przy sobie... Wieczorkiem sprawdzę i dam znać...

    Na zagramanicznych stronach wiara pisze, że się da, wiec mogę żyć nadzieją, iż to tylko mój błąd.

    Dzięki wielkie za pomoc. Dam znać jaki skutek!

    Pozdrawiam serdecznie,
    Damian.

    Ps. Zumek, Jestem beginijer :-P ... ciągle uczę się na błędach. Dzięki za cierpliwość :-).
  • #9 3731486
    the_mian
    Poziom 11  
    Posty: 11
    Przepraszam Was, że dopiero piszę.

    Oczywiście mieliście rację, kod:

    i2cstart
    i2cwbyte 69
    i2crbyte W , Ack
    i2crbyte W2 , Nack
    i2cstop


    działa w 100% poprawnie.

    Bardzo Wam dziękuję za szybką i fachową pomoc!

    Pozdrawiam,
    Damian.
  • #10 4911058
    piaseq
    Poziom 11  
    Posty: 27
    Nie zakładałem nowego topicu bo ten ma idealny temat.

    Potrzebuje wskazówek jak połączyć atmege32 z pcf8575 tak aby miec 128 wyjsc czyli 8 sztuk PCF8575. Czy to sie da zrobic w miare prosto? Zaznaczam ze jestem poczatkujacy w temacie.
  • #11 4911109
    Pituś Bajtuś
    Poziom 28  
    Posty: 934
    Pomógł: 137
    Ocena: 10
    Na wyprowadzenia adresowe A0.A3 podajesz liczbę od 0 do 7. Wtedy każdy układ ma inny adres.
  • #13 4911186
    Pituś Bajtuś
    Poziom 28  
    Posty: 934
    Pomógł: 137
    Ocena: 10
    piaseq napisał:
    Czyli da się podłączyć 8 układów PCF8575 do Atmegi32 ?

    Tak, da się. Można nawiet więcej, ale konieczne by było na przykład zrobienie dwóch (lub więcej) magistral I2C na niezależnych wyprowadzeniach, ale to już wyższa szkoła jazdy.
  • #14 4911211
    piaseq
    Poziom 11  
    Posty: 27
    Pituś Bajtuś napisał:
    piaseq napisał:
    Czyli da się podłączyć 8 układów PCF8575 do Atmegi32 ?

    Tak, da się. Można nawiet więcej, ale konieczne by było na przykład zrobienie dwóch (lub więcej) magistral I2C na niezależnych wyprowadzeniach, ale to już wyższa szkoła jazdy.


    Własnie nie chce wyższej szkoły :) Chcę jak najprościej :) Przydałby się jakiś schemat jak to wszsystko połączyć w sensowny układ uruchomieniowy do współpracy z PC :/

Podsumowanie tematu

✨ Problem dotyczył odczytu 16-bitowej wartości z układu PCF8575 podłączonego do mikrokontrolera ATMega32 przez magistralę I2C, programowanego w Bascomie. Użytkownik mógł odczytać tylko 8 bitów, gdyż stosował dwukrotny odczyt z dwóch adresów (68 i 69), co jest niepoprawne. W Bascomie instrukcja I2creceive odczytuje pojedynczy bajt i resetuje licznik wewnętrzny urządzenia, dlatego konieczne jest wykonanie odczytu dwóch bajtów w jednej transakcji I2C. Poprawny sposób to rozpoczęcie transmisji, wysłanie adresu zapisu (np. 69), a następnie odczyt dwóch bajtów z potwierdzeniem (ACK) po pierwszym i brakiem potwierdzenia (NACK) po drugim, zakończony stopem. Alternatywnie można użyć I2creceive z parametrem długości 2 bajtów. Po zastosowaniu tej metody odczyt 16 bitów działa poprawnie. Dodatkowo omówiono możliwość podłączenia do ATMegi32 do 8 układów PCF8575, wykorzystując różne adresy konfigurowane przez piny A0-A2, co pozwala uzyskać do 128 wyjść. W przypadku większej liczby układów konieczne byłoby zastosowanie wielu magistrali I2C.
Wygenerowane przez model językowy.
REKLAMA