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

Problem z odczytem danych z wyświetlacza sekwencyjnego

12 Lut 2009 11:13 6682 63
  • Poziom 14  
    Próbuje wykonać interfejs do wyświetlacza sekwencyjnego 7 wyświetlaczy siedmiosegmentowych), który będzie odczytywał wyświetlaną wartość i wysyłał ą przez rs232 do komputera.

    Używam Atmega16

    Mój problem polega na tym że warunki odczytu stanów (Sprawdzenie który wyświetlacz jest aktyny w danym momencie oraz odczyt kodu bcd, który ma być wyświetlony)umieścłem w przerwaniu INT0. Wydaje mi śe że poprawne jest założenie ze przerwanie to powinno być podpięte do kazdego z wyświetlacz a dokładnie do układu UCY 7447 na wyświetlaczu. Do połączenia wykorzystałem diody 1N4148. Połączenie wyglada tak że katody diod podłączone są do wyświetlaczy a anody połączone w jednym punkcie i podpięte pod przerwanie INT0. Wydaje mi się ze tak powinno to działać, jednak przerwanie nie jest inicjowane. Dodam że gdy w ten sam sposób podepne tylko jedna diodę do jedego wyświetlacza wtedy wszystko działa?

    Co może być powodem? Czy wybrałem złe diody? Czy założenie jest błędne? Proszę o pomoc:) Pozdrawiam
  • Poziom 43  
    Był już taki temat, użyj klawisza "szukaj"
  • Poziom 14  
    Jakoś nie potrafie znależć.... może pomożesz dobry kolego


    Chyba, że chodzi ci o tamat który sam kiedys otworzyłem.

    Liczę na pomoc bo naprawdę nie wiem jaki mozę być powód tego że przerwanie nie jest inicjowane...
  • Poziom 22  
    Napisałeś niejasno, "podpięte razem pod int0", przez co je podpiąłeś?, w przerwaniu powinna być tylko obsługa m.innymi sekwencyjne zgaszenie wszystkich i zapalenie za każdym przerwaniem kolejnego leda już po przesłaniu do rejestru szeregowego info o tym które segmenty mają świecić.
  • Poziom 14  
    Małe wyjasnienie nie chce wykonać wyświetlacza sekwencyjnego, tylko dekoder, który będzie odczytywał wartośc wyświetlaną na takim wyświetlaczu w czasie rzeczywistym...

    A diody o których mówiłem w pierwszym poscie to zwykle diody prostownicze. Wykorzystałem po to aby nie zakłócić pracy układu do którego się wpinam. Postaram się dzisiaj zamieścic schemacik poglądowy
  • Poziom 39  
    Na Twoim miejscu, zainteresowałbym się 'scalakami' 7447 i 7442.
    Zakładasz, że uC potrafi wykryć zmianę aktywnego wyjściach na dekoderze 7442, a to jest raczej mało prawdopodobne, bo taka zmiana trwa zaledwie kilka ns, więc sposób z diodami jest nie bardzo.Mówisz że z 1 diodą , są generowane przerwania, więc myślę, że gdybyś diody dał tylko na co drugi(np.nieparzysty) wyświetlacz , to wtedy miałbyś poprawne impulsy na wejściu INT. Domyślam się tylko , w jaki sposób są sterowane te wyświetlacze , więc warto by sprawdzić, co się dzieje na końcówce BI/RBO.
  • Poziom 14  
    Wyswietlacze sterowane są własnie za pomocą tych 'scalaków' 7447 i 7442.

    Wydawało mi się że moja koncepcja jest słuszna i że uC poradzi sobie ze sprawdzaniem stanów
    Wrzucam foktę modułu z wyświetlaczami niestety nie posiadam schematu

    w załączniku zamieściłem schemat interfesju
  • Poziom 38  
    Ale się wzruszyłem...
    Ta płytka jest tak stara jak ja.
    Unitra na licencji Canon... i do tego ATMega16.
    Sumator diodowy zrobiłeś.
    Co procek robi w przerwaniu?
    Jak szybko dochodzą impulsy przerwań?
    Jakiś bufor dla RS i dla odczytów?
    Może obsługa przerwania trwa za długo?
  • Poziom 14  
    heh no tak moduł ten pracuje w bardzo starym urządzeniu a ja chce odczytywac wartość wyswietlaną na komputerze i dlatego postanowiłem zrobić interfejs na uC Atmega16 tylko że pojawiły się problemy i nie wiem jak je obejśc:D

    Przerwanie jest inicjowane wtedy gdy pojawi się sygnał z wyświetlacza. W przerwaniu sprawdzane są stany poszczególnych linii o taki coś:

    Oczywiscie przerwania sa wczesiej zdeklarowane globalnie i włączone

    [
    główna częśc programu to poprostu pusta niesończona pętla

    A za wysyłanie danych przez rs232 odpowiada taimer1, który ustawiony jest na generowanie przerwania co 500ms i w przerwaniu tym składana jest tablica wartości



    Jeżeli mam coś zle to prosze o pomoc
  • Poziom 39  
    Jeśli Twoje urządzenie ma do wykonania tylko to jedno zadanie, o którym wspomniałeś , to proponuje zmienić uC na np.ATTiny2313,
    który ma takie fajniste przerwania, jak PinChangeInterrupt.
    Do uC podłączysz 4 kabelki z 7447 i 4(a może tylko 3) kabelki z linii adresowych 7442.
    Dowolna zmiana stanu na liniach adresowych 7442, wygeneruje przerwanie PCI :idea:
    Szybko, łatwo i przyjemnie, bez żadnych niepotrzebnych kombinacji ;)
  • Poziom 14  
    hmm.....Ale jak to zrobic na Atmega16 żeby to działało. Nie wierze że nie idzie:d Może mam źle diody wpięte. Czy może powinienem wybrać jakiś inny typ diody?
  • Poziom 39  
    naitsyrk napisał:
    hmm.....Ale jak to zrobic na Atmega16 żeby to działało. Nie wierze że nie idzie:d Może mam źle diody wpięte. Czy może powinienem wybrać jakiś inny typ diody?

    A sprawdziłeś BI/RBO :?:
    Może wyświetlacz jest wygaszany, przed zmianą na liniach adresowych 7442 :!:
  • Poziom 38  
    Anody diod chyba muszą brać prąd z plusa zasilania a są podłączone tylko do wejścia procka.
    Daj tam (między anody diod a plus zasilania) jakiś opornik
    500-1000 Ohm.
    Skonfiguruj przerwanie na opadające zbocze.

    Dodano po 4 [minuty]:

    Masz jakiś oscyloskop?
  • Poziom 14  
    Tak tak podciągnąłem programowo przerwanie INT0 do plusa zasilania i oczyiscie sprzętowo też próbowałem podciągać przez rezystor tak jak mówisz i nic to nie dało.

    Dlatego zastanawia mnie co może być nie tak oczywioście sprawdzałem inicjacje zboczem opadającym, roznącym i poziomem niskim. Przy jednej diodze wszystko było ok. działą na zboczu opadającym ale przy podłączeniu reszty diod przerwanie nie jest wyzwalana

    Niestety nie posiadam oscyloskopu:(

    Dodano po 6 [minuty]:

    zumek napisał:

    A sprawdziłeś BI/RBO :?:
    Może wyświetlacz jest wygaszany, przed zmianą na liniach adresowych 7442 :!:


    Hm... Nie podsiadam ciągłego dostepu do urządzenia dlatego wykonałem sobie w domu na innym procesorze układ symulacyjny, który podaje mi odpowiednie kombinacje bitowe w jakiś tam odstepach czasowych. Tak żeby sprawdzicsobie układ do odczytu więc w tym momencie błąd musi leżeć gdzie indziej. Muszę jeszcze dokładnie sprawdzić ale wydaje mi się że jak podłączyłem np 3 diody 1N4007 to przerwanie było inicjowane! Dziwne to troszkę dla mnie
  • Poziom 38  
    Napisałeś że przy jednej diodzie działa.
    A jak więcej to nie.
    A jakie są stany na katodach diod?
    Jeśli choć na jednej z nich jest stan niski to nie masz przerwania.
    A na anodach (INT) jak masz 0.7V to znaczy to samo.
    Miernik.
    Ten układ diodowy to jest sumator.
    1N4148 jest na mniejszy prąd i szybsza od 1N4007(zwykła prostownicza)
    W takich układach to powinno być teoretycznie bez znaczenia.
    Sprawdź diody PRZED wlutowaniem.
    Miernik.
    A BI/RBO też sprawdź.
    Ale zacznij od spraw podstawowych.

    Dodano po 5 [minuty]:

    Bez oscyloskopu ślepnę.
    Ale przy tych częstotliwościach-ściągnij sobie jakiś program z sieci który robi z karty graficznej oscyloskop.
    Nie pamiętam nazwy.
    Poszukaj.
    Oczywiście z dźwiękowej, nie graficznej.
  • Poziom 38  
    Z karty graficznej? O.o?
    Interesting!
  • Poziom 14  
    W moim symulatorze zrobiłem sobie tak że ustawiłem sobie wartośc bitową na portach a żniej bity przesuwam np w lewo.
    Domyślam się że wyświetlacze są aktywowane stanem niskim (UCY 7442), jeżeli myśle żle to mnie poprawcie.

    I dlatego w moim symulatorze zrobiłem sobie np &B10111111
    ustawiłem jakies bity jako BCD pózniej opóznienie i przesuwam sobie bity w drugim kroku inna kombinacja bcd itd i to wszystko w pętli

    Więc zawsze na jedej katodzei będe miał stan niski na katodach pozostałych diod stan wysoki? CZY POWINIENEM to jakoś inaczej realizować?

    Chodzi mi o to żeby podczas aktywaćji każdego z wyświetlacz było generowane przerwanie a w przerwaniu tym będę sprawdzał stan wyświetlaczy i BCD tak jak zrealizowane to w kodzie programowym.???


    P.S. Ten wirtualny oscyloskop sobie sprawdzę :d zawsze myslałemm że takie programy nie działaja:) Tylko pytanie jak zabezpieczyć wejście LINE IN ???
  • Poziom 38  
    Czy należy rozumieć że ta część układu (na schemacie w pomarańczowym okienku) jest symulowana na jakimś procesorze?
    Jeśli tak, to zamiast diod daj led-y , opóźnienie z pół sekundy
    i zobacz czy tylko jedna się świeci.
    A potem dalsze śledztwo.
    Układowo wygląda wszystko ok.

    Dodano po 8 [minuty]:

    a w przerwaniu wstaw tooggle na jakąś nóżkę, leda i może sprawdzisz czy przerwanie jest.
    Nie mogę znaleźć jaka jest wartość pull-up w ATmedze.
    Czy wystarczy do zaświecenia Led-a.
    Jak nie, to daj opornik do plusa.

    Dodano po 5 [minuty]:

    Tylko pytanie jak zabezpieczyć wejście LINE IN ???
    Zrób sobie "sondę" oscyloskopową-stary długopis, dwa oporniki i dioda zenera.(np. 91k, 10k 3.3V)
    .
  • Poziom 14  
    janbernat zaraz sobie sprawdze to co i napisałes.

    Tak zaczynam myślec czy wstawiłem w odpowiednim kierunku diody?
    Czy nie powinny być one wstawione odwrotnie i przerwanie podpięte do masy?

    Dodano po 12 [minuty]:

    Posiadam moduł ZL3AVR i na niej wykonałe sobie generator, króty symuluje mi normalny wyświetlacz sekwencyjny.

    Plytka ta posiada wmontowane diody LED więc zrbiłem tak jak napisałeś i zwiekszyłem opóznienie i w danym mmencie pali siętylko jedna dioda. Płytka jakby co to posiada też 4 wyświelacze 7 segmentowe wieć wykorzystując układ DM7447AN moge szybko przetestować czy oporawnie działa mi symulacja
  • Poziom 38  
    Diody (na schemacie-a jak w rzeczywistości?) wpięte
    dobrze.
    Pasek (katoda) do 7442.
    Tam jest minus.
    Sprawdź, czy przerwanie w ogóle działa.

    Dodano po 2 [minuty]:

    Wygrzebałem z kartonu ZL3AVR.
    Nie ma na niej 7447.
  • Poziom 14  
    7447 mam podpięne na uniwersalnej płytce stykowej do wyświelaczy na ZL3AVR

    tak dokładnie mam wpięte katoda w kierunku wyświetlacza

    Podejrzewam że pzerwanie musi działac ponieważ teraz zwiększyłem sobi czas opżnienia wyświetlania. Podglad wrzuciłem na 4 wyświetlacze 7-segmentowe więc 4 wartości z 7 widze na bieżąco.

    Gdy którąś linie odowiedzilaną za aktywację wyświetlacza zmostkuję na na przerwanie (czyli bez diody) wtedy na odpowiedniej pozycji w erminalu pojawia mi się wyświetlana wartość. Tak samo się dzieje jak podepnę tą linie przez jedną diodę. Jednak gdy zastosuje już więcej diod to przerwanie nie jest aktywowane?

    janbernat posiadasz gdzieś może schemat tej sondy o której pisałes chcciałbym sobie przetestować jak bedzie działał ten "oscyloskop" z karty dzwiekowej
  • Poziom 38  
    To jest niemożliwe.
    Podłączasz wszystkie diody.
    Na nóżkę przerwania podłączasz miernik.(zakres 20V)
    Czas dajesz 3 sekundy.
    Żadna nie świeci.
    Miernik pokazuje 5V
    Podajesz symulację.
    Jedna świeci-jest przerwanie.
    Miernik pokazuje ok. 0.6V
    TERAZ WSZYSTKIE MUSZĄ ZGASNĄĆ!!!
    Bo jak nie-to nie będzie następnego przerwania.
    Następna świeci-jest przerwanie.

    Dodano po 18 [minuty]:

    Sonda-to normalny dzielnik napięcia.
    Bez kompensacji częstotliwości-przy paru kHz można się obyć.
    Nie potrafię jeszcze wklejać obrazków.

    We karty dźwiękowej
    |
    100k | 9.1k
    WE ------| |---|---| |--------Masa
    |
    ---
    /\ Zener(3.3V)
    |
    ----- Masa
    To jest spod palca, ale powinno działać.

    Dodano po 2 [minuty]:

    Cholera, przeformatowało.
    Sam bym tego nie zrozumiał.
    Nauczę się wklejać obrazki.
  • Poziom 14  
    jak piszesz post to pod spodem masz kilka przycisków jest tam przycisk "dodaj obrazek" a podspodem hiperłącze w kolorze zielonym"dodaj obrazek" kliknij na to zielone hiperłącze

    Dodano po 23 [minuty]:

    po podłaczeniu wszystkich wyprowadzeń pod diody led zestawu wtedy palą się wszystkie diody a jedna jest wygaszona. Ta jedna wygaszona jest to stan niski, który aktywuje wyświetlacz 7-segmentowy

    Dodano po 1 [minuty]:



    Dodano po 3 [godziny] 16 [minuty]:

    Zrobiłem pewną rzecz wywaliłem w syulatorze rotowanie bitów i wpisałem sobie na stałe np.
    Code:
    Do
    

    Wait 1
    Config Porta = 255
    Porta = &B11011111

    Wait 1

    Config Porta = 255
    Porta = &B11111111
    Wait 1

    Config Porta = 255
    Porta = &B11101111
    Wait 1
    Config Porta = 255
    Porta = &B11111111
    Wait 1

    Config Porta = 255
    Porta = &B11111110
    Wait 1
    Config Porta = 255
    Porta = &B11111111
    Wait 1
    Loop


    i rzeczywiście tak jak pisałesś jezeli wszystkie segmenty wygaszam wtedy przerwanie działa i na liniach gdzie jest 0 sprawdza mi stan

    Więć teraz mam pytanie jak działa ucy 7442? Jak to się ma do kodu który teraz napisałem? Jakie wartości otrzymam na liniach sygnałowych, które idą do wyświetlaczy
  • Pomocny post
    Poziom 38  
    No, to to już mógłbyś wygooglać.
    Dekoder BCD na 1 z 10.
    WE-0000,0001 itd. aż do1001
    WY -na jednym z 10 stan niski.
    Zasilanie i nic więcej.

    Dodano po 30 [minuty]:

    Dlaczego Config Porta = 255 za każdym razem?
    Raz jako wyjście i już.

    Dodano po 21 [minuty]:

    po:
    Porta = &B11111111

    wystarczy chyba waitms 1
    Ale symulujesz układ w którym nie znasz częstotliwości
    przemiatania tzn. z jaką częstotliwością zmienia się stan
    na wyjściu prawdziwego 7442.
    I pewnie po stanie np. 11111110 przechodzi po kilku ns w stan11111101.
    A nie w same jedynki.
    Chociaż może przez parę ns są to same jedynki.
    Wtedy są szanse na to że przerwanie odczyta stan tego wyświetlacza którego chcemy odczytać.
  • Poziom 14  
    No fakt ten config był niepotrzebny tyle razy:d

    Tak ta tyle o 7442 sobie wygoolawałem:D
    Tylko własnei zastanawia mnie ta jedna rzecz o której pisałeś, bo rzeczywiście jak podałem sobie same jedynki to w kolejnym kroku przerwanie było inicjowane tylko teraz jak zachowuje sie normalny układ?
    Czy od razu zmienia stan an inny? Czy może najpierw wygasza przez jakis ta mmały ułamek sekund wszystkie wyświetlacze to mnie zastanawia?

    Cytat:
    po:
    Porta = &B11111111

    wystarczy chyba waitms 1

    Dałem sobie troszkę dłuższy czas żeby sprawdzic miernikiem co dzieje sie na przerwaniu

    Tak oczywiście cześtotliwośc pracy układu w ogrinalnym urządzeniu będe musiał sprawdzic to jest wiadoma sprawa

    Zastanawia mnie teraz jedna rzecz. Ale co będzie jak 7442 nie wygasza wszystkich wyświetlaczy przed zmianą na kolejny?
    Jak wtedy rozwiązać problem z odczytem? We wtorek muszę wybrąc siedo sklepu i sobie kupićten układzik może wtedy jakieś odpoweidz same sie nasuną
  • Pomocny post
    Poziom 34  
    Przyjrzałem się tej Twojej (znaczy - nie Twojej :)) płytce i wygląda mi, że podchodzisz do problemu od złej strony. Na tej płytce wyświetlaczy jest licznik 7493, który steruje multipleksowaniem (to widać nawet na tym niewyraźnym zdjęciu, które zamieściłeś).
    Zatem wystarczy tylko podać na wejście INT sygnał z wejścia zegarowego 7493 aby mieć stabilny punkt odniesienia. A czytać wejścia 7442 (czyli wyjścia 7493), a nie wyjścia - kod się znacznie uprości bo odczytasz bezpośrednio numer wyświetlacza.

    Prześledź połączenia na płytce wyświetlaczy, aby ustalić, które wejście zegarowe 7493 należy wykorzystać.

    PS. Obecnie przerwanie prawdopodobnie się nie pojawia, bo licznik podaje zmianę bezpośrednio na 7442 co oznacza, że zmiana stanu na jego wyjściach następuje zbyt szybko, aby atmega zdekodowała (synchronicznie) stan wysoki - ten może pojawiać się na nanosekundy, albo i wcale. To jest układ kombinacyjny, licznik asynchroniczny, i to, co się pojawia w stanach przejściowych jest, de facto, nieprzewidywalne (hazard).
  • Poziom 28  
    Odpowiedź na pytanie dotyczące działania układu jest bardzo prosta: diody tworzą funkcję AND, a licznik 7493 podając sekwencję na wyjściach ABCD nie robi między poszczególnymi wartościami żadnej przerwy, do tego czas propagacji bramek w 7442 i w rzeczywistości wędrujące zera logiczne na jego wyjściach "zachodzą" na siebie. Dlatego na wyściu nie pojawia się jedynka. Rozwiązaniem tego problemu może być zastosowanie na każdym wyjściu dekodera różniczkującego układu RC o stałej czasowej mniejszej od czasu trwania zera na wyjściu.
    Problem z odczytem danych z wyświetlacza sekwencyjnego
  • Poziom 34  
    adam_es napisał:
    Rozwiązaniem tego problemu może być zastosowanie na każdym wyjściu dekodera różniczkującego układu RC o stałej czasowej mniejszej od czasu trwania zera na wyjściu.

    Tylko po co tak komplikować sobie życie, jak wystarczy zrobić tak, jak napisałem powyżej i zsynchronizować się z licznikiem sterującym?

    P.S. rezystory to chyba trzeba by podłączyć do plusa aby to zadziałało
  • Pomocny post
    Poziom 38  
    Też tak sądzę.
    Tzn. rezystory do plusa.
    Problem w tym, że wyjścia z 7442 i 7447 są chyba wyprowadzone na złącze (Eltra lic. ITT Canon!) a 93 pewnie nie.
    Nie! tam chyba pod spodem są wyświetlacze!
    Obok 93 widać 123-z tantalem z Unitra-Elwa.
    To chyba robi za generator.
    To znaczy że w płytkę i tak trzeba wjechać lutownicą i doprowadzić kabelki do jakiegoś złącza.
    Wtedy brać sygnał dla przerwania z wejścia zegara 93
    i z wyjścia 93 odczytać który wyświetlacz(jak napisał szelus)
    Rozwiązanie z RC też może się sprawdzić, ale więcej kabelków.

    Dodano po 6 [minuty]:

    Jakie scalaki są przy złączu?
    Nie mogę odczytać.
    a, i tranzystory.BC211-na rynek krajowy, 2N2904?- dla RWPG.
    Jeszcze trochę i odtworzymy schemat tej płytki.

    Dodano po 1 [godziny] 37 [minuty]:

    Sprawdziłem czasy propagacji SN7442.
    L-H 15 ns.
    H-L 15 ns.
    Odczyt z wyjść 7442 bez szans.