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

Atmega168 Bascom - Przerwanie co 5us i odczyt 8 bitów

jacek 06 Lis 2014 18:35 3720 65
  • #1 06 Lis 2014 18:35
    jacek
    Poziom 10  

    Witam
    Mam impulsy (ok.100 impulsów) trwające 0,4us i powtarzające się co 5us (PinB.0) impulsy "0" z wysokiego stanu do masy.
    W czasie trwania tego impulsu na PinD pojawia się 8 bitów, które chcę zapisać do tablicy a potem chce je przeglądać.
    Mam jakieś przerwania bo X się zwiększa i dane w tablicy też ale to nie te dane.
    Czy to jest wykonalne na Atmega168 i Bascomie ?

    Kod: text
    Zaloguj się, aby zobaczyć kod

    0 29
  • Arrow Multisolution Day
  • #2 06 Lis 2014 18:40
    tmf
    Moderator Mikrokontrolery Projektowanie

    Chcesz rozróżnić impulsy o czasie trwania 4 ns? To niemożliwe na AVR.
    Opisz co to za protokół bo twój post jest niezbyt zrozumiały.

    0
  • Arrow Multisolution Day
  • #3 06 Lis 2014 18:57
    jacek
    Poziom 10  

    Nie wiem co to za protokół, (jakaś 8-bitowa szyna danych + 4 sterujące), to jest coś podobnego do starego komputera 8-bitowego (nie mogę odczytać bo nie czytelne ale wydaje mi się że to co steruje to Z80) i wysyła jakieś informacje do układu AY-3-8910 który generuje różne dźwięki ale na jednej linij idą na pewno impulsy do "0" wtedy jak wysyła dane , bo nagrałem to na analizator stanów na PC i próbuje to jakoś odczytać żeby powtórzyć . Chciałem spróbować czy da się odczytać to AVR'em i wystawić na port dane które wygenerują jakiś dźwięk. Jeżeli nie da się tego zrobić AVR to czy by to można zrobić?

    0
  • #5 06 Lis 2014 19:19
    tmf
    Moderator Mikrokontrolery Projektowanie

    Jeżeli to jest AY-3-8910 to nie ma żadnego problemu, ściągnij notę katalogową, masz tam opisany interfejs. Zwykła 8-bitowa magistrala danych + niezbędne sygnały sterujące. Tyle tylko, że coś źle zmierzyłeś, bo sygnały sterujące muszą mieć znacznie dłuższe okresy - odczyt co najmniej 350 ns, zapis prawie 2000 ns. Oczywiście komunikacja z tym ukłądem przy pomocy AVR jest możliwa, a nawet banalnie prosta.

    0
  • #6 06 Lis 2014 19:28
    jacek
    Poziom 10  

    Chyba porwałem się z motyką na słońce :D eh ,
    A Avr jakie najszybsze przerwanie potrafił by zrobić i odczytać stan końcówek pinów? To takie pytanie z ciekawości, jak to przeliczyć na cykle zegarowe przy 20MHz ?


    Faktycznie według pdf częstotliwość 2MHz odczyt 250-500ns reszta też wszystko powyżej 50ns.
    Może coś skopałem z tym analizatorem stanów logicznych. Czyli jednak można to zrobić na AVR a czy Bascom'em też? Chodzi mi o te cykle zegarowe bo słyszałem że Bascom coś zamula i potrzebuje więcej cykli zegarowych?

    0
  • Pomocny post
    #7 06 Lis 2014 19:56
    tmf
    Moderator Mikrokontrolery Projektowanie

    To procesor steruje tym układem, a nie odwrotnie. Stąd też szybkość procka nie ma znaczenia - chcesz coś odczytasz to ustawiasz odpowiedni sygnał i w dogodnym czasie odczytujesz stan magistrali danych. Wszystko masz w nocie układu.

    0
  • #8 06 Lis 2014 20:45
    jacek
    Poziom 10  

    Zaraz będę to próbował z odczytem, a jak odwrotnie zrobić ? Leci masa sygnałów z procesora np.tego (Z80) i chce odczytać sygnał co on wysyła do tego AY.... ?
    Chce odebrać to co on wysłał do AY .. i podmienić mu sygnał i wystawić inny do AY ... chociaż by drugim AVR'em jak jeden nie wyrobi z odczytem i wystawieniem nowej kombinacji?

    Dodano po 40 [minuty]:

    Zrobiłem jeszcze raz pomiar i wyszło tak jak napisałem w 1 poście
    impuls 0,4us = 400ns
    przerwa 3,3us = 3300ns
    Czy AVR i ten program napisany powyżej w Bascomie wyrobi w 400ns żeby odczytać zawartość pinuD i zapisac do tablicy dane?
    Bo coś mi to nie wychodzi?

    0
  • #9 06 Lis 2014 21:04
    EuroGenio
    Poziom 17  

    Wydaje mi się że kolega dobrze zmierzył, ale źle opisał.
    Ta paczka impulsów to chyba w sumie 0,54 ms (100*(5us+0,4us)) lub 0,5ms jeśli "powtarzające się co" zinterpretować jako okres.
    Czy sterowanie dźwiękiem (w tym przypadku prawie "zadawanie" nut, bo resztę robi układ peryferyjny) w 100 krótszych interwałach ma sens?
    Ponadto jak wygenerować impuls 4ns na procesorze o zegarze max. 8MHz (ale wtedy używane były przecież niższe zegary).


    /--------
    O przepraszam, kolega właśnie mnie uprzedził.

    0
  • #10 06 Lis 2014 21:50
    jacek
    Poziom 10  

    Tak przepraszam, źle napisałem na początku, miało być 1 okres to 400ns (logiczne 0) + 3300ns (logiczna 1)
    Teraz sprawdziłem wg. analizatora wyliczyłem 128 impulsów "0" o czasie 0,4us z przerwami "1" ok.3-3,5us i poprawiłem program żeby zliczał impulsy na INT0 na zboczu Falling i gubi mi 8 impulsów pokazuje ze było 120 przerwań a na analizatorze mam 128 i tak za każdym razem, co mam nie tak z tym programem ?
    I przepraszam że tak marudzę i zawracam gitarę :)

    0
  • #11 06 Lis 2014 23:07
    94075
    Użytkownik usunął konto  
  • #12 06 Lis 2014 23:26
    EuroGenio
    Poziom 17  

    Nie używam i nie znam BASCOMA.
    Próbuje swoich sił w Arduino IDE (ATMega328@16MHz).

    Po pomocy ze strony przyjaznych niewiedzącym: BlueDraco, nsvinc, tmf mogę stwierdzić że:

    Ten uC ma na pewno możliwości, aby obsłużyć te przerwania (zakładam ok. 33kHz).

    Problem nie polega na wywołaniu zaprogramowanego przez Ciebie przerwania (ale to już zauważyłeś), ale na jego obsłudze.

    Przy tej częstotliwości przerwań musisz użyć operacji odczytu pinów IO zrealizowanej na rejestrach - "na piechotę".

    Operacje typowe dla BASCOMA mogą być uniwersalne ale powolne.

    Podam przykłady, które dotyczą tylko zapisu do wyjścia (w ramach unifikacji bibliotek, podejrzewam, że operacje odczytu portu mają podobną strukturę logiczną, a więc i timingi):

    (pseudo kod !!!)
    - zapis bezpośrednio do rejestru wyjściowego ( np. ustawienie bitu 2, PORTD = 4) zajmuje 2 cykle uC,
    - wywołanie procedury gdzie parametrem jest stała: 4 cykle uC
    - wywołanie procedury gdzie parametrem jest zmienna (uC musi ustawić adres skąd pobiera do rejestru parametr) : 8 cykli uC
    - użycie uniwersalnej (jeśli chodzi o parametr) procedury (w Arduino IDE) digitalWrite(pin, level) ok. 62..64 cykli uC :( ?!? (jeśli jest inaczej, proszę o dementi)

    UWAGA: Zmierzone przy pomocy oscyloskopu (dokładność oceniam na +- 10%)

    To wszystko dotyczy Arduino IDE.

    0
  • #13 06 Lis 2014 23:58
    michalko12
    Specjalista - Mikrokontrolery

    jacek napisał:
    Zrobiłem jeszcze raz pomiar i wyszło tak jak napisałem w 1 poście
    impuls 0,4us = 400ns
    przerwa 3,3us = 3300ns
    Czy AVR i ten program napisany powyżej w Bascomie wyrobi w 400ns żeby odczytać zawartość pinuD i zapisac do tablicy dane?
    Bo coś mi to nie wychodzi?

    EuroGenio napisał:
    Ten uC ma na pewno możliwości, aby obsłużyć te przerwania (zakładam ok. 33kHz).


    270kHz

    W assemblerze na pewno da radę, w C może być problem jeśli przerwanie będzie obłożone przydługawymi wrapperami.

    0
  • #14 07 Lis 2014 07:18
    jacek
    Poziom 10  

    albertb - ten "and" akurat jest tam nie potrzebny, bo chce odczytać cały port ale to jest maska które piny mają być odczytane w przerwaniu

    Też tak słyszałem, że Bascom zamuli wszystko a Asembler powinien wyrobić. Może ktoś wie jak tu wstawić jakieś wstawki Asemblerowe do Bascoma, może w tedy wyrobi, tylko że na Asemblerze w ogóle się nie znam.

    Chce tylko odczyt 8 bitów z portuB w czasie zbocza opadającego i zapis do tablicy (128 przerwań bo tyle naliczyłem impulsów) w przerwaniu nic więcej nie będzie żeby nie przeginać ewentualnie odczyt 4 bitów z następnego portuD jak wyrobi ;).

    0
  • #15 07 Lis 2014 07:23
    emarcus
    Poziom 35  

    jacek napisał:
    Tak przepraszam, źle napisałem na początku, miało być 1 okres to 400ns (logiczne 0) + 3300ns (logiczna 1)


    Inaczej mówiąc jest to fala, której okres T = 3.7µsec, albo jak Michałko podaje 270kHz. Nie jest to dużo jeśli chcesz zliczac impulsy, ale ty przy każdym opadającym zboczu wywołujesz interrupt, którego pełna obsługa łącznie ze stosem zajmuje 134 cykle zegarowe co w przeliczeniu na czas przy taktowaniu 20MHz zajmuje ok 6,7 µsec mając do dyspozycji tylko 3.7(?).
    W obsłudze interruptu Bascom standardowo odkłada na stos wszystkie rejestry.
    Możesz ten czas obsługi interruptu znacznie skrócic (nawet do 1.5 µsec) stosując 'nosave', lecz wtedy w obsłudze interruptu należy dokonac indywidualnie: push i pop tylko używane rejestry.

    e marcus

    0
  • #16 07 Lis 2014 08:36
    BlueDraco
    Specjalista - Mikrokontrolery

    Procesor ATmega od biedy "ma możliwość" obsługi przerwań zgłaszanych z częstotliwością 33 kHz, ale pod warunkiem, że jest programowany w C lub asemblerze, a nie w Arduino ani Bascomie. Obsługa takiego przerwania w C musi być b. uważnie napisana - kilkanaście linii kodu, bez wywołań procedur, mnożeń ani dzieleń.

    0
  • #17 07 Lis 2014 11:48
    jacek
    Poziom 10  

    Z asemblerem nie miałem nigdy do czynienia. Może mógł by mi ktoś napisać co mam wstawić za wstawkę asemblera? ale taką z opisem co za polecenie i co ono robi? Będę próbował przesiąść się na asemblera.

    Wyczytałem też że po przerwaniu procesor wraca do głównego programu i wykonuje przynajmniej jedno całe polecenie i może te komendy LCD też tam coś psują?

    0
  • #18 07 Lis 2014 12:22
    tmf
    Moderator Mikrokontrolery Projektowanie

    Wykonuje jedno całe, ale polecenia asemblera.
    Ale zanim będziemy kontynuować - napisz o co ci chodzi? Czy o sterowanie AY z MCU? Bo nie widzę sensu podmiany poleceń wysyłanych do tego układu z Z80. Tym bardziej, że taka podmiana wymagałaby analizowania większych ciągów - bo jak zakładam nie ma sensu wymiana poleceń generujących jakieś pojedyncze tony.
    Czy może interesuje cię np. rejestracja tego co wysyła Z80, np. żeby potem odtworzyć muzykę na innym MCU?
    Jeśli chcesz podmieniać polecenia to interpretacja tego co wysyła Z80 i podmiana na coś sensownego, a następnie wysłanie tego do AY może być niezłym wyzwaniem dla ATMega, a skoro piszesz, że asemblera nie znasz to będzie to poważny problem.
    Jeśli z kolei chcesz "nagrać" to co wysyła Z80 to potrzebujesz analizatora logicznego z dużą pamięcią. Można go dla tych częstotliwości zrobić prosto w oparciu o mikrokontroler.

    0
  • #19 07 Lis 2014 12:31
    witoldwitoldowicz
    Poziom 28  

    Może prościej będzie pierwsze rozpoznać urządzenie. A potem myśleć o analizie. Podrzuć zdjęcia.

    0
  • #20 07 Lis 2014 13:06
    jacek
    Poziom 10  

    Na pewno jest to Z80 i mam 2szt ale tylko 1 AY.. i jeszcze na dodatek pożyczony, 8-bitowa szyna danych i 4 linie sterujące.
    Wszystko odczytałem na analizatorze logicznym Sealea 8Ch i jest dokładnie jak w pdf , wszystkie impulsy sterujące pasują i chcę odczytać jakie idą dane podczas tych impulsów. (nie chce mi się ręcznie przepisywać z analizatora np. 1) 1010 ster. - 0001111 dane, 2) 0101 ster. - itd.... ponad 100 próbek na jeden dźwięk)
    Może uda się to zrobić prostym programem żeby zapisać dane do jakiejś tablicy wtedy wyślę dane z AVR do AY.. bez Z80 i zapiszę dźwięki w innym formacie np.wave albo innym i spróbuje to odtworzyć na innym MCU. Ale AVR musi wiedzieć przy jakich danych leci dany dźwięk.
    Chciałem zrobić coś w rodzaju kopii (klona) AY.
    Jak myślicie wykonalne ??? Choćby nawet trzeba by było zrobić to na 2szt lub 3szt AVR.

    0
  • #22 07 Lis 2014 13:14
    tmf
    Moderator Mikrokontrolery Projektowanie

    Dobra, to jeszcze pytanie. Chcesz zgrać dane idące do AY? To się prosto da zrobić na AV - np. w darmowych przykłądach do mojej książki "AVR. Praktyczne projekty" masz przykłąd analizatora logicznego na AVR, który ci zrzuci dane do pamięci albo prześle do komputera przez USB. Bez problemu możesz go wykorzystać do odczytu tego co trafia do AY.
    Natomiast czym innym jest symulacja AY. To możesz zrobić na podstawie analizy noty katalogowej. Masz tam opisane jego rejestry i co one robią. Musisz odtworzyć tą funkcjonalność za pomocą mikrokontrolera.

    0
  • #23 07 Lis 2014 13:35
    vania
    Poziom 22  

    jacek napisał:
    Na pewno jest to Z80 i mam 2szt ale tylko 1 AY.. i jeszcze na dodatek pożyczony, 8-bitowa szyna danych i 4 linie sterujące.
    Wszystko odczytałem na analizatorze logicznym Sealea 8Ch i jest dokładnie jak w pdf , wszystkie impulsy sterujące pasują i chcę odczytać jakie idą dane podczas tych impulsów. (nie chce mi się ręcznie przepisywać z analizatora np. 1) 1010 ster. - 0001111 dane, 2) 0101 ster. - itd.... ponad 100 próbek na jeden dźwięk)
    Może uda się to zrobić prostym programem żeby zapisać dane do jakiejś tablicy

    Przecież z analizatora Seale możesz zrzucić do pliku tekstowego dane. Menu "Analyzers -> Simple Parallel" Wyświetlasz w dowolnej postaci HEX/BIN/DEc i zrzucasz do pliku. Później trochę zabawy w arkuszu kalkulacyjnym.

    jacek napisał:

    Chciałem zrobić coś w rodzaju kopii (klona) AY.
    Jak myślicie wykonalne ??? Choćby nawet trzeba by było zrobić to na 2szt lub 3szt AVR.

    Przecież oryginał na Allegro się pojawia co jakiś czas, zrobienie tego na AVR będzie droższe jak oryginalny.

    0
  • #24 07 Lis 2014 16:15
    jacek
    Poziom 10  

    Dzięki Panowie za zainteresowanie i wyjaśniam o co mi chodziło zakładając ten wątek. Z tym klonem (kopią AY) trochę przesadziłem, nie chce też kupić AY i wsadzić w siedzenie - łatwizna :) Bardziej chodzi mi o doświadczenie związane z pisaniem programu na AVR, interesuje mnie to co napisałem w bascomie i czy atmega168 da rade ogarnąć te dosyć krótkie czasy ale jak wynika z podpowiedzi nie da rady w bascomie tylko asembler. Tak że spróbuję sił w asemblerze ale wiem że to potrwa i znowu muszę zaczynać od nowa. Chciałem tylko odczytać dane ale nie z analizatora tylko na ekran lcd połączony z AVR'em i naciskając klawisz przeglądać co zapisało się w tablicy. Może wie ktoś jaką wstawić wstawkę z asemblera żeby to zadziałało? Dopiero jak to zadziała to będę kombinował dalej żeby wystawić na wolnym porcie binarnie 00001, 00010, 00011 itd to co odebrał z Z80. Po prostu jestem ciekawy jak to działa i czy się da.
    A jutro pojadę do empiku za książkami :)

    0
  • #26 07 Lis 2014 17:36
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie radzę iść tą drogą i za efekt nie ręczę. Problem leży głównie w narzucie Bascoma na obsługę przerwań - wstawka asemblerowa niewiele pomoże. prawdopodobnie całość można byłoby łatwo zrealizować w C. Niemniej właściwym sposobem na podsłuchanie komunikacji jest użycie analizatora stanów logicznych za 15 USD, a ne stawianie na kancie wydajności archaicznego AVRa.

    0
  • #27 07 Lis 2014 18:42
    tmf
    Moderator Mikrokontrolery Projektowanie

    BlueDraco - ale z wypowiedzi autora wynika, że nie o zabawę z analizatorem mu chodzi.
    A jeśli chce się nauczyć czegoś nowego, to w sumie próba podsłuchania i zmiany komunikacji z AY jest sensownym pomysłem, być może bardziej niż nauka migania LEDem na ARMie pędzonym 160 MHz. Natomiast, z pewnością wszyscy się zgodzimy, że skoro chodzi o naukę, to najlepiej ją zacząć od porzucenia Bascoma na rzecz C. A wtedy i użyty mikrokontroler nie będzie miał wielkiego znaczenia.

    0
  • #28 07 Lis 2014 21:12
    jacek
    Poziom 10  

    Zainstalowałem AVR Studio4 i lecę od początku z google i pdf na temat ASM i AVR
    Powiedzcie chociaż czy w dobrym kierunku zmierzam? Bo jak w złym to odpuszczam i daje sobie spokój, pobawię się migającymi diodami w Bascomie. Tam gdzie nie ma komentarza to nie wiem co to znaczy i co robi ale było w pdf lub innych opisach, jeżeli ktoś może mi wyjaśnić instrukcje bez komentarza co robią będę happy ;)
    Jeszcze nie doszedłem do NO_SAVE , PUSH
    Czy ta tablica wektorów przerwań zawsze musi być cała wklejona w program?

    Kod: text
    Zaloguj się, aby zobaczyć kod

    0
  • #29 07 Lis 2014 21:18
    witoldwitoldowicz
    Poziom 28  

    Czemu nie zaczniesz od C? Jak zmienisz procesor to będziesz musiał sie uczyć prawie od nowa.

    0
  • #30 07 Lis 2014 21:32
    jacek
    Poziom 10  

    Michalko12 napisał
    W assemblerze na pewno da radę, w C może być problem jeśli przerwanie będzie obłożone przydługawymi wrapperami.

    Dlatego złapałem za Asemblera. Pisałem kiedyś w C++Borland jak chodziłem do szkoły ale będę musiał sobie przypomnieć i poszukać książek. Podobno C jest lepszy od Bascoma ale Assembler podobno jeszcze lepszy? Ale teraz to już sam nie wiem w czym sobie to napisać żeby zadziałało?

    0