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

ATmega64 + TM1990A (pastylka 1-wire odpow. DS1990A)

Sławek-K 27 Lip 2017 20:00 1635 18
  • #1 16611975
    Sławek-K
    Poziom 15  
    Witam !
    Mam Problem z nawiązaniem komunikacji (a właściwie to tylko impulsu obecności)
    Układ jest podobno ścisłym odpowiednikiem DS1990A. Pomysły już się kończą.
    Rezystor podciągający 4,7k i 2,2k , żaden nie działa.
    Połączenia elektryczne OK, bo zwarcie gniazda pod pastylkę skutkuje ciągłym miganiem LED.
    Proszę obejrzeć kod i naprowadzić (pokazać ) gdzie jest problem.
    Sprawdzane na różnych wartościach opóźnień i nic.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 16612091
    tmf
    VIP Zasłużony dla elektroda
    Ściągnij sobie jakiś sprawdzony kod obsługi 1-wire zamiast kombinować. Twój kod jest lekko dziwaczny (ale może działać), tyle, że na sztywno przyjmujesz, że odpowiedź musi się pojawić dokłądnie 70 us po zakończeniu Reset pulse, a tak być nie musi. Wrzuć tam w pętli (ogranicoznej czasowo) testowanie, czy nie ma odpowiedzi w jakimś momencie.
  • #3 16612122
    Konto nie istnieje
    Konto nie istnieje  
  • #4 16612158
    Eagle
    Poziom 24  
    Jeśli zamierzasz dalej się bawić w embedded, kup podróbę analizatora saleae, z przesyłką 40PLN. Takie problemy jak ten, będziesz rozwiązywać sam w 5 min. Jak nie wiesz co się dzieje na wyjściu pinu, to można tylko zgadywać, sądząc po komentarzach w kodzie i dodatkowych opóźnieniach, piszesz na czuja, który w tym przypadku nie zadziałał. Wracając do zadania, impuls resetu w tym kodzie trwa 11us w/g specyfikacji powinien : 480us ( time H) https://www.maximintegrated.com/en/app-notes/index.mvp/id/126 . Reszty czasów nie sprawdzałem.
  • #5 16612170
    tmf
    VIP Zasłużony dla elektroda
    Eagle napisał:
    Wracając do zadania, impuls resetu w tym kodzie trwa 11us w/g specyfikacji powinien : 480us ( time H) https://www.maximintegrated.com/en/app-notes/index.mvp/id/126 . Reszty czasów nie sprawdzałem.


    Nie masz racji. Przyjrzyj się lepiej kodowi.
  • #6 16612215
    Eagle
    Poziom 24  
    Fakt, nie 11us, a 3x200us, co i tak jest różne od deklarowanego w specyfikacji.
  • #7 16612240
    tmf
    VIP Zasłużony dla elektroda
    Eagle napisał:
    Fakt, nie 11us, a 3x200us, co i tak jest różne od deklarowanego w specyfikacji.


    Nie jest, specyfikacja podaje min. czas trwania impuslu reset, niepodając maksymalnego. Problematyczna, jak pisałem, jest sekwencja detekcji presence pulse.
  • Pomocny post
    #8 16612249
    Eagle
    Poziom 24  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Sprawdza czy 1 jest mniejsze od 7 i wynik operacji logicznej sumuje logicznie z DDRF. Nie sądzę, aby taka była intencja. Popraw również pozostałe.
  • #9 16612391
    Konto nie istnieje
    Konto nie istnieje  
  • #10 16612662
    Sławek-K
    Poziom 15  
    Wielkie dzięki za dobre chęci i konstruktywne podpowiedzi.

    Tmf: Zanim założyłem temat oczywiście zapoznałem się z innymi kodami w [C] do obsługi 1-wire, ale wszystkie dotyczyły oryginalnego DS1990A. Z nich brałem też czasy które mnie na tym etapie interesują. (Projekty były rozbudowane a ja nie mogę "wystartować" z tymi pastylkami. Jestem gdzieś "na etapie przedszkola w [C]", więc dzięki za radę z tym oczekiwaniem , aż się może pastylka sama odezwie. Będę starał się coś w tym kierunku kombinować.

    Piotrus_999: 3 x200us zamiast jak pierwotnie było _delay_ms(600) wpisałem wzorując się na analizowaniu innych kodów na Elektrodzie do współpracy z DS1990A.

    Eagle: Dzięki za sprawdzenie kodu ."DDRF |= 1<7"; oczywiście powinno być DDRF |=1<<7; , bo w tej postaci to bez sensu. Może tutaj jest problem...... ?

    Czas reset wg noty ma być Treset>480us i kombinowałem z różnymi wartościami (wymienione w kodzie). 70us też "pożyczyłem" z innego kodu. Tam było 65us i działało (u mnie żaden z wymienionych nie sprawdził się) .
  • #11 16612679
    Eagle
    Poziom 24  
    Cytat:
    Eagle: Dzięki za sprawdzenie kodu ."DDRF |= 1<7"; oczywiście powinno być DDRF |=1<<7; , bo w tej postaci to bez sensu. Może tutaj jest problem...... ?
    dla
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    po przekształceniu daje :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a pastylkę podłączasz do PORTF7 a nie PORTF0, więc reset pojawia się nie na tym pinie którego oczekujesz. Gdybyś miał oscyloskop/analizator zobaczył byś, że na pinie PF7 nic się nie dzieje. Zwarcie tego pinu do masy, odczytujesz poprawnie bo :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po resecie PD7 jest skonfigurowane jako wejście, plus zewnętrzny pull up, daje efekt, że po zwarciu do GND zapala się dioda LED. Natomiast pastylka, nigdy nie otrzymuje sygnału resetu na PF7, więc nie potwierdza swojej obecności.

    @tmf Istotnie większość specyfikacji nie podaje max czasu resetu, nie mniej jednak jestem zwolennikiem używania czasów rekomendowanych, powodują mniej zamieszania.

    @Sławek-K Może przemyśl używanie makra od ustawiana bitów, pomoże uniknąć w przyszłości takich zagadek oraz poprawi czytelność kodu.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #12 16612697
    Konto nie istnieje
    Konto nie istnieje  
  • #13 16617391
    Sławek-K
    Poziom 15  
    W końcu się udało . Obydwie pastylki działają jak należy (tzn odpowiadają sygnałem obecności). Za wszystkie rady dziękuję. Wstawiam działający na obydwu pastylkach kod. Temat cały czas otwarty. Zabieram się za próbę odczytania 64-bitowych kluczy.
    Błąd był w źle napisanych przesunięcia bitowych (powinno być 1<<7 zamiast 1<7).
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 16617404
    Konto nie istnieje
    Konto nie istnieje  
  • #15 16620856
    Sławek-K
    Poziom 15  
    Dzięki za konstruktywne uwagi.

    Zostawiłem rezystor podciągający 2,2k.

    R-MIK "Dlaczego 100us skoro w nocie napisali 15..65?" - Racja już poprawiłem na 40us.

    Po presence nie czekasz, aż magistrala osiągnie "1". - Po wykryciu "0" jest opóźnienie a następnie sprawdzanie zmienną b czy na magistrali jest stan "1".

    Tylko zdefiniuj sobie port i wyprowadzenie i używaj. - Na początku tak miałem , ale przy problemach zastąpiłem to powyższą postacią.

    if ( !a && (PINF & 1<<7) ) // jesli pamieć jest obecna na linii, działa i nie ma zwarcia. Piszesz jak w Bascom-ie. - Nie rozumiem , dlaczego tak twierdzisz ? Jeśli przez to , że rozbijam taka linię na 3 prostsze to robię to celowo , abym widział konkretnie co i jak krok po kroku. Takie "skomplikowane linie" za miesiąc już nic mi nie będą mówiły i tak będę je analizował "po kawałeczku".

    Znajdź bibliotekę obsługi 1-Wire. - Do DS18B20 trochę znalazłem, ale mam działające kody (choć jak piszesz) mocno ograniczone , tylko do odczytu temperatury. Dla DS1990A czy TM1990 jakoś nic konkretnego nie znalazłem i stąd ten cały temat. Poza tym jak pisałeś czasami tak te biblioteki są "przekombinowane i różnie działające", że coś z nich się nauczyć to ciężki orzech...

    Jak czujesz nieodpartą chęć rzeźbić bibliotekę od nowa samemu to oscyloskop i rejestrator (np SaleAE) jest w zasadzie niezbędny. - Jakoś nigdy nie zetknąłem się z tematem, ale po powyższym poście przeglądałem All....o i jakaś chyba podróbka, za ok 37zł, 8 kanałowa, 24MHz, analizująca nawet 1-wire, I2C itp wraz z linkiem do ściągnięcia programu sterującego, była. Ktoś ma coś takiego, używa jakieś sugestie warto czy szkoda nerwów .... ? Bo temat mnie zaciekawił a i z powyższych postów wynika , ze to bardzo duża pomoc w takich programach.
  • #16 16620954
    Eagle
    Poziom 24  
    Cytat:
    jakaś chyba podróbka, za ok 37zł, 8 kanałowa, 24MHz, analizująca nawet 1-wire, I2C itp wraz z linkiem do ściągnięcia programu sterującego, była. Ktoś ma coś takiego, używa jakieś sugestie warto czy szkoda nerwów .... ?


    Polecam, największy plus tego analizatora, po za jego ceną, jest że możesz zebrać log z kilkudziesięciu sekund i więcej. Mam oscyloskop z pamięcią, ale od wyzwolenia do końca pamięci max jest 2 sek. Przy tym analizatorze, odpalam zbieranie próbek i bezstresowo odpalam komunikację. A dodatkowo analiza komunikacji, jeśli czegoś nie ma i wprawisz się w pisaniu, możesz dopisać swój analizator.
  • #17 16621026
    Konto nie istnieje
    Konto nie istnieje  
  • #18 16632376
    Sławek-K
    Poziom 15  
    Po kilku błędach i problemach udało się uruchomić komunikację z pastylkami. (Kod całościowy zamieszczę później). Analizator zamówiony, czekam na paczkę i pierwsze "próby".
    "Drążąc" dalej ten temat napotkałem pewien problem. Chodzi o obliczanie sumy kontrolnej CRC. Wartość oczywiście jest wypalona laserem na pastylce, ale proszę Was o wytłumaczenie "po chłopsku == łopatologicznie" jak wyliczyć crc z otrzymanych przeze mnie danych z pastylki i porównać z crc odczytanym. Poniżej wstawiam mój fragment kodu. Dodam , że przejrzałem kilka kodów, dokumentację DS1990A i TM1990A i jakoś nie mogę do końca pojąć. Wzór z dokumentacji (crc=x8+x5+x4+1) jakoś mi nic nie mówi. :)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #19 16632415
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA