Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AVR - 1-Wire slave w IRQ w trybie overdrive

Mikroprocesorowiec 27 Gru 2016 17:04 3045 63
  • #1 27 Gru 2016 17:04
    Mikroprocesorowiec
    Poziom 11  

    Wzorując się na artykule z Ep (załącznik) zrobiłem obsługę slave 1-Wire bez użycia przerwań. Autor artykułu program wyssał z palca. Badania oscyloskopem wykazują, ze procedury nie wyrabiają sie w IRQ. Nie mają prawa działać bo np bajty dekodowane są w odwrotnej kolejności (MSB zamienione z LSB). Program nie da się nawet skompilować, bo raz jest użyte odwołanie WIRE1_RESET innym razem RESET_1WIRE a definicja jest jedna. Czy da się zrobić na przerwaniach obsługę 1-Wire na IRQ na AVR z zegarem 14,7456MHz? O trybie overdrive nie marzę, wystarczy standardowa prędkość.

    PS
    Autor artykułu jeszcze mi nie odpisał.

    0 29
  • #2 27 Gru 2016 17:46
    tmf
    Moderator Mikrokontrolery Projektowanie

    A dlaczeog miałoby się nie dać zrobić? Kiedyś robiłem 1-wire slave przy zegarze 1,2 MHz (ATtiny13) i działało, więc przy prawie 15 MHz tym bardziej procesor się wyrobi. Jeśli modyfikowałeś kod autora to może błędy wynikały z modyfikacji, które wprowadziłeś?
    Trudno analizować program z artykułu, bo to jakieś wyrwane z kontekstu fragmenty. Pokaż własny program.

    0
  • #3 27 Gru 2016 19:50
    Eagle
    Poziom 23  

    Mikroprocesorowiec napisał:
    Program nie da się nawet skompilować, bo raz jest użyte odwołanie WIRE1_RESET innym razem RESET_1WIRE a definicja jest jedna.


    Czy oprócz tego pdf są do pobrania jeszcze jakieś źródła, bo w tym pdf nie ma użycia ani definicji WIRE1_RESET ?

    0
  • #4 05 Sty 2017 01:28
    22053
    Użytkownik usunął konto  
  • #5 05 Sty 2017 09:12
    tmf
    Moderator Mikrokontrolery Projektowanie

    W ten sposób wiążesz zmienną z rejestrem. W tym przypadku każde odwołanie do counter będzie wiązało się z operacją na R3. Przyporządkowanie jest globalne, nie da się go ograniczyć do funkcji. Zresztą nie miałoby to sensu.

    0
  • #6 05 Sty 2017 11:51
    2675900
    Użytkownik usunął konto  
  • #7 05 Sty 2017 12:20
    22053
    Użytkownik usunął konto  
  • #8 05 Sty 2017 12:32
    2675900
    Użytkownik usunął konto  
  • #9 05 Sty 2017 12:46
    tmf
    Moderator Mikrokontrolery Projektowanie

    R-MIK napisał:
    Piotrus_999 napisał:
    R-MIK napisał:
    register unsigned char counter asm("r3");
    Ale jak wskazać kompilatorowi aby używał zarezerwowanych rejestrów w konkretnej funkcji?


    Zresztą metoda bardzo zła bo ogranicza kompilatorowi ilość dostępnych rejestrów, a problemem jest fatalnej jakości kod. Żadne mikro optymalizaje tu nie pomogą. Należy napisać, albo znaleźć porządny kod.

    Proszę o cudowny kod który nie używa zmiennych, bo operacje na nich są wykonywane w praktyce na rejestrach a trzeba je zachowac na stosie w czasie obsługi IRQ. Obsługa IRQ to spora ilość push i pop z tego właśnie powodu. Operacje te zajmują push (3,5us), pop tyleż samo.

    No to czekam na kod obsługujący 1-Wire slawe w IRQ w trybie overdrive na AVR 16MHz (najlepiej 14,7456MHz).


    Przecież odkładane są tylko te rejestry, które są w IRQ używane. Wrzucenie zmiennej do rejestru to w najlepszym razie oszczędność dwóch taktów, typowo nic, jeśli w IRQ masz więcej zmiennych/operacji. Natomiast taki rejestr jest wyłączony z użycia w całym kodzie, w efekcie kompilator ma trudniej go optymalizować.
    Obsługa slave na 16 MHz to naprawdę banał. Jak pisałem robiłem to na ATTiny, przy 1,2 MHz i to już było pewnym wyzwaniem. M.in. trzeba było stosować tricki z przechowywaniem kolejnego bitu we fladze T rejestru stanu, bo prakowało cykli na pobranie i wyłuskanie bitu. Zreszą zauważ, że krytyczne dla slave 1-wire jest tylko wystawienie odpowiednio szybko stanu bitu w odpowiedzi na niski poziom mastera. Powiedzmy, że masz na to 3,5-4,5 us, a to przy 16 MHz przekłada się na 56-72 instrukcje. To wystarczy, żeby odłożyć wszystkie rejestry MCU na stos dwukrotnie :)

    0
  • #10 05 Sty 2017 12:52
    22053
    Użytkownik usunął konto  
  • #11 05 Sty 2017 13:00
    tmf
    Moderator Mikrokontrolery Projektowanie

    R-MIK napisał:
    Piotrus_999 napisał:
    R-MIK napisał:
    Proszę o cudowny kod który nie używa zmiennych, bo operacje na nich są wykonywane w praktyce na rejestrach a trzeba je zachowac na stosie w czasie obsługi IRQ ..... Operacje te zajmują push (3,5us), pop tyleż samo.


    push i pop 2 cykle zegara czyli przy 16MHz - 0.13us.

    Czyli według ciebie IRQ odkłada na stos jeden rejestr? Na to cię zmartwię, tych rejestrów jest 20. same push i pop oraz dwie operacje na R0 zajmują blisko 3us a na całe IRQ mam 7us. Tak sie składa, że czas wykonywania funkcji mimo że wywoływane w niej inne funkcje są inline zajmują trochę czasu, o jakieś 2us za dużo. Należy też pamiętać, że wejście w IRQ to odłożenie adresu powrotu na stosie, no i reti też zajmuje czas. Mam zegar 14,7456MHz, próbuje przetaktować mikrokontroler (zasilany z prawie 5V) na 18,432 a jak się uda to i na 22,1184. To rozwiąże problem. Projekt nie jest komercyjny, więc przetaktowanie wchodzi w grę.


    Jeśli jest tak jak piszesz to masz poważnie skopany kod - pokaż go. Kolejna sprawa - szybko musisz wystawić tylko stan pinu, cała obsługa IRQ może być znacznie dłuższa, byle się skończyła przed odpytaniem o kolejny bit, a to są dziesiątki us.

    0
  • #12 05 Sty 2017 13:03
    22053
    Użytkownik usunął konto  
  • #13 05 Sty 2017 13:14
    2675900
    Użytkownik usunął konto  
  • #14 05 Sty 2017 13:33
    tmf
    Moderator Mikrokontrolery Projektowanie

    R-MIK napisał:
    tmf napisał:
    (...) zauważ, że krytyczne dla slave 1-wire jest tylko wystawienie odpowiednio szybko stanu bitu w odpowiedzi na niski poziom mastera. Powiedzmy, że masz na to 3,5-4,5 us, a to przy 16 MHz przekłada się na 56-72 instrukcje. To wystarczy, żeby odłożyć wszystkie rejestry MCU na stos dwukrotnie :)

    Nie tylko. Zależy co jest masterem. Jeśli master jest programowy, tachlujący IO to ok, jeśli sprzętowy to po wysłaniu bitu czas poziomu wysokiego jest krótki. Kod dla slawe (Roberta Wołgajewa z EP) działa bo:
    - próbkę bitu pobiera o 6 us za późno ale bit trwa 61us więc działa
    - bardzo często wychodzi z przerwania gdy już zaczął się kolejny bit, ale flaga IRQ jest kasowana sprzętowo po wejściu w IRQ i mikrokontroler wygeneruje kolejne IRQ. Program pobierze próbkę za późno, ale jak juz napisałem działa bo...
    Niestety w overdrive nie można tak zrobić.


    Nie twierdzę, że ten kod jest dobry. Tylko, że przy 14 MHz masz aż nadto czasu, aby bez problemu zaimplementować slave, bez zastanawiania się ile i co okdkłada na stos mikrokontroler.

    0
  • #15 05 Sty 2017 15:51
    373522
    Użytkownik usunął konto  
  • #16 05 Sty 2017 16:03
    22053
    Użytkownik usunął konto  
  • #17 05 Sty 2017 16:07
    373522
    Użytkownik usunął konto  
  • #18 05 Sty 2017 16:21
    JarekC
    Poziom 27  

    Witam,

    Na ATTINY2313 kwarc 8MHz popełniłem układ który realizował:
    - jeden port 1-Wire Master
    - dwa porty 1-Wire Slave
    - jeden port UART który przekazywał dane do drugiego ATTINY2313 z dwoma dodatkowymi portami 1-Wire Slave.

    Ogólnie chodziło o to aby z jednego urządzenia 1-Wire (SLAVE) przekazać dane do 4 urządzeń 1-Wire Master

    Całość napisana w ASM.
    Działa bez problemu.

    Pozdrawiam
    JarekC

    0
  • #19 05 Sty 2017 16:26
    22053
    Użytkownik usunął konto  
  • #20 05 Sty 2017 16:26
    2675900
    Użytkownik usunął konto  
  • #21 05 Sty 2017 16:40
    22053
    Użytkownik usunął konto  
  • #22 05 Sty 2017 16:40
    tmf
    Moderator Mikrokontrolery Projektowanie

    R-MIK napisał:
    Piotrus_999 napisał:
    A wiesz o tym że nie możesz oferować żadnych slave urządzeń czy rozwiazań bez kupienia licencji? Z tego wynika właśnie brak w handlu driverów do slave urządzeń.

    Ja tego nie będę sprzedawał a osobiście do prób mi się przyda.


    Coś kręcisz. Raz piszesz:
    R-MIK napisał:
    Robię między innymi emulator DS2431. I co mam napisać, że zgodność 50%? Ze działa ale bez overdrive?

    a potem, ze na własne potrzeby...
    Ale nieważne. Jak pisałem, nie ma najmniejszego problemu, aby przy zegarze 14 MHz uzyskać czas odpowiedzi na poziomie 1 us. Sprzęt też można wykorzystać - np. UART do generowania impulsu ujemnego o pożądanym czasie. Pokaż w końcu ten kod, bo na razie przez kilkanaście postów jest jałowa dyskusja, gdzie ty narzekasz, nawet nie wiadomo na co, a kolejne osoby piszą, że bez problemu zrealizowały to co najwyraźniej chcesz zrobić.

    0
  • #23 05 Sty 2017 18:00
    2675900
    Użytkownik usunął konto  
  • #24 05 Sty 2017 18:51
    22053
    Użytkownik usunął konto  
  • #25 05 Sty 2017 19:18
    2675900
    Użytkownik usunął konto  
  • #26 05 Sty 2017 19:35
    22053
    Użytkownik usunął konto  
  • #27 05 Sty 2017 19:39
    tmf
    Moderator Mikrokontrolery Projektowanie

    Piotrus_999 napisał:
    Hehehe - Maxim nawet emulatorów R&D nie pozwala robić. Kolega niveasoft też już się przyznał do winy :). Jak znajdę to pokaże Wam emaila (skan dokumentu z podpisem) grożący mi strasznymi konsekwencjami prawnymi jak nie zaprzestanę naruszać prawa i nie zniszczę wszystkich kodów i prototypów :). A tylko napisałem e-maila do supportu z pytaniem technicznym. Na pytanie o licencję odpowiedziałem że nie mam, no i dostałem pismo z kancelarii prawnej.


    Wrzuć to co ci wysłali, z ciekawości bym zobaczył.
    Z drugiej strony sobie poszperałem, okazuje się, że patent na 1-wire został przyznany 11 Maja 1993 roku. Ponieważ w USA przed 1995, patenty były ważne przez 17 lat, a po tej dacie przez 20 lat, to tak, czy siak wychodzi, że patent jest już nieważny. Czyli można sobie slave robić ile się chce. Z drugiej strony, mają zgłoszone jakieś patenty pochodne, więc być może pewne elementy są ciągle chronione. Ale już nie sam protokół 1-wire.
    Patent - One-wire bus architecture, nr US 5210846 A - 1993
    Pochodne - Method for data communication - US 5398326 A - 1995
    Jezcze ważne:
    - Command/data transfer protocol for one-wire-bus architecture US 5809518 A - 15 września 1998
    - Systems and methods to convert signals multiplexed on a single wire to three wire US 5809519 A - 15 września 1998
    - Single wire communication system US 5864872 A - 26 Sty 1999
    - Electrostatic discharge protection systems and methods for electronic tokens US 5920096 A - 6 Lip 1999
    - Metal token having units of value stored therein using a single wire communication method US 5974504 A - 26 Paź 1999
    - Single wire data communication method US 6108751 A - 22 Sie 2000

    Widać, że trzeba sprawdzić co jeszcze jest chronione patentem, a jakie elementy już nie.

    1
  • #28 05 Sty 2017 20:02
    2675900
    Użytkownik usunął konto  
  • #29 06 Sty 2017 10:44
    22053
    Użytkownik usunął konto  
  • #30 06 Sty 2017 11:08
    2675900
    Użytkownik usunął konto