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

atmega 16 + TWI ( i2c ) + termometr ds1621 ASEMBLER

smusu 28 Lip 2007 21:00 6043 8
REKLAMA
  • #1 4123835
    smusu
    Poziom 11  
    Posty: 53
    Witam.
    Mam wielki problem z uruchomieniem termometru ds1621 podłączonego przez i2c.

    Po kilku dniach szukania na forum, czytania datasheetów i książki "Mikrokontrolery AVR ATmega w praktyce" R. Baranowskiego nie mogę znaleźć rozwiązania.
    Wydaje mi się, że mniej więcej czaję o co chodzi w i2c ale nie daję juz rady. Możliwe, że nie inicjuję dobrze termometru bo nie rozumiem do końca angielskiego datasheeta.

    Mega moja chodzi na wewnętrznym oscylatorze 1MHz.
    Próbowałem modyfikować kod ze str. http://mikrokontrolery.net/avr_kursy.htm ale nie bardzo wiem jak to powinno wyglądać i czy czasy się zgadzają.

    Jeśli ktoś by był tak dobry i poratował mnie kodem w asm do obsługi i2c a najlepiej od razu ds1621 to będę wdzięczny :)
  • REKLAMA
  • #2 4128556
    smusu
    Poziom 11  
    Posty: 53
    Dalej nic nie mogę zdziałać.
    Czy na prawdę wszyscy są na takim poziomie jak ja ? :p
  • REKLAMA
  • #3 4129211
    szod
    Poziom 33  
    Posty: 1663
    Pomógł: 215
    Ocena: 120
    Wstaw fragment kodu z którym masz problemy to będzie łatwiej. Może robisz
    jakiś prosty błąd.
  • REKLAMA
  • #4 4130681
    smusu
    Poziom 11  
    Posty: 53
    Na razie do pisania kodu jeszcze nie przeszedłem.
    Tzn próbowałem zmienić ten z
    http://mikrokontrolery.net/avr_asm_09.htm
    ale nie działa.

    I ciężko w tym znaleźć błąd. Tam jest pisane dla "2313def.inc" i układu PCF8591(przetwornik AC).

    Z tego co rozumiem jest tam łatwiej bo wystarczy wysłać:
    START---i2cwrite(ADRES+R)----i2cread-----STOP
    i już jest wartość.

    A w ds1621 trzeba chyba coś ustawić najpierw - tak mi się wydaje po przeczytaniu datasheetu:
    http://www.maxim-ic.com/getds.cfm?qv_pk=2737

    Próbowałem zrobić tak:
    1.START---i2cwrite(ADR+W)-----i2cwrite(0xAC)(konfiguracja)-----i2cwrite(0)(wszystkie bity rejestru konfiguracyjnego ustawić na 0 ???)-----STOP

    2. START---i2cwrite(ADR+W)----i2cwrite(0xEE)(start konwersji)---STOP

    3.START----i2cwrite(ADR+W)---i2cwrite(0xAA)(czytaj temp.)--START----i2cwrite(ADR+R)-----i2cread----STOP

    Pytania:
    1. Czy to tak to powinno wyglądać ?
    2. Czy będzie dobrze tam gdzie ??? dać zero czy można by tego w ogóle nie robić bo domyślnie np jest 0 ?
    3. Czy ktoś w ogóle kiedyś próbował procedur z tej strony i mu działały?
    4. Czy ktoś ma gotowe w asm procedurki do obsługi i2c i może je podrzucić ?

    Nie chcę iść na łatwiznę ale już mi ręce opadają bo nie wiem nawet gdzie szukać błędów.
    Żeby nie było, że jestem lewus mogę się wymienić na prawie całkowicie samodzielnie pisane procedurki obsługi LCD w trybie 4-bit (w tym wypisywanie stringów i wypisywanie liczb ze 3 lub 2 cyfr w postaci stringa na wyśw)
    Albo sterowanie dwoma bipolarnymi silnikami krokowymi na jednym porcie 8-pin (2x4 żyły) w obie strony, każdy silnik sterowany niezależnie
  • #5 4130813
    szod
    Poziom 33  
    Posty: 1663
    Pomógł: 215
    Ocena: 120
    Twój podstawowy błąd jest taki, że procedury które podałeś są dla 2313 a on
    nie posiada sprzętowego I2C więc jest to rozwiązane programowo. ATmega16
    ma sprzętowe I2C więc powinieneś z tego skorzystać. Kod będzie wtedy inny.
  • #6 4131206
    smusu
    Poziom 11  
    Posty: 53
    Ze sprzętowego też próbowałem korzystać i też nie wychodzi.
    Tutaj znowu nie wiem czy prędkości są dobre.
    Dla mojego 1MHz ustawiłem:
    TWPS1..0 = 1
    TWBR =1

    co daje fSCL=1/22=45kHz

    Nie wiem czy to jest dobrze. A jeśli nie to jak ustawić te rejestry?


    Pisałem też program do tego ze sprawdzaniem stanu TWSR po każdej operacji i tak:
    -po wyslaniu START - 0x08(wysłano START)
    -wysłam ADR+W
    następnie w zależności czy czekam na TWINT:
    1 - bez czekania - 0xF8(oczekiwanie na zkończenie operacji)
    2 - z czekaniem - 0x00(nieoczekiwany sygnał START/STOP) ale to po ok 2sekundach.

    Dodam, że próbowałem z różnymi adresami DS1621 i zarówno z podłączonym jak i odłączonym jest tak samo.

    Mój wniosek:
    Albo źle ustawiam prędkość albo źle inicjuję termometr.
  • #7 4131291
    sawitar
    Poziom 18  
    Posty: 226
    Pomógł: 20
    Ocena: 19
    W I2C nie ma timeoutu więc o prędkość nie masz się co obawiać. Samemu napisz procedury do Startu, Stopu, wysyłania i odbierania bajtu z magistrali. Będziesz dokładnie wiedział jak to działa i przy okazji podniesiesz swoje umiejętności. W dokumentacji do każdego przyrządu na I2C jest szczegółowy opis zastosowanej magistrali.
  • REKLAMA
  • #8 4131931
    smusu
    Poziom 11  
    Posty: 53
    ZROBIŁEM :D :D :D :D

    Okazało się, że myślałem dobrze tylko ścieżka była przerwana :/
    Uruchomiłem na TWI więc dużo roboty nie było.

    A jak by ktoś pytał jak czytać temp z ds1621 to inforumuję(tzn u mnie działa a na razie inaczej nie próbowałem):
    -używać rezystorów podciągających ( u mnie 4,7k)
    -adres 1001000 DS1621 uzyskałem przez zwarcie nóżek adresowych do masy (pierwsze 4 bity czyli 1001 - tak ma być, czyt. datasheet,pozostałe 3 to ustawienie przez wyprowadzenia 5,6,7 scalaka)

    Przebieg transmisji:
    - najpierw ustawienie TWPS1..0 i TWBR
    u mnie dla fOSC=1MHz wpisałem TWPS1=0 TWPS=1 TWBR=1

    - potem uruchomić konwersję (wysłać 0xEE):

    START---ADR+W(*****)---0xEE---STOP
    (*****)-oznacza że po tym można sprawdzić zawartość TWSR i z zamaskowanymi 2 ostatnimi bitami powinno być 0x18(odsyłam do ksiązki R. Baranowskiego)

    - dalej juz tylko wysłać 0xAA(Read temp.) i pobrać wartość

    START----ADR+W---0xAA---START----ADR+R----'czytaj'---STOP

    gdzie 'czytaj' to:

    ldi acc,(1<<TWEN)|(1<<TWINT)
    out TWCR,acc
    rcall czekaj_i2c ;na skonczenie operacji i2c

    - po tych wszsytkich operacjach mamy temperaturę w rejestrze TWDR



    Proste prawda ?
    A ja się tyle z tym męczyłem.
    Jak ktoś chce to mogę podrzucić kod. Na razie nie jest to jakieś dzieło sztuki ale działa.
    hehe

    Proste jest coś co się wie jak zrobić. Jak się czegoś nie wie to jest to skomplikowane.
  • #9 6353847
    marcinxat
    Poziom 11  
    Posty: 61
    Ocena: 2
    witam

    nie chcę zakładać nowego tematu z tak błahego tematu więc zadam je w tym wątku.

    Smusu w pierwszym poście poruszył temat I2C w kursie ze strony mikrokontrolery.net.

    Moje pytanie dotyczy czasów trwania stanu wysokiego SCL-linii zegara (i zarazem niskiego stanu SCL bo są równe sobie). Czy jest ustalone ile ten czas powinien wynosić? Jakoś ta kwestia umknęła mi uwagi.

    Pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z uruchomieniem termometru DS1621 podłączonego do mikrokontrolera ATmega16 przez magistralę I2C (TWI) w asemblerze. Autor miał trudności z inicjalizacją i komunikacją, korzystając z kodu przeznaczonego dla ATmega2313 i układu PCF8591, co nie działało poprawnie ze względu na różnice sprzętowe – ATmega16 posiada sprzętowy moduł TWI, a ATmega2313 implementuje I2C programowo. Problemy obejmowały także ustawienie prędkości magistrali przy wewnętrznym oscylatorze 1 MHz, gdzie autor ustawił preskaler i TWBR, uzyskując częstotliwość SCL około 45 kHz. Wskazano, że w I2C nie ma timeoutu, a lepszym podejściem jest napisanie własnych procedur startu, stopu, wysyłania i odbioru bajtów, co pozwala lepiej zrozumieć działanie magistrali. Ostatecznie autor potwierdził, że problemem była przerwana ścieżka sygnałowa, a po jej naprawie udało się poprawnie odczytać temperaturę z DS1621. Zalecane jest stosowanie rezystorów podciągających 4,7 kΩ, prawidłowe ustawienie adresu (1001000) przez zwieranie nóżek adresowych do masy oraz sekwencja transmisji: wysłanie komendy startu konwersji (0xEE) po adresie z zapisem, a następnie odczyt temperatury przez wysłanie 0xAA i odczyt bajtu danych. Podano także przykładowe ustawienia rejestrów TWPS i TWBR dla 1 MHz oscylatora. W dyskusji pojawiło się również pytanie o czas trwania stanu wysokiego i niskiego linii SCL, który nie jest ściśle określony w standardzie I2C.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA