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.

ATtiny - jak dlugo trwa zmiana bitu na Portach ?

JohnCTN 09 Maj 2015 16:40 1266 20
  • #1 09 Maj 2015 16:40
    JohnCTN
    Poziom 17  

    Witam

    Mam pytanie odnośnie czasu przełączania bitów na portach ATtiny24a
    Do ATtiny24 podpiąłem kwarc 20MHz w takim układzie 1 takt trwa 50ns



    interesuje mnie czas trwania stanu wysokiego na bitach PortuA, gdybym napisał taką procedurę:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    No i najważniejsze czy jest jeszcze jakieś opóźnienie pomiędzy wykonaniem instrukcji a fizycznym ustawieniem bitu na nóżce układu ?

    0 20
  • #2 09 Maj 2015 18:56
    BlueDraco
    Specjalista - Mikrokontrolery

    Napisz taką procedurę i zmierz oscyloskopem.

    0
  • #3 09 Maj 2015 18:59
    kuuczoo
    Poziom 26  

    A tak trudno zajrzeć do dtrki procesora i sprawdzić ile cykli potrzeba na wykonanie instrukcji out?

    0
  • #4 09 Maj 2015 19:21
    JohnCTN
    Poziom 17  

    znam czas wykonania rozkazów w taktach, wiem, ze przy częstotliwości 20MHz takt wynosi 50ns. Tyle to mogę sobie policzyć, chodzi mi o to czy faktycznie po wykonaniu instrukcji od razu mamy odpowiedni stan na nóżce układu czy jest jakieś jeszcze opóźnienie. Co do oscyloskopu... trzeba go posiadać a aby znać dokładnie czas trwania to musi być raczej cyfrowy najlepiej z analizatorem stanów logicznych .


    Jeżeli chodzi o przykład... to stan wysoki powinien trwać w okolicach 50ns ... ale czy tak jest w rzeczywistości ?


    co do mojego problemu to ogólnie chodzi o to, ze muszę sprawdzać 4 bity w porcieA i jak wystąpi gdzieś stan 0 to musze ustawić stan niski na pozostałych 4 bitach portuA na powiedzmy minimum 100ns a następnie znów podnieść nóżkę w stan wysoki.
    Problem polega na tym, ze musze się ze wszystkim zmieścić w okolicy 450ns, bo impuls który odczytuje na porcieA trwa około 500ns

    większy problem mam z pętla sprawdzającą, ponieważ trwa 200ns i nie wiadomo w jakiej chwili nastąpiło wykrycie niskiego stanu logicznego (a mogło to nastąpić przykładowo 190ns wcześniej.

    napisałem taką oto procedurę , która moim zdaniem jest maksymalnie skrócona czasowo, ale nie daje to gwarancji , ze się wyrobie :-( no i do tego pozostaje właśnie ten czas opóźnienia pomiędzy wykonaniem instrukcji "out" a ukazaniem się odpowiedniego stanu na nóżce układu.

    procedura wygląda tak, może ktoś potrafi ją jeszcze skrócić:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #5 09 Maj 2015 19:23
    94075
    Użytkownik usunął konto  
  • #6 09 Maj 2015 20:44
    atom1477
    Poziom 43  

    JohnCTN napisał:
    znam czas wykonania rozkazów w taktach, wiem, ze przy częstotliwości 20MHz takt wynosi 50ns. Tyle to mogę sobie policzyć, chodzi mi o to czy faktycznie po wykonaniu instrukcji od razu mamy odpowiedni stan na nóżce układu czy jest jakieś jeszcze opóźnienie. Co do oscyloskopu... trzeba go posiadać a aby znać dokładnie czas trwania to musi być raczej cyfrowy najlepiej z analizatorem stanów logicznych .

    Jeżeli chodzi o opóźnienie to nie ma ono znaczenia jeżeli chodzi o uzyskanie odpowiedniego czasu trwania impulsu.
    Out wystawiające stan 1 wprowadzi takie samo opóźnienie jak out wystawiające stan 0.
    Tak więc opóźnienia skompensują się i czas trwania impulsu będzie tak sam jak czas trwania wykonywania się jednej instrukcji out.
    Co innego jak chcesz odczytywać a następnie zapisywać stan. Tu opóźnienia się dodadzą i zapewnienie krótkiego czasu będzie trudne.
    Kiedyś miałem za zadanie dosynchronizować się do stanu linii z dokładnością do 1 cyklu i było to trudne bo przerwanie obsługiwane było z opóźnieniem zależnym od aktualnie wykonywanej instrukcji w programie głównym (a ta mogła zajmować do 4 instrukcji).
    Sprawdzanie za pomocą poolingu też nie wchodziło w grę bo odczyt plus sprawdzenie to co najmniej ze 3 cykle (musiała to by być pętla czekająca na określony stan).
    Rozwiązałem to robiąc kolejne odczyty portu do rejestrów w momencie gdzie mniej więcej się spodziewałem impulsu (bez sprawdzania zawartości portu, jedynie zapisy do rejestrów).
    A sprawdzanie było później (już tylko zawartości rejestrów).
    Tym sposobem oraz dodając kilka nopów udało się uzyskać kod docierający do określonego miejsca w programie zawsze dokładnie powiedzmy 20 cykli po wystąpieniu impulsu.
    Piszę o tym żeby powiedzieć że się da.
    Ale w Twoim przypadku bym się zastanowił czy się tego nie da rozwiązać sprzętowo. Bo dzisiaj mamy dużo bardziej rozbudowane peryferia w prockach.

    0
  • #7 09 Maj 2015 22:06
    JohnCTN
    Poziom 17  

    W moim wypadku nadejście impulsów na 4 wejściach jest nieokreślone (impulsy są wysyłane z innego sprzętu)

    Problem jaki mam... to tylko czas...bo muszę jak najszybciej wykryć wystąpienie stanu niskiego na 4 starszych bitach portuA i wystawienie stanu niskiego na młodszych 4 bitach tego samego portu.

    Można zapytać dlaczego tak dziwnie. Wiec powiem, ze na początku był plan aby w zależności od tego na którym bicie wystąpił stan niski to z tablicy odczytuje wartość, która wysyłam na pozostałe 4 bity.

    Ponieważ nie ma na to czasu, to musiałem zmienić pomysł na mniej skomplikowany.

    tak więc odczytuje 4 starsze bity portuA i niezależnie od tego, który bit jest w stanie niskim to wystawiam stan niski na pozostałych 4 młodszych bitach wyjściowych portuA.

    chodzi o to, ze sygnały które przyjmuje to sygnały !CS, który trwa 500ns po tym czasie przechodzi w stan wysoki. A moim zadaniem jest wystawić sygnał IOW

    chciałem to zrobić na ATtiny24a teraz się zastanawiam czy nie przetaktować ATtiny24a z 20MHz na 25Mhz (zyskałbym 10ns na takcie)

    Pytanie :

    Czy można napisać szybszą procedurę sprawdzającą bity portuA niż 200ns ?

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #8 09 Maj 2015 23:10
    94075
    Użytkownik usunął konto  
  • #9 09 Maj 2015 23:35
    trol.six
    Poziom 30  

    JohnCTN napisał:
    W moim wypadku nadejście impulsów na 4 wejściach jest nieokreślone (impulsy są wysyłane z innego sprzętu)

    Problem jaki mam... to tylko czas...bo muszę jak najszybciej wykryć wystąpienie stanu niskiego na 4 starszych bitach portuA i wystawienie stanu niskiego na młodszych 4 bitach tego samego portu.

    Można zapytać dlaczego tak dziwnie. Wiec powiem, ze na początku był plan aby w zależności od tego na którym bicie wystąpił stan niski to z tablicy odczytuje wartość, która wysyłam na pozostałe 4 bity.

    Ponieważ nie ma na to czasu, to musiałem zmienić pomysł na mniej skomplikowany.

    tak więc odczytuje 4 starsze bity portuA i niezależnie od tego, który bit jest w stanie niskim to wystawiam stan niski na pozostałych 4 młodszych bitach wyjściowych portuA.

    chodzi o to, ze sygnały które przyjmuje to sygnały !CS, który trwa 500ns po tym czasie przechodzi w stan wysoki. A moim zadaniem jest wystawić sygnał IOW

    chciałem to zrobić na ATtiny24a teraz się zastanawiam czy nie przetaktować ATtiny24a z 20MHz na 25Mhz (zyskałbym 10ns na takcie)

    Pytanie :

    Czy można napisać szybszą procedurę sprawdzającą bity portuA niż 200ns ?

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Jak będzie zero podczas cpi, to najdłuższy czas to 7 cykli z ustawieniem portu
    biorąc pod uwage ustawienie i czas wyjścia to wyjdzie sporawo
    Trzebaby potestować czy zadziała.

    Może tak z 30MHZ? ;)

    może to zadziała, tak samo czasochłonne ale z wyborem
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Gdyby zamienić porty mniej znaczacych (0-3) z innym portem i je zewnetrznie wyzerowac,
    można się pozbyc andi
    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Tak poza tym, jak już nadmieniono, pamięć czy też układ cyfowy z bramkami zrobi to szybciej ;)
    Nawet komparator LM311 150-200ns.

    0
  • #10 10 Maj 2015 10:40
    dondu
    Moderator Mikrokontrolery Projektowanie

    Pamięć SRAM lub FLASH z równoległym adresowaniem to czas dostępu rzędu 45-70ns za około 4zł.
    Np. FLASH 39VF020-70CNHE - 16 wejść adresowych - 8 wyjść danych - 70ns

    0
  • #11 10 Maj 2015 11:16
    JohnCTN
    Poziom 17  

    Nie do końca wiem jak pamięć flasch mogłaby mi pomoc.... ale zakładam, ze nie do końca wyjaśniłem do czego ja to wszystko potrzebuję.

    Tak więc wyjaśniam.

    Potrzebuję wygenerować sygnał !IOW, którego nie mam w systemie a jest mi potrzebny. Jedyny sposób jaki mi wpadł do głowy to wygenerowanie go za pomocą ATtiny24a. Zasada jest prosta, ATtiny na 4 bitach portuA (bity4:7) sprawdza czy pokazał się stan niski (wszystkie te sygnały wejściowe to są !CS jak wykryje stan niski na którymkolwiek wejściu to ustawia stan niski na tym samym porcie na młodszych bitach (bity 0:3). Wiec sygnał , który ja chce generować to !IOW i musi się pokazać wg noty minimum 25ns od zbocza opadającego na nóżce !CS. To mi się udaje uzyskać na ATtiny - ponieważ ustawiam sygnał !IOW minimum 200ns później niż się pojawił stan niski na !CS. Problem mam aby po upływie 100ns podnieść !IOW w stan wysoki minimum 25ns przed tym jak nastąpi zbocze narastające na sygnale !CS.

    Oczywiście jak wcześniej liczyliśmy, powinienem się wyrobić pod warunkiem, ze ATTiny24a wykryje zawsze opadające zbocze w chwili jego pojawienia się.
    A ponieważ pętla sprawdzająca czy jest stan niski na wejściach !CS trwa 200ns
    to zawsze istnieje to dodatkowe opóźnienie w wykryciu tego stanu !CS.

    Więc w najgorszym wypadku ATtiny24a wykryje stan niski po upływie 200ns, sama procedura zmiany stanu trwa dodatkowe 200ns co już nam daje 400ns i czas trwania stanu niskiego na !IOW trwa 2 takty ATtiny24a wiec dodatkowe 100ns i mamy w sumie 500ns. A sygnał wejściowy !CS właśnie trwa 500ns
    Więc nie w najbardziej nie dogodnym wypadku nie ma szans abym podniósł sygnał !IOW minimum 25ns przed podnoszącym zboczem sygnału !CS.
    Poniżej diagram:

    ATtiny - jak dlugo trwa zmiana bitu na Portach ?

    Może teraz będzie wszystko jasne :-D
    Może ktoś będzie miał inny sposób jak generować !IOW

    0
  • #13 10 Maj 2015 12:24
    trol.six
    Poziom 30  

    Przecież nawet na bramkach różnych można te impulsy wygenerować, choć ma kolega dość specyficzne wymagania. Albo użyć cpld.

    To kolega się upiera na attiny. :)

    dondu: a wiesz może co konkretnie można kupić?
    Bo producenci oferują wiele fajnych rzeczy a jak przychodzi do zakupów, to różnie to bywa. ;)

    0
  • #14 10 Maj 2015 12:29
    dondu
    Moderator Mikrokontrolery Projektowanie

    trol.six napisał:
    To kolega się upiera na attiny. :)

    PIC podałem jako przykład - może ATmel także takowe posiada.

    trol.six napisał:
    dondu: a wiesz może co konkretnie można kupić?
    Bo producenci oferują wiele fajnych rzeczy a jak przychodzi do zakupów, to różnie to bywa. ;)

    Akurat ten PIC10F320 można kupić w TME za 1,80zł + VAT.

    0
  • #15 10 Maj 2015 12:54
    JohnCTN
    Poziom 17  

    Nie upieram się na ATtiny (szczerze mówiąc już go wylutowałem z układu i trochę zmieniłem koncepcje.

    Co do bramek... musiałbym ich trochę użyć aby uzyskać odpowiednie opóźnienia ... dziś czas pomiędzy in a out to zaledwie 4ns.

    Natomiast jeżeli chodzi o układy z programowalna logiką, nawet nie wiedziałem, ze cos takiego istnieje :-) rozumiem, ze się programuje w tym PICu odpowiednie rejestry aby później układ sam reagował na sygnał wejściowy i odpowiednio ustawiał sygnał wyjściowy. PIC po napisaniu procedury inicjującej swoje rejestry może wykonać rozkaz:

    koniec: rjmp koniec (przykładowy rozkaz z atmela)

    dobrze rozumiem ?


    P.S. no i ten pic ma tylko 4 bity (in/Out) wiec bym musiał takie 2 użyć, lub znaleźć przynajmniej z 10 bitami(in/out) 2 w zapasie do konfiguracji układu :-)

    0
  • Pomocny post
    #16 10 Maj 2015 13:04
    dondu
    Moderator Mikrokontrolery Projektowanie

    Funkcjonalności zależą od konkretnego mikrokontrolera. Czasami jest to kilka wejść i kilka wyjść, a czasami jedno wyjście (jak w przypadku wyżej). W jednym mikrokontrolerze może być kilka takich niezależnych modułów. Do tego inicjowanie przerwań, co jest bardzo istotne, a najczęściej najistotniejsze.

    Jeżeli chcesz szukać układów PIC mających CLC to wykorzystaj: http://www.microchip.com/ParamChartSearch/Chart.aspx?branchID=1012
    i patrz na kolumnę CLC

    0
  • #17 10 Maj 2015 13:46
    JohnCTN
    Poziom 17  

    Wielkie dzięki Dondu.

    Dawno temu programowałem PIce 16f84a ... ale teraz jestem bardziej przy środowisku AS6 dla Atmeli, wiec będę musiał czegoś takiego poszukać w "rodzinie Atmel" :-D

    0
  • #18 10 Maj 2015 21:46
    94075
    Użytkownik usunął konto  
  • #19 10 Maj 2015 23:03
    atom1477
    Poziom 43  

    Jeżeli ten !OW ma być wspólny dla każdego kanału to ja bym dał bramkę AND na wejście (nawet taką z diod i rezystora) sumująca wszystkie sygnały !CS. Za tym obwód RC opóźniający o jakieś 30 ns. I na koniec monowibrator generujący impuls powiedzmy 100ns (oba czasy nie za dużo żeby razem dać czas zmniejszy niż czas trwania stanu niskiego na dowolnej linii !CS).
    Moniowibrator powinien mieć wejście wyzwalające z histerezą żeby złagodzenie impulsu wyzwalającego przez ten obwód RC mu nie przeszkadzało.
    Sam obwód RC różniczkujący (tak jak pisze albertb) być może też by się nadał ale wtedy zbocze opadające sygnału !OW będzie równocześnie ze zboczem opadającym sygnału !CS a nie wiem czy to Ci odpowiada (TCSS z fragmentu datasheeta który podałeś mówi że to ma być minimum 25ns, więc chyba nie odpowiada).
    Do czego Ci ten sygnał !OW?

    0
  • #20 10 Maj 2015 23:20
    JohnCTN
    Poziom 17  

    Ten sygnał IOW ma takie zadanie ze podczas zbocza narastającego zatrzaskuje dane na D0-D7 i A wiec CS musi trwać te minimum 25ns.

    0
  • #21 10 Maj 2015 23:22
    atom1477
    Poziom 43  

    Ok, ale te dane D0...D7 to gdzie są?
    Tzn. cel ostateczny jaki jest? (tego sygnału !OW)

    0