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

XMega128A3U - Jak przenieść funkcje I2C z Atmega8, brak odpowiedników rejestrów?

dawid.barracuda 10 Sie 2016 21:37 2226 33
  • #1 15861287
    dawid.barracuda
    Poziom 13  
    Szanowni Forumowicze,
    mam pewien problem z przeniesieniem tych funkcji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    na XMegę 128A3U. Problem mam głównie w tym, że nie mogę się doszukać odpowiedników wszystkich rejestrów, a przecież na pewno można te funkcje przenieść. Głównie chodzi mi o bity TWSTA i TWSTO. Powyższe funkcje sprawdzałem dla Atmegi 8 i wszystko działało, ale w manualu do XMegi jako takiego bitu w rejestrze kontrolnym nie widzę. Jest natomiast rejestr kontrolny C (CTRLC) i dwa ostatnie bity (CMD). Na podstawie tego napisałem takie coś:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie wiem jednak czy jest to poprawne. Proszę uprzejmie o wskazówki i pozdrawiam.
  • Pomocny post
    #2 15861440
    Konto nie istnieje
    Konto nie istnieje  
  • #3 15861500
    dawid.barracuda
    Poziom 13  
    Czytam manuala, ale nie ukrywam, że nie wszystko jeszcze rozumiem. Xmegi wydają się dość pokręcone w porównaniu z atmegami, ale z tego wrażenia muszę się szybko wyleczyć, bo funkcjonalność mówi sama za siebie.
    A co w przypadku stopu?
  • #4 15862081
    dawid.barracuda
    Poziom 13  
    Oto co jest odnośnie startu / stopu w manualu do htu21d:
    Cytat:
    - Start sequence (S)
    To initiate transmission, a start bit has to be issued. It consists of a lowering of the DATA line
    while SCK is high followed by lowering SCK.
    - Stop sequence (P)
    To stop transmission, a stop bit has to be issued. It consists of a heightening of the DATA line
    while SCK is high preceded by a heightening of the SCK.

    Rozumiem, co wymaga ode mnie HTU. W Atmedze były konkretne bity i też nie było z tym problemu.
    Rozumiem, że w xmedze po adresie mam od razu start. Ale jak w takim razie zrobić stop? Raczej nie chodzi o ręczne ustawienie portów w stan niski w krótkim odstępie.

    Edit:
    Manual do xmegi:
    Cytat:
    A master indicates the start of a transaction by issuing a START condition (S) on the bus. An address packet with a slave
    address (ADDRESS) and an indication whether the master wishes to read or write data (R/W) are then sent. After all
    data packets (DATA) are transferred, the master issues a STOP condition (P) on the bus to end the transaction. The
    receiver must acknowledge (A) or not-acknowledge (A) each byte received.

    Znaczy to tyle, że stop też jest automatycznie wysyłany?
  • Pomocny post
    #5 15862108
    Konto nie istnieje
    Konto nie istnieje  
  • #6 15863305
    dawid.barracuda
    Poziom 13  
    Na podstawie tego, co poleciłeś napisałem coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Na oscyloskopie widzę jednak, że piny E0 i E1 są na masie cały czas, TWI nawet nie wstało. Co robię nie tak?

    Pliki nagłówkowe użyte wyżej wysyłam w ząłaczniku.
  • Pomocny post
    #7 15863325
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #8 15863339
    grko
    Poziom 33  
    @dawid.barracuda TWIC != TWIE
  • #9 15863340
    dawid.barracuda
    Poziom 13  
    Ja czytam ten kod już trzeci dzień :P Nie ukrywam, że zderzam się z tak napisanym kodem pierwszy raz. Przede wszystkim nie rozumiem za bardzo jak się dostać do odebranych danych.

    Korzystałen natomiast z materiałów atmelowskich dot. UARTa i tam poszło jakoś bardziej gładko.

    Dodano po 7 [minuty]:

    Coś mi się ubzdurało z tym portem E... Dzięki grko za zwrócenie uwagi, patrzę teraz tam gdzie trzeba na oscyloskopie i rzeczywiście coś się dzieje, widać wyraźnie pojawiającą się sekwencję. Jednak nie mam pomysłu, nawet wczytując się w kod, jak dostać się do odebranych danych... o ile dane w ogóle są do mnie odsyłane, bo wg datasheet'a htu21d pomiar trwa ok. 50ms a takiej przerwy na oscyloskopie nie widzę.
  • Pomocny post
    #10 15863399
    grko
    Poziom 33  
    Struktura twiMaster ma bufor na odczytane dane:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #11 15863450
    dawid.barracuda
    Poziom 13  
    Rzeczywiście, nie zauważyłem...
    Zrobiłem jak napisałeś, wysłałem wynik printfem do Putty i widzę same śmieci, więc coś mam nie tak z komunikacją z czujnikiem. Nie mam za bardzo pomysłu co dalej.
  • Pomocny post
    #12 15863484
    grko
    Poziom 33  
    Nie napisałeś jaki to czujnik, co wysyłasz, co chcesz odczytać oraz jak to formatujesz przed printf.
  • #13 15863519
    dawid.barracuda
    Poziom 13  
    Czujnik to HTU21D. Wysyłam do niego komendy, które są w Datasheet (w załączniku). Chcę odczytać temperaturę w trybie Hold Master. Oto kompletny kod main.c:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tak ma wyglądać komunikacja:
    XMega128A3U - Jak przenieść funkcje I2C z Atmega8, brak odpowiedników rejestrów?
  • #14 15863553
    grko
    Poziom 33  
    Chcesz wysłać tylko jeden bajt (adres funkcja dodaje automatycznie)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Nie pokazałeś co zostało odczytane.
  • #15 15863573
    dawid.barracuda
    Poziom 13  
    grko napisał:

    Nie pokazałeś co zostało odczytane.


    Mogę to pokazać inaczej niż przez UART?
    W pewnym momencie wpadłem na to, że funkcja sama dodaje adres, ale procedura jest taka: I2C address -> Komenda -> I2C address + 1 -> odczytanie wyniku.
    Próbowałem też wysyłać dwa bajty w kolejności 0xE3, 0x81 ale dalej śmieci na terminalu.
  • #16 15863584
    grko
    Poziom 33  
    Funkcja: TWI_MasterWriteRead sama wysyła adres z bitem R=0 (0x80), następnie wyśle to co podałeś w buforze wejściowym (zapewniam Cię, że chcesz tam wysłać jeden bajt) i następnie rozpocznie odczyt wysyłając adres z bitem R=1 (0x81).

    Cytat:
    Mogę to pokazać inaczej niż przez UART?

    Możesz. Przekieruj wynik do tego wątku ;)
  • #17 15863600
    dawid.barracuda
    Poziom 13  
    Wyniki pomiarów :D
    XMega128A3U - Jak przenieść funkcje I2C z Atmega8, brak odpowiedników rejestrów?
    Skoro mnie zapewniasz, to ja wierzę :) Powiedz mi tylko skąd to wie, że musi tam dodać jedynkę?

    Włączyłem jeszcze raz dla pewności, i dostałem takie coś:
    XMega128A3U - Jak przenieść funkcje I2C z Atmega8, brak odpowiedników rejestrów?
  • #18 15863619
    grko
    Poziom 33  
    To nie wygląda jak wynik printf. Musisz to odpowienio sformatować:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pokaż jeszcze raz kod.
  • #19 15863693
    dawid.barracuda
    Poziom 13  
    Sam while:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/quote]

    Miałem formatowanie tj. u Ciebie, ale rozbite na trzy funkcje i bez nowej linii.
  • #20 15863696
    grko
    Poziom 33  
    No i nadal wysyłasz trzy bajty zamiast jednego. Nie uważasz, że znak nowej linii będzie przydatny?
  • #21 15863701
    dawid.barracuda
    Poziom 13  
    Ajć, bo ja to skopiowałem z posta wyżej. W komputerze u siebie już mam poprawione na jeden bajt. Zmieniłem trzy printfy na Twojego jednego i wynik jest taki:
    XMega128A3U - Jak przenieść funkcje I2C z Atmega8, brak odpowiedników rejestrów?
    Aktualny while:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #22 15863713
    grko
    Poziom 33  
    Coś uart Ci nie działa bo ten prinntf nie powinien tego typu danych sformatować.
  • #23 15863734
    dawid.barracuda
    Poziom 13  
    Przed tym jak zacząłem dopisywać I2C działało, bo zapisałem projekt z uartem pod inną nazwą i dopisywałem kod. Mogą przerwania na siebie nachodzić?

    Sprawdziłem dla pewności ładując do procka poprzedni projekt gdzie mam te same funkcje uarta, ale nic poza tym i działa zarówno printf jak i funkcje z biblioteki atmela. Co może być przyczyną, że po dopisaniu I2C wypisuje bzdury?
  • #24 15864195
    dawid.barracuda
    Poziom 13  
    UARTa ogarnę jak wrócę z pracy, ale uderzyła mnie jedna rzecz:
    Cytat:
    Sending a command
    After sending the start condition, the subsequent I²C header consist of a 7-bit I²C device address 0x40 and a
    DATA direction bit (‘0’ for Write access : 0x80). The HTU21D(F) sensor indicates the proper reception of a byte
    by pulling the DATA pin low (ACK bit) after the falling edge of the 8th SCK clock. After the issue of a
    measurement command (0xE3 for temperature, 0xE5 for relative humidity), the MCU must wait for the
    measurement to complete. The basic commands are given in the table below:[...]

    Czy w takim razie jako adres powinienem podać 0x40 (liczba 7. bitowa)?
  • #25 15864269
    Konto nie istnieje
    Konto nie istnieje  
  • #26 15864282
    dawid.barracuda
    Poziom 13  
    W atmedze 8 podawałem 8-bitowo.
    Znaczy, że mam po inicjacji czujnika i wysłaniu komendy zmienić adres w funkcji wysyłającej na 0x41/0x81?
  • #27 15864314
    Konto nie istnieje
    Konto nie istnieje  
  • #28 15864329
    dawid.barracuda
    Poziom 13  
    Czyli wychodzi na to, że w atmedze musiałem ręcznie dodać bit kierunku do adresu. Teraz pytanie - czy xmega sama dokleja bit kierunku do adresu?

    Patrząc na screen datasheet'a z postu wyżej (https://www.elektroda.pl/rtvforum/topic3235393.html#15863519)
    można zauważyć, że występują formy 8-bitowe.
  • #29 15864349
    Konto nie istnieje
    Konto nie istnieje  
  • #30 15865504
    dawid.barracuda
    Poziom 13  
    Dziękuję Piotrus_999 za wskazanie tego fragmentu. Przyznaję, że go nie zrozumiałem.
    Oto działający kod, funkcja while(1):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wynik widoczny w putty:
    XMega128A3U - Jak przenieść funkcje I2C z Atmega8, brak odpowiedników rejestrów?

    W powyższym kodzie na początku dodałem jeszcze wysłanie komendy soft resetu.
    Mam jeszcze takie pytania:
    1) Do czego mogę wykorzystać informację CRC, czyli trzeci bajt?
    2) Jak chciałem wrzucić do printfa 32-bitowego inta ze znakiem to kompilator wyrzucił ostrzeżenie, że %d wymaga 16bitowego argumentu. Nie znalazłem w internecie parametru do int32_t, wyżej widziałem jedynie już dla float'a. Da się coś z tym zrobić, żeby nie używać float'a?
REKLAMA