Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

Sławek-K 27 Lip 2017 20:00 1038 18
  • #1 27 Lip 2017 20:00
    Sławek-K
    Poziom 14  

    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
    Zaloguj się, aby zobaczyć kod

  • #2 27 Lip 2017 20:55
    tmf
    Moderator Mikrokontrolery Projektowanie

    Ś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.

  • #4 27 Lip 2017 21:15
    Eagle
    Poziom 23  

    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 27 Lip 2017 21:19
    tmf
    Moderator Mikrokontrolery Projektowanie

    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 27 Lip 2017 21:36
    Eagle
    Poziom 23  

    Fakt, nie 11us, a 3x200us, co i tak jest różne od deklarowanego w specyfikacji.

  • #7 27 Lip 2017 21:44
    tmf
    Moderator Mikrokontrolery Projektowanie

    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 27 Lip 2017 21:47
    Eagle
    Poziom 23  

    Kod: 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 27 Lip 2017 22:52
    R-MIK
    Poziom 37  

    tmf napisał:
    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.

    Jak pamiętam jest podany - 960us. W pewnych sytuacjach może być przeciągnięty do 3,8ms.

    Co do czasu minimalnego, to Dallas (MAxim) napisał, że 480us ale w przypadku niektórych układów w nocie jest napisane, że dany układ wymaga min 660us. Ciekawe dlaczego, skoro np DS2482 generuje tylko około 500us.

    Dodano po 5 [minuty]:

    Eagle napisał:
    Kod: 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.


    Faktycznie tych 1<7 zamiast jak się można domyśleć 1<<7 jest kilka.

  • #10 28 Lip 2017 06:57
    Sławek-K
    Poziom 14  

    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 28 Lip 2017 07:29
    Eagle
    Poziom 23  

    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
    Zaloguj się, aby zobaczyć kod

    po przekształceniu daje :
    Kod: 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
    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
    Zaloguj się, aby zobaczyć kod

  • #12 28 Lip 2017 07:47
    R-MIK
    Poziom 37  

    Sławek-K napisał:
    70us też "pożyczyłem" z innego kodu. Tam było 65us i działało (u mnie żaden z wymienionych nie sprawdził się) .

    Wiele kodów mastera dostępnych w sieci działa z przypadku (u autora). Zanim coś zapożyczysz sprawdź w nocie jakie powinny byc czasy. W nocie układu, którego użyłeś:
    ATmega64 + TM1990A (pastylka 1-wire odpow. DS1990A)
    Masz narysowane (nie trzeba znać angielskiego), że po wygenerowaniu resetu wystawiasz stan wysoki, trwający od 15 do 65us. Ty dałeś 70. Dlaczego? Przypuśćmy, że zadziałało opoprawnie. Podłączysz inny układ, mnioej restrykcyjny i okaże się, źe nie działa. Długo możesz szukać przyczyny. Ponadto, po wygenerowaniu resetu i wygenerowaniu poziomu wysokiego, sprawdź czy magistrala przyjęła poziom wysoki. Max czas oczekiwania to 3,8ms. Dalej, impuls presence będzie trwał od 60 do 240us. Musisz więc czekać, aż magistrala zmieni stan z wysokiego na niski, nie dłużej niż 240us.

    Piszesz, że raczkujesz w C. Nie wiem dlaczego wyważasz otwarte drzwi. Znajdź biblioteke obsługi 1-Wire. Zdefiniujesz tylko PIny IO i po problemie. Później sprawdź czy biblioteka działa według zaleceń producenta i nanieś poprawki.
    Np 90% bibliotek obsługi DS18B20 czyta tylko 2 bajty (TH i TL) nie odczytując pozostałych przez co nie jest sprawdzana CRC. U autora,, na stole, wszystko działa jak należy. W realnych warunkach bywa różnie.

    Jak nie chcesz walczyć a protokołem 1-Wire, użyj DS248x i po problemie.

    Jak czujesz nieodpartą chęć rzeźbić bibliotekę od nowa samemu to oscyloskop i rejestrator (np SaleAE) jest w zasadzie niezbędny.

  • #13 31 Lip 2017 07:10
    Sławek-K
    Poziom 14  

    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
    Zaloguj się, aby zobaczyć kod

  • #14 31 Lip 2017 07:28
    R-MIK
    Poziom 37  

    Dobra rada, nie używaj zapisu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    tylko zdefiniuj sobie port i wyprowadzenie i używaj:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a jeszcze czytelniej:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Za chwilę kod rozrośnie się, będziesz chciał zmienić nr pinu i będziesz miał dużo roboty, w której o pomyłkę łatwo.
    Oczywiście nadal uważam, że wyważasz otwarte drzwi, bo jeśli chodzi o konstrukcję:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    To nie wiem co dalej zamierzasz, ale w przypadku symulowanego OC (1-Wire, programowe IIC) wystarczy:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    i
    Kod: c
    Zaloguj się, aby zobaczyć kod

    bo port, po resecie ma ustawione zero. Dla pewności mozna przy inicie 1W ustawić tam zero.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ja osobiście steruję zarówno rejestrem kierunku jak i portem, powody są dwa:
    - Przy pracy jako wejście włączam podciąganie. Nie wystarcza ono do pracy układów zasilanych pasożytniczo, ale nie mam "zawieszania sie programu" gdy rezystor podciągający jest niedolutowany. W takiej sytuacji magistrala pracuje poprawnie z urzadzeniami z własnym zasilanieniem, ale nie to jest najistotniejsze.
    - realizuję silne podciąganie po wysyłaniu "1". Taki tryb pracy mają mastery DS248x. Dzięki temu można realizować szykie transmisje na długich magistralach czy z dużą liczbą urzadzeń.

    Dalej. Masz takie "cóś":
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dlaczego 100 skoro w nocie napisali 15..65? Dajesz 100, będą włączone IRQ dojdzie jeszcze np 15 czy 50us. I co? napisałeś działają do 145. 100+50, ile daje? Nie trzymasz się wytycznych producenta, prosisz się o kłopoty. Załóżmy, że nie używasz IRQ, producent pisze max 65, sprawdziłeś doświadczalnie, że 100 je ok. Ile rodzin układów sprawdziłeś? Powidzmy, że wszystkie, przebadałeś łącznie 100000szt. Przebadałeś układy, których jeszcze nie wyprodukowano?
    Akurat w przypadku poziomu H po reset na ten problem się nie napotkasz ale przy innych krytycznych operacjach może być inaczej.

    Dlaczego tu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    dwie zmienne? ystarczyła by jedna, ale nie potrzeba żadnych, bo:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    można zapisać tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a oszczędniej:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Piszesz jak w Bascom-ie.


    Co do "wyważania otwartych drzwi". Namęczyłeś się z presence i pewnie nie będzie działać wysłanie komendy. Nie używasz oscyloskopu czy rejestratora więc nie zobaczysz tego. Po presence nie czekasz, aż magistrala osiągnie "1" w czasie nie dłuższym niż 240us. Pewnie zaraz po twoim "wykryciu" presence zaczniesz wysyłać komendę a presence jeszcze trwa. Domyślasz się co bedzie.

    W czasie, który poświeciłeś na reset i presence (nie do końca poprawnie) dawno być wypróbował ze 3 biblioteki z netu, łącznie z odczytem nr rom a kto wie czy nawet nie search rom.


    PS
    Rezystor podciągający pewnie 4k7?

  • #15 02 Sie 2017 07:49
    Sławek-K
    Poziom 14  

    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 02 Sie 2017 09:14
    Eagle
    Poziom 23  

    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 02 Sie 2017 10:12
    R-MIK
    Poziom 37  

    Sławek-K napisał:
    Zostawiłem rezystor podciągający 2,2k.

    Dobry wybór. Dla niektórych układów (np eeprom) zalecana jest taka właśnie wartość.

    Sławek-K napisał:

    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ą.


    Sławek-K napisał:

    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".

    Kwestia gustu. Można i jeden rozkaz w jednej linii jak w Basic Cobry!. Ja, jak mam długą funkcję to często używam zapisu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jak powtarzam to wiele razy to kod jest czytelniejszy niż setki deklaracji na początku funkcji no i widzę jakiego typu jest zmienna w petli i nie mam warunku "x<300;" jeśli zadeklarowałem zmienną char. Od razu to widać.

    Sławek-K napisał:

    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

    ???
    Skoro masz dla DS18B20 to i niejako automatycznie masz dla DS1990 albo ja czegoś nie kumam.

    Sławek-K napisał:

    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 .... ?

    Bardzo dobre narzędzie. Analiza protokołów jest bardzo przydatna. Używałem tego dla 1-Wire, DMX, IIC (FT201), SPI (FT22x, SC16IS7xx). Bez tego projekt realizowałbym nie miesiąc a kilka lat.


    PS
    Używaj cytatów. O wiele łatwiej się wtedy czyta.

    Dodano po 20 [minuty]:

    [quote="Eagle"]
    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.[/quote
    No i analizuje dużo protokołów i nawet oryginał jest w tym wypadku tani. Np oryginalny SaleAE to ok 1400zł i analizuje ok 30 protokołów. Analiza IIC, RS232C, i SPI do taniego (1000zł) oscyloskopu to wydatek 900zł!

  • #18 09 Sie 2017 07:15
    Sławek-K
    Poziom 14  

    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
    Zaloguj się, aby zobaczyć kod

  • #19 09 Sie 2017 08:10
    R-MIK
    Poziom 37  

    Sławek-K napisał:
    Wzór z dokumentacji (crc=x8+x5+x4+1) jakoś mi nic nie mówi. :)

    Czyli znów chcesz wyważać otwarte drzwi. Ja bym wyciął kod z jakiejs biblioteki obsługujące 1-Wire. W bibliotekach Avr-Gcc jest funkcja licząca CRC (nie tylko 1-Wire, także CRC16 i inne) w ASM. Ale jak chcesz się doktoryzować, twoja sprawa. Może zacznij budować mikrokontrolery z pojedynczych tranzystorów? Albo weź wiadro piachu i zrób sobie sam tranzystory.

    Tyle czasu co ty poświeciłeś na ten kawałek kodu, to jak robiłem emulator DS2341, 18B20, 1990 emulujący wszystkie funkcje i wszystkie prędkości.

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME